![]() |
TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperation
Hi,
ich hab eine von TObjectList abgeleitete Klasse, in der ich die procedure Clear übernommen habe, wenn ich nun - um ein neues "Dokument" zu öffnen - MeineListe.Clear schreibe, so funktioniert dies das erste mal super, wenn ich dann wieder etwas in das "Dokument" schreibe und erneut MeieListe.Clear ausführe kommt eine Fehlermeldung vom Typ "ungültige Zeigeroperation". Was ist das denn für eine Logik? Beim erste mal klappts und danach nicht mehr?! Was kann ich den dagegen tun, bzw. ist jemandem dieses Problem bekannt? grüße guitar1 |
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Was genau hast du denn überschrieben? Zeig uns am Besten den gesamten Code der Klasse.
|
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Delphi-Quellcode:
so schaut das aus, ich habs an Hand eines Beispiels gemacht wie ich es hier in der DP gesehn hatte.
TTermteilList = class(TObject)
private FItems: TObjectList; function GetItem(const Index: Integer): TTermteil; public constructor Create(const OwnsObjects: Boolean = true); destructor Destroy; override; function Add(const ATermTeil: TTermteil): Integer; function Count:Integer; procedure Delete(Index: Integer); procedure Insert(Index: Integer; ATermTeil: TTermteil); procedure Clear; property Items[const Index: Integer]: TTermTeil read GetItem; default; end; implementation // ----- PRIVATE ----- function TTermteilList.GetItem(const Index: Integer): TTermteil; begin result:= TTermteil(FItems[Index]); end; // ----- PUBLIC ----- constructor TTermteilList.Create(const OwnsObjects: Boolean = True); begin inherited Create; FItems:= TObjectList.Create(OwnsObjects); end; destructor TTermteilList.Destroy; begin FItems.Free; inherited Destroy; end; function TTermteilList.Add(const ATermTeil: TTermteil): Integer; begin TTermteil(FItems.Add(ATermTeil)); end; function TTermteilList.Count:Integer; begin result:= FItems.Count; end; procedure TTermteilList.Delete(Index: Integer); begin FItems.Delete(Index); end; procedure TTermteilList.Insert(Index: Integer; ATermTeil: TTermteil); begin FItems.Insert(Index, TTermteil(ATermTeil)); end; procedure TTermteilList.Clear; begin FItems.Clear; end; |
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Delphi-Quellcode:
mal verbessern und schauen, was passiert!
function TTermteilList.Add(const ATermTeil: TTermteil): Integer;
begin Result := FItems.Add(ATermTeil); end; procedure TTermteilList.Insert(Index: Integer; ATermTeil: TTermteil); begin FItems.Insert(Index, ATermTeil); end; |
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
okay, ich hab das jetzt geändert und alles läuft noch xD, aber an meinem ursprünglichen Problem hat das leider nichts geändert :? ?! Aber danke für die Korrektur!
|
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Die beiden Typecasts sind irrelevant, aber die Warnung der Add Methode hättest du auch selber ausmerzen können, schliesslich weist dich der Compiler darauf hin (Rückgabewert könnte undefiniert sein).
Ich vermute eher ein Problem, dass du die Objekte die du ablegst (die TTermteil Instanzen) noch irgendwo anders hälst und nicht daran denkst, dass alle Instanzen freigegeben werden bei einem Clear (aussern du hast im Create deiner Klasse explizit false angegeben. |
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Der Fehler konnte auch nicht daran liegen, ev. hätte das Result von Add gesponnen. Meine Glaskugel sagt mir, Indexfehler in dynamischen Arraysm der sich dann auf diese Klasse auswirkt.
|
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Also wenn ich "OwnsObjects: Boolean = false" nehme dann gehts :-D , aber ich habe irgentwo mal gehört das sollte man besser nicht tun da dann der Speicher nicht mehr richtig freigegeben wird?!
edit2: das 1. edit wieder löschen weils dumm war :wall: :lol: |
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
Zitat:
Wie der Name nahelegt sollte man OwnsObjects nicht verwenden wenn die Einträge in der List irgendwo anders speichertechnisch verwaltet werden und dann dort freigegeben werden. |
Re: TObjectList.Clear, beim 2. Aufruf ungültige Zeigeroperat
AHA okay, ich hab als parent immer TForm, dann hat sich das ja auch erledigt :-D
Vielen Dank an alle!! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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-2025 by Thomas Breitkreuz