![]() |
Dispose auf Objects einer TCheckListBox
Hallo,
und wieder eine Sache, bei der ich nicht weiterkomme und auch keine wirkliche Hilfe im Netz gefunden habe. Ich verwende eine TCheckListBox und hänge an die Einträge noch Daten. Hier die Funktion, die die Checklistbox füllt. Die Daten dazu stammen aus einer abgeleiteten TList Klasse namens ASList:
Delphi-Quellcode:
Funktioniert wunderbar. Die Daten werden angelegt und in der Liste verankert.
procedure TASManForm.FillASListBox(ASList: TTC7AutoStart; FilterSet: TListFilter);
var i: integer; ASStruc: TTC7AutoStartStruc; ASPointer: PTTC7AutoStartStruc; begin DisposeList(ListBox_AS); //<- hier kracht es beim zweiten Durchlauf, Procedure ist unten gelistet ListBox_AS.Clear; if ASList.Count>0 then begin ListBox_AS.Items.BeginUpdate; for i:=0 to ASList.Count-1 do begin ASPointer := ASList[i]; ASStruc := ASPointer^; if ASStruc.AutoStartDangerLevel in FilterSet then begin ListBox_AS.Items.AddObject(ASStruc.FileData.FileName, TObject(ASPointer)); end; end; ListBox_AS.Items.EndUpdate; end; end; Hier ist meine bisherige DisposeList Procedure:
Delphi-Quellcode:
Ich hab es schon mit verschiedenen Typecasts (TObject, PTTC7AutoStartStruc) probiert, keine Chance.
//TCheckListBox
procedure DisposeList(List: TCheckListBox); var c: integer; i: integer; ASPointer: PTTC7AutoStartStruc; begin c := List.Items.Count; if c>0 then begin for i:=0 to c-1 do begin if Assigned(List.Items.Objects[i]) then begin // ASPointer := PTTC7AutoStartStruc(List.Items.Objects[i]); Dispose(PTTC7AutoStartStruc(List.Items.Objects[i])); //<- hier kracht es end; end; end; end; Habt ihr eine Ahnung, wo ich noch einen Denkfehler habe? Laut Debugger ist jeder Pointer assigned und ich kann auch noch die Daten auslesen, bis zum Dispose. Führe ich dann die Disposezeile auf gibts eine schicke EInvalidPointer Exception :( |
Re: Dispose auf Objects einer TCheckListBox
Willst du deine Daten nicht lieber in ein Objekt packen?
In diesem Fall sieht das freigeben so aus:
Delphi-Quellcode:
In deiner procedure DisposeList hast du übrigens vergessen, die Objekt-Zeiger auf nil zu setzen.
procedure TStringsFreeObjects(sl: TStrings);
var i: Integer; o: TObject; begin for i := sl.Count-1 downto 0 do begin o := sl.Objects[i]; if Assigned(o) then begin o.Free; sl.Objects[i] := nil; // merken, dass Objekt freigegeben wurde end; end; end; ... TStringsFreeObjects(CheckListBox1.Items); Dadurch besteht eine Chance, dass du die Daten nochmals freigibst. |
Re: Dispose auf Objects einer TCheckListBox
OK, das mit dem nil hab ich noch hinzugefügt. Geht dennoch nicht.
Gibt es noch andere Lösungsmöglichkeiten? Die Einträge in Objekte zu verwandeln stelle ich mir recht schwierig vor. Edith hat mich da auf was aufmerksam gemacht... Ich Depp hab vergessen, beim Füllen der Objektliste ein New einzubauen, da kanner natürlich nur wenig disposen...:( Danke an alle, das Problem ist gelöst und ich kann wieder ruhig schlafen :) |
Re: Dispose auf Objects einer TCheckListBox
1. Du gibst Elemente mit Dispose() frei, aber ich sehe nirgendwo eine Codestelle wo du dazu auch das Gegenstück ausführst, also New() vor dem hinzufügen
2. Ich sehe bisher nur, dass du die Zeiger aus einer anderen Liste nimmst und mit in die Objects[] Eigenschaft legst. Wenn du dann diese Zeiger freigibst, dann zeigt die andere Liste genauso ins Datennirwana. |
Re: Dispose auf Objects einer TCheckListBox
Wie gesagt ist das Problem tatsächlich ein fehlendes New() gewesen.
Mich würde dennoch interessieren, wieso die Daten trotzdem "accessible" waren und ausgelesen wurden, obwohl das New() fehlte. Die neue Proc sieht nun so aus:
Delphi-Quellcode:
procedure TASManForm.FillASListBox(ASList: TTC7AutoStart; FilterSet: TListFilter);
var i: integer; ASStruc: TTC7AutoStartStruc; ASPointer: PTTC7AutoStartStruc; begin DisposeList(ListBox_AS); ListBox_AS.Clear; if ASList.Count>0 then begin ListBox_AS.Items.BeginUpdate; for i:=0 to ASList.Count-1 do begin New(ASPointer); //<- hrhr ASPointer := ASList[i]; ASStruc := ASPointer^; if ASStruc.AutoStartDangerLevel in FilterSet then begin ListBox_AS.Items.AddObject(ASStruc.FileData.FileName, TObject(ASPointer)); end; end; ListBox_AS.Items.EndUpdate; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:53 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