Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Probleme beim freigeben von Komponenten (https://www.delphipraxis.net/149475-probleme-beim-freigeben-von-komponenten.html)

BBoy 22. Mär 2010 12:28


Probleme beim freigeben von Komponenten
 
Ich erzeuge zur Laufzeit komponenten

Delphi-Quellcode:
   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);
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:

Delphi-Quellcode:
  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;
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.

Weis jemand woran das liegt ?

DeddyH 22. Mär 2010 12:33

Re: Probleme beim freigeben von Komponenten
 
Zitat:

Delphi-Quellcode:
Rzstatuspane[i].ParentFont := True;
   Rzstatuspane[1].Name  := 'rzstatuspane'+inttostr(i);

Da steht einmal i und einmal 1. Überhaupt kommt mir das Vorgehen etwas merkwürdig vor. Wieso änderst Du nicht einfach die bestehenden Komponenten anstatt sie ständig freizugeben und neu zu erzeugen?

BBoy 22. Mär 2010 12:44

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:
for i := 1 to 40 do begin
try
rzstatuspane[i].Free;
rzstatuspane[i] := nil;
except
showmessage('test');
end;
end;

rzpanel73.Refresh;
form1.Refresh;
aber wenn ich dann versuche ein neues rzstatuspane zu erzeiugen wird gesagt das es schon vorhanden ist. also wurden die nicht gelöscht.

DeddyH 22. Mär 2010 13:17

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]

hoika 22. Mär 2010 13:25

Re: Probleme beim freigeben von Komponenten
 
Hallo,

irgendwie schmeißt du hier mehrere Sachen zusammen.

Delphi-Quellcode:
RzStatusPane[i] := TRzStatusPane.Create(self);
Self wird hier der Owner des neuen Panes.
Damit steht das in desses Components-Liste und wird
beim beenden des Self mit gelöscht.

Delphi-Quellcode:
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;
Und wieder ein Fall für as
Wozu soll das an dieser Stelle gut sein ?
Warum nimmst du keine lokale Variable ?

Delphi-Quellcode:
    rzstatuspane[i].Free;
    rzstatuspane[i] := nil;
OK, dein Statuspane ist gelöscht, aber es steht immer noch in der Components-Liste von Self drin.


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

Panthrax 22. Mär 2010 13:58

Re: Probleme beim freigeben von Komponenten
 
Zitat:

Zitat von hoika
Merde, zu langsam ;)

On ne dit pas « merde ». :stupid:

Hawkeye219 22. Mär 2010 14:20

Re: Probleme beim freigeben von Komponenten
 
Hallo,
Zitat:

Zitat von hoika
OK, dein Statuspane ist gelöscht, aber es steht immer noch in der Components-Liste von Self drin.

Nein, auch diese Referenzen wären entfernt worden, dafür sorgt die VCL. Da aber - wie du richtig angemerkt hast - das Panel nicht der Owner der Panes ist, liefert die Suchschleife kein Ergebnis, und die Free-Methode der Panes wird nicht aufgerufen.

Eine mögliche Lösung wäre die Verwendung der Klasse Delphi-Referenz durchsuchenTComponentList aus der Unit Contnrs. Wenn sie statt des Arrays verwendet wird, um die Referenzen zu speichern, genügt ein einziger Aufruf der Clear-Methode, um alle Panes zu entfernen.

Gruß Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:50 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