AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wieso springt er in den Destruktor?

Ein Thema von schuetzejanett · begonnen am 24. Jan 2007 · letzter Beitrag vom 25. Jan 2007
Antwort Antwort
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#1

Wieso springt er in den Destruktor?

  Alt 24. Jan 2007, 16:11
Hallo, habe eine Klasse DartField die die eckpunkte eines dartFeldes und den dazugehörigen Namen speichert und eine Klasse dartBoard die die ganzen DartFelder in eine Liste speichert.
Da es insgesamt 82 Dartfelder gibt habe ich diese in eine typisierte Datei geschrieben um sie beim anlegen des Dartboardes auslzulesen. Wenn ich jetzt allerdings von einer anderen klasse aus ein Dartboardobjekt erzeuge, springt er bei der Zeile
        DField.Region := CreatePolygonRgn(Points,4,winding); ind den Destruktor der Klasse Dartboard anstatt die region anzulegen und zu speichern.
Warum? was mache ich falsch?

Delphi-Quellcode:
unit DartBoard;

interface

uses
  Classes, SysUtils, Dialogs, Windows, Contnrs;

type TPArray = Array [0..3] of TPoint;
      TField = packed record
        x1,y1,x2,y2,x3,y3,x4,y4 : integer;
        Name : String[4];
      end;

type TDartField = class(TObject)
  private
    FRegion: HRGN; // was auch immer das für ein Typ ist?
    FName: String;
  public
    property Region: HRGN read FRegion write FRegion;
    property Name: String read FName write FName;
  end;

type TDartBoard = class(TList)
  private
    procedure initBoard;
    function GetPArray( x1,y1,x2,y2,x3,y3,x4,y4: integer) : TPArray;
    function GetDartField(Index: Integer): TDartField;
  public
    constructor Create;
    destructor Destroy; override;
    procedure Add(Item: TDartField);
    function Next(AktField : Integer): TDartField;
    function IndexOf(Item: TDartField): Integer;
    property DartField[Index: Integer]: TDartField read GetDartField;
  end;

implementation

{ TDartBoard }

procedure TDartBoard.Add(Item: TDartField);
begin
  inherited Add(Item);
end;

constructor TDartBoard.Create;
begin
  inherited;
  initBoard;
end;

destructor TDartBoard.Destroy;
var
  i: Integer;
begin
  for i := 0 to self.Count - 1 do
    self.DartField[i].Free;
  inherited;
end;

function TDartBoard.GetDartField(Index: Integer): TDartField;
begin
   result := inherited Get(Index);
end;

function TDartBoard.GetPArray(x1, y1, x2, y2, x3, y3, x4,
  y4: integer): TPArray;
begin
  result[0] := Point(x1,y1);
  result[1] := Point(x2,y2);
  result[2] := Point(x3,y3);
  result[3] := Point(x4,y4);
end;

function TDartBoard.IndexOf(Item: TDartField): Integer;
begin
  result := inherited IndexOf(Item);
end;

procedure TDartBoard.initBoard;
var DField : TDartField;
    Points : TPArray;
    datei : file of TField;
    field : TField;
    i, Anz : integer;
begin
  AssignFile(datei,'Fields.dat');
  if FileExists('Fields.dat') then
    ReSet(datei)
  else ShowMessage('Datei für Dartboard nicht gefunden');
  For i := 0 to (FileSize(datei)-1) do
    begin
      seek(datei, i);
      Read(datei, field);
      Points := getPArray(field.x1, field.y1, field.x2, field.y2, field.x3,
                            field.y3, field.x4, field.y4);
      DField.Region := CreatePolygonRgn(Points,4,winding); //hier springt er in den Destruktor;
      DField.Name := field.Name;
      self.Add(DField);
    end;
  showmessage( inttostr(self.Count));
  CloseFile(datei);
end;

function TDartBoard.Next(AktField: Integer): TDartField;
begin
  if AktField = self.Count - 1 then
    result := self.Get(0)
  else
    result := self.Get(AktField + 1);
end;
end.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Wieso springt er in den Destruktor?

  Alt 24. Jan 2007, 16:15
in den destructor wird gesprungen wenn innerhalb des constructors ein Fehler auftritt. Da du innerhalb des Constructors InitBoard aufrust wird also der destructor aufgerufen wenn es innerhalb von InitBoard knallt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Wieso springt er in den Destruktor?

  Alt 24. Jan 2007, 16:15
Hi,

fehlt da nicht sowas?

DField := TDartField.Create;
Gruß
Norman
  Mit Zitat antworten Zitat
schuetzejanett

Registriert seit: 5. Apr 2006
Ort: Fraureuth
62 Beiträge
 
#4

Re: Wieso springt er in den Destruktor?

  Alt 24. Jan 2007, 16:16
Ja genau das wars, jetzt funktionierts danke für eure schnelle Hilfe;
  Mit Zitat antworten Zitat
Benutzerbild von Sunlight7
Sunlight7

Registriert seit: 17. Sep 2006
Ort: Sonnensystem, Zentral
1.522 Beiträge
 
Delphi 5 Standard
 
#5

Re: Wieso springt er in den Destruktor?

  Alt 24. Jan 2007, 23:20
Moin!

Zitat von schuetzejanett:
FRegion: HRGN; // was auch immer das für ein Typ ist?
Ein einfaches Handle zu einer Region
Windows: Ja - Microsoft: Nein -> www.ReactOS.org
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Wieso springt er in den Destruktor?

  Alt 25. Jan 2007, 09:12
Hallo,

mir ist noch aufgefallen, dass Du ein Speicherleck hast, weil Du die Regions nicht mehr freigibst.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Wieso springt er in den Destruktor?

  Alt 25. Jan 2007, 10:30
Zitat von xaromz:
Hallo,

mir ist noch aufgefallen, dass Du ein Speicherleck hast, weil Du die Regions nicht mehr freigibst.

Gruß
xaromz
Das dachte ich auch mal. Die Hilfe und andere Forenuser haben mich dann eines besseren belehrt und meinten das man Regions einfach nicht frei geben darf/soll/muss wenn man sie einem Object zuweist.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: Wieso springt er in den Destruktor?

  Alt 25. Jan 2007, 11:30
Hallo,
Zitat von SirThornberry:
Das dachte ich auch mal. Die Hilfe und andere Forenuser haben mich dann eines besseren belehrt und meinten das man Regions einfach nicht frei geben darf/soll/muss wenn man sie einem Object zuweist.
das ist so leider falsch. Wenn Du z. B. einem Window eine Region übergibst, dann verwaltet das Window diese. Wenn Du jedoch einfach eine Region erzeugst, und diese nur in einem Delphi-Objekt speicherst, dann musst Du sie auch wieder freigeben.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz