![]() |
Probleme beim freigeben von Komponenten
Ich erzeuge zur Laufzeit komponenten
Delphi-Quellcode:
Darauf stehen statusinformationen. Wenn diese Informationen sich ändern muss ich diese prozedur erneut aufrufen. Dabei werden aber neue RzStatuspanes erzeugt. um das zu verhindern mache ich folgendes:
RzStatusPane[i] := TRzStatusPane.Create(self);
RzStatusPane[i].Parent := rzpanel73; RzStatusPane[i].Left := LeftPos; RzStatusPane[i].Top := TopPos; RzStatusPane[i].Width := 125; Rzstatuspane[i].ParentFont := True; Rzstatuspane[1].Name := 'rzstatuspane'+inttostr(i); RzStatusPane[i].Caption:= Produkt+': '+produktanz; Inc(TopPos,22);
Delphi-Quellcode:
aber das funktioniert nicht. die statuspanes werden nicht gelöscht vom panel weil die schleife nicht ausgeführt wird. also wird die kommponente nicht gefunden.
for i := 1 to 40 do
if rzpanel73.FindComponent('rzstatuspane'+IntToStr(i)) as Trzstatuspane <> nil then begin rzstatuspane[i].Free; rzstatuspane[i] := nil; end; rzpanel73.Update; Weis jemand woran das liegt ? |
Re: Probleme beim freigeben von Komponenten
Zitat:
|
Re: Probleme beim freigeben von Komponenten
auch wenn ich die 1 in i ändere funktioniert das nicht.
Warum ich das so mache? Die anzahl der rzstatuspanes ändert sich bei jeder aktualisierung. mal sind es 10 mal 15 oder so. Daher dachte ich diese vorgehweise wäre angebracht. Habe es mal testhalber so probiert:
Delphi-Quellcode:
aber wenn ich dann versuche ein neues rzstatuspane zu erzeiugen wird gesagt das es schon vorhanden ist. also wurden die nicht gelöscht.
for i := 1 to 40 do begin
try rzstatuspane[i].Free; rzstatuspane[i] := nil; except showmessage('test'); end; end; rzpanel73.Refresh; form1.Refresh; |
Re: Probleme beim freigeben von Komponenten
Evtl. musst Du noch rzpanel73.RemoveComponent aufrufen, da die Komponenten wohl nicht automatisch aus dem Components-Array entfernt wreden.
[edit] Oder RemoveComponent des Owners, ich bin da gerade nicht ganz sicher. [/edit] |
Re: Probleme beim freigeben von Komponenten
Hallo,
irgendwie schmeißt du hier mehrere Sachen zusammen.
Delphi-Quellcode:
Self wird hier der Owner des neuen Panes.
RzStatusPane[i] := TRzStatusPane.Create(self);
Damit steht das in desses Components-Liste und wird beim beenden des Self mit gelöscht.
Delphi-Quellcode:
Und wieder ein Fall für as
for i := 1 to 40 do
begin if rzpanel73.FindComponent('rzstatuspane'+IntToStr(i)) as Trzstatuspane <> nil then begin rzstatuspane[i].Free; rzstatuspane[i] := nil; end; end; Wozu soll das an dieser Stelle gut sein ? Warum nimmst du keine lokale Variable ?
Delphi-Quellcode:
OK, dein Statuspane ist gelöscht, aber es steht immer noch in der Components-Liste von Self drin.
rzstatuspane[i].Free;
rzstatuspane[i] := nil; Ich würde hier das Löschen gleich ganz übernehmen (also auch im FormDestroy). Also mit NIL erzeugen
Delphi-Quellcode:
RzStatusPane[i] := TRzStatusPane.Create(NIL);
Update: Merde, zu langsam ;) Heiko |
Re: Probleme beim freigeben von Komponenten
Zitat:
|
Re: Probleme beim freigeben von Komponenten
Hallo,
Zitat:
Eine mögliche Lösung wäre die Verwendung der Klasse ![]() Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:40 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