![]() |
In Laufzeit generierte Buttons wieder freigeben
Ich erstelle während meine Applikation ausgeführt wird mehrere Buttons mit einer Prozedur, welche folgendermassen aufgebaut ist:
Delphi-Quellcode:
Nun besteht das Problem, dass nach dem schliessen und erneutem Aufrufen des Formulares mit den Buttons, alle Buttons wieder auftauchen, egal wo ich die Buttons freigebe.
procedure TForm1.Button(Sender: TObject);
begin Button := TButton.Create(Self); with Button do begin Name := ModulName; Caption := 'Options'; Parent := TForm1; Top := 40; Left := 400; Width := 50; Height := 25; end; end; Den einzelnen Buttons wird jeweils noch ein Bitmap zugeteil, welche beim Schliessen des Formulares alle brav den Speicher wieder freigeben. Nun bin ich ratlos wie denn diese Buttons fachgemäss wieder entfernt werden können. Gruss hirnstroem |
Re: In Laufzeit generierte Buttons wieder freigeben
Wie gibts du denn die Buttons bisher frei?
Am Besten fügst du alle Buttons in eine Liste ein, dann kannst du sie schnell und einfach wieder entfernen.
Delphi-Quellcode:
TFormX = [...]
private MyRuntimeButtons: TObjectList; [...] Button := TButton.Create(Self); MyRuntimeButtons.Add(Button); [...] FreeAndNil(MyRuntimeButtons); // gibt die Liste und alle darin enthaltenen Instanzen (wenn OwnsObjects = true) frei |
Re: In Laufzeit generierte Buttons wieder freigeben
Hi,
eine andere Möglichkeit wäre beim Erzeugen der Buttons die Eigenschaft Tag auf 1 zu setzen und beim Schließen/Verstecken des Formulars folgendes zu machen:
Delphi-Quellcode:
Chris
var
idx: integer; begin for idx:=0 to self.ComponentCount-1 do begin if (self.Components[idx] is TButton) {alternativ TComponent} and ((self.Components[idx] as TComponent).Tag = 1) then self.Components[idx].Free; end. end; end; |
Re: In Laufzeit generierte Buttons wieder freigeben
Wieso nicht einfach alle Buttons in einen Array of TButton geben und dann jedes Element des arrays per Free lösen?
|
Re: In Laufzeit generierte Buttons wieder freigeben
Hi,
naja... arrays sind böse. ;) Grundsätzlich. *g* Wenn schon dann eine Collection oder List (siehe oben) oder sowas. Allerdings muss dann jedes Element einzeln dort reingeschrieben werden und wieder richtig ausgelesen werden etc. Von daher halte ich das vorgegebene Array - TForm.Components - wesentlich... naja, einfacher. Auch wenn es jetzt vielleicht die übermäßig eleganteste Lösung ist. Chris |
Re: In Laufzeit generierte Buttons wieder freigeben
Wieso sind Arrays böse?? Was passt zB hier nicht:
Delphi-Quellcode:
Und nachher halt alles wieder mit Free auflösen...
...
Buttons: Array of TButton; ... begin for i := 0 to Length(Buttons) - 1 do begin Buttons[i] := TButton.Create(Self); with Buttons[i] do begin Parent := Self; ... end; end; end; |
Re: In Laufzeit generierte Buttons wieder freigeben
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
einfacher als
FreeAndNil(Buttons)
Delphi-Quellcode:
:wink:
idx: integer;
begin for idx:=0 to self.ComponentCount-1 do begin if (self.Components[idx] is TButton) {alternativ TComponent} and ((self.Components[idx] as TComponent).Tag = 1) then self.Components[idx].Free; end. end; end; [add] @faux: Solange die Anzahl der Buttons konstant ist (bzw. das Array nicht vergrößert/verkleinert werden muss), geht das IMHO schon in Ordnung. [/add] |
Re: In Laufzeit generierte Buttons wieder freigeben
Zitat:
Grüße Faux |
Re: In Laufzeit generierte Buttons wieder freigeben
Zitat:
:mrgreen: Ein Array immer um einen Eintrag zu vergrößern, ist ineffizient und speicherfressend. Man sollte es daher immer um einen höheren Wert vergrößern: ![]() Zitat:
|
Re: In Laufzeit generierte Buttons wieder freigeben
OK. Aber meistens weiß man im Vorhinein, wieviele Buttons man hat.. ;) Also reicht ein Statischer Array.. ;)
Grüße Faux |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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