![]() |
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 |
Hi XzibiT,
du kannst das mit TComponent.FindComponent() machen:
Delphi-Quellcode:
MfG,
type
TMyForm = class(TForm) // ... [b]private[/b] procedure DeletePanel(Name: String); end; // ... procedure TMyForm.DeletePanel(Name: String); begin TPanel(FindComponent('PU' + Name)).Free; end; d3g |
Moin XzibiT,
so wie Du das Panel erzeugst
Delphi-Quellcode:
brauchst Du Dich um die Freigabe des Panels nicht zu kümmern.
PanelUser := TPanel.Create(self);
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. |
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:
Zum löschen der vorher generieten Labels wollte ich folgendes verwenden :
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;
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! |
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.
|
AW: Dynamisch erzeugte Komponente wieder freigeben
also darauf einfach den Namen wegzulassen bin ich nicht gekommen :) Aber so funktionierts! danke!
|
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 01:06 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