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 Dynamisch erzeugte Komponente wieder freigeben (https://www.delphipraxis.net/1820-dynamisch-erzeugte-komponente-wieder-freigeben.html)

XzibiT 26. Dez 2002 09:02


Dynamisch erzeugte Komponente wieder freigeben
 
Morgen

habe 2 Funktionen

die erste: [erzeugt eine Komponente ] [ dieser funktion wird der name übergeben ]
var
PanelUser : TPanel;
...

// PANEL USER
PanelUser := TPanel.Create(self);
PanelUser.Parent := chan;
PanelUser.Width := 137;
PanelUser.Align := alRight;
PanelUser.BevelOuter := bvNone;
PanelUser.Name := 'PU'+Name;


die 2. Funktion [ soll diese Komponente nun löschen ]
[übergeben wird auch der name ]
var
PanelUser : TPanel;
...

nur hier scheiterts ...

folgendes habe ich mir gedacht .. zuerst der variablen PanelUser sagen wie die zu löschende Componente heisst

PanelUser := 'PU'+Name;
und dann mit free löschen ... nur funktioniert das alles nicht so wie ich mir das denke

thX XzibiT

d3g 26. Dez 2002 11:53

Hi XzibiT,

du kannst das mit TComponent.FindComponent() machen:

Delphi-Quellcode:
type
  TMyForm = class(TForm)
  // ...
  [b]private[/b]
    procedure DeletePanel(Name: String);
end;

// ...

procedure TMyForm.DeletePanel(Name: String);
begin
  TPanel(FindComponent('PU' + Name)).Free;
end;
MfG,
d3g

Christian Seehase 27. Dez 2002 03:08

Moin XzibiT,

so wie Du das Panel erzeugst

Delphi-Quellcode:
PanelUser := TPanel.Create(self);
brauchst Du Dich um die Freigabe des Panels nicht zu kümmern.

Dies geschieht automatisch wenn die mit self referenzierte Komponente zerstört wird, was ja vermutlich ein Formular ist.

Hättest Du statt self nil genommen, sähe das aber anders aus.

decibel666 17. Dez 2014 14:34

AW: Dynamisch erzeugte Komponente wieder freigeben
 
Hallo!

Habe da ein ähnliches Problem :

Ich erzeuge dynamisch eine Anzahl von TLabels. Will die dann wieder komplett löschen und beim nächsten Durchlauf der Proztedur wieder neu erzeugen .

die Code ist Folgender :

Code:
  For k:=1 TO 4 DO BEGIN

   labeltest[k] := TLabel.Create(self);

           with labeltest[k] do
           begin

             name:='labeltest'+inttostr(k);
             caption:='ich bin label nummer :'+inttostr(k);
             Parent := self;
             AutoSize := true;
             font.style := [fsUnderline];
             cursor := crHandPoint;
             left:=254;
             top := 700+(10*k);

           end;
  end;
Zum löschen der vorher generieten Labels wollte ich folgendes verwenden :

Code:
  For k:=1 TO 4 DO BEGIN
     labeltest[k].Free;
     labeltest[k] := NIL;
  END;

Die existierenden Labels werden aber scheinbar nicht gelöscht weil beim 2.Durchlauf kommt die Fehlermeldung das die Komponente mit der Bezeinhnung labeltest1 (Das erste erzeugte Label) bereits existiert !

villiecht hat ja jemand einen Tipp was ich falsch mache !

vielen Dank!

DeddyH 17. Dez 2014 14:47

AW: Dynamisch erzeugte Komponente wieder freigeben
 
Wenn Du die Labels eh über das Array/die Liste ansprichst, musst Du auch keine Namen vergeben. Wenn Du das aber trotzdem machen willst/musst, solltest Du auch IIRC je zu löschendem Label RemoveComponent aufrufen.

decibel666 17. Dez 2014 14:56

AW: Dynamisch erzeugte Komponente wieder freigeben
 
also darauf einfach den Namen wegzulassen bin ich nicht gekommen :) Aber so funktionierts! danke!

himitsu 17. Dez 2014 16:40

AW: Dynamisch erzeugte Komponente wieder freigeben
 
RemoveComponent wird von TComponents automatisch aufgerufen, wenn man sie löscht, egal ob sie einen Namen haben, oder nicht.
RemoveComponent entfernt die Komponente aus der Child-Liste des eigenen Owners.

Und Free gibt eine Komponente definitiv frei. (wenn sie in dem Array drin steht)

Daß die Fehlermeldung ohne Namen nicht kommt liegt bestimmt nicht daran, daß die alten Komponenten nicht mehr da sind, sondern daß es nun keine Namens-Prüfung mehr gibt. :roll:



Was ist labeltest und wo ist das definiert?
Und wo/wann werden die Komponenten erstellt/freigegeben.


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