![]() |
Re: Free eines unbekannten Objektes
Zitat:
|
Re: Free eines unbekannten Objektes
ja aber selbst als ich das hier verwendet habe:
Delphi-Quellcode:
aber da fällt mir ein:
For i := 0 To Objects.Count - 1 Do
begin T3DObj(Objects[i]).Free; Objects[i] := nil; end; Man muss bedenken Objects[i] ist nicht WorldActor aber hat den gleichen wert |
Re: Free eines unbekannten Objektes
Ma ne frage zur TObjectList:
Der gibt mit ObjectList.Items[X] ein TObject zurück. Muss ich das einfach casten? |
Re: Free eines unbekannten Objektes
Sicher.
|
Re: Free eines unbekannten Objektes
Hallo!
Dies funktioniert, wie schon geschrieben, nicht.
Delphi-Quellcode:
Ich habe es bisher fast immer vermeiden können in Delphi mit Pointern zu arbeiten und muss daher i.d.R. immer erst probieren, wann eine Pointer Dereferenzierung mittel ^ nötig ist und wann nicht.
TKlasse1(list[i]^).Free;
Ich habe hier mal ein paar Möglichkeiten runtergetippt.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Contnrs, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; TKlasse1 = class(TObject) public constructor Create; destructor Destroy; override; end; TKlasse2 = class(TKlasse1) public constructor Create; destructor Destroy; override; end; TKlasse3 = class(TKlasse2) public constructor Create; destructor Destroy; override; end; var Form1: TForm1; implementation {$R *.dfm} const MAX_OBJ = 5; procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; list: TList; begin list := nil; try list := TList.Create; for i := 0 to Pred(MAX_OBJ) do begin case Random(3) of 0: list.Add(TKlasse1.Create); 1: list.Add(TKlasse2.Create); 2: list.Add(TKlasse3.Create); end; end; // ... for i := 0 to Pred(list.Count) do TKlasse1(list[i]).Free; //(list[i] as TKlasse1).Free; // Operator ist auf diesen Operandentyp nicht anwendbar //(TObject(list[i]) as TKlasse1).Free; // :-) MessageDlg('Fertig mit Free', mtInformation, [mbOk], 0); finally FreeAndNil(list); end; end; procedure TForm1.Button2Click(Sender: TObject); var i: Integer; list: TObjectList; begin list := nil; try list := TObjectList.Create; for i := 0 to Pred(MAX_OBJ) do begin case Random(3) of 0: list.Add(TKlasse1.Create); 1: list.Add(TKlasse2.Create); 2: list.Add(TKlasse3.Create); end; end; // ... for i := 0 to Pred(list.Count) do TKlasse1(list[i]).Free; // Hier sind beide Varianten möglich // (list[i] as TKlasse1).Free; MessageDlg('Fertig mit Free', mtInformation, [mbOk], 0); finally // Hier knallt es, weil durch OwnsObjects = True der Destruktor der Liste // versucht die schon freigegebenen Objekte noch einmal freizugeben FreeAndNil(list); end; end; procedure TForm1.Button3Click(Sender: TObject); var i: Integer; list: TObjectList; begin list := nil; try list := TObjectList.Create; list.OwnsObjects := False; for i := 0 to Pred(MAX_OBJ) do begin case Random(3) of 0: list.Add(TKlasse1.Create); 1: list.Add(TKlasse2.Create); 2: list.Add(TKlasse3.Create); end; end; // ... for i := 0 to Pred(list.Count) do TKlasse1(list[i]).Free; // Hier sind beide Varianten möglich // (list[i] as TKlasse1).Free; MessageDlg('Fertig mit Free', mtInformation, [mbOk], 0); finally FreeAndNil(list); end; end; procedure TForm1.Button4Click(Sender: TObject); var i: Integer; list: TObjectList; begin list := nil; try list := TObjectList.Create; for i := 0 to Pred(MAX_OBJ) do begin case Random(3) of 0: list.Add(TKlasse1.Create); 1: list.Add(TKlasse2.Create); 2: list.Add(TKlasse3.Create); end; end; // ... finally FreeAndNil(list); end; end; { TKlasse1 } constructor TKlasse1.Create; begin inherited Create; end; destructor TKlasse1.Destroy; begin MessageDlg('Destruktor Klasse 1', mtInformation, [mbOk], 0); inherited Destroy; end; { TKlasse2 } constructor TKlasse2.Create; begin inherited Create; end; destructor TKlasse2.Destroy; begin MessageDlg('Destruktor Klasse 2', mtInformation, [mbOk], 0); inherited Destroy; end; { TKlasse3 } constructor TKlasse3.Create; begin inherited Create; end; destructor TKlasse3.Destroy; begin MessageDlg('Destruktor Klasse 3', mtInformation, [mbOk], 0); inherited Destroy; end; end. |
Re: Free eines unbekannten Objektes
Zitat:
|
Re: Free eines unbekannten Objektes
Vielleicht hab ich Deine Antwort überlesen, aber warum stellst Du nicht auf TObjectList um? Mit der Property OwnsObjects auf True gibt die automatisch alle angehängten Objekte selber frei sobald sie freigegeben wird.
Sherlock |
Re: Free eines unbekannten Objektes
Ja das freigeben war ja nicht so richtig das Problem, wie sich herausgestellt hat.
Ich verwende jetzt eine TObjectList, und das Problem habe ich so gelöst:
Delphi-Quellcode:
Anstatt
If BEngine.Objects.IndexOf(WorldActor) >= 0 Then
BEngine.Objects.Delete(BEngine.Objects.IndexOf(WorldActor));
Delphi-Quellcode:
Vielen dank für eure hilfe!
If T3DObj(WorldActor) <> nil then T3DBlock(WorldActor).free;
Und vor allem an Sirius, für die Hilfe bei meinem letzten Problem ^^ Das Ergebnis meiner Arbeit kann jetzt ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz