Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi In Laufzeit generierte Buttons wieder freigeben (https://www.delphipraxis.net/53698-laufzeit-generierte-buttons-wieder-freigeben.html)

hirnstroem 21. Sep 2005 15:06


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

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

Khabarakh 21. Sep 2005 15:15

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

CalganX 21. Sep 2005 17:19

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:
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;
Chris

faux 21. Sep 2005 17:25

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?

CalganX 21. Sep 2005 17:32

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

faux 21. Sep 2005 17:40

Re: In Laufzeit generierte Buttons wieder freigeben
 
Wieso sind Arrays böse?? Was passt zB hier nicht:

Delphi-Quellcode:
...
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;
Und nachher halt alles wieder mit Free auflösen...

Khabarakh 21. Sep 2005 17:55

Re: In Laufzeit generierte Buttons wieder freigeben
 
Zitat:

Zitat von Chakotay1308
naja... arrays sind böse. ;) Grundsätzlich. *g*

Och, statische sind oft ganz nützlich :wink: .
Zitat:

Allerdings muss dann jedes Element einzeln dort reingeschrieben werden
Wenn man sowieso die ganzen Properties der Buttons setzen muss, wird man sich an einer Zeile mehr schon nicht überarbeiten :zwinker: .
Zitat:

und wieder richtig ausgelesen werden etc.
Das musst du mir erklären *g* . Ich finde jedenfalls
Delphi-Quellcode:
FreeAndNil(Buttons)
einfacher als
Delphi-Quellcode:
  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;
:wink:

[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]

faux 21. Sep 2005 17:59

Re: In Laufzeit generierte Buttons wieder freigeben
 
Zitat:

Zitat von Khabarakh
[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]

Dass es nicht verkleinert werden darf,ohne Free und nicht vergrößert ohne Create ist mir klar. Aber wenn man das so machen würde (also mit Free und Create bei Gräßenänderung), dann würde das doch OK, sein, oder?

Grüße
Faux

Khabarakh 21. Sep 2005 18:23

Re: In Laufzeit generierte Buttons wieder freigeben
 
Zitat:

Zitat von faux
Zitat:

Zitat von Khabarakh
[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]

Dass es nicht verkleinert werden darf,ohne Free und nicht vergrößert ohne Create ist mir klar. Aber wenn man das so machen würde (also mit Free und Create bei Gräßenänderung), dann würde das doch OK, sein, oder?

Nö :P .
: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:
http://www.delphipraxis.net/internal...=381090#381090
Zitat:

Zitat von Robert_G
Zitat:

Zitat von leddl
@malo:
Bei ner Add-Methode mußt du einfach nur an das Array ein neues Element anhängen...

Genau DAS sollte man nicht machen. ;)
Wenn es eine array-basierte Liste sein soll sollte man sie stufenweise vergrößern. ;)
Eine Vergrößerung auf 172% der alten Größe hat sich als bester Allroundwert gezeigt. Bei kleinen Datenmengen wäre es möglich den ersten Sprung relativ großzügig ausfallen zu lassen, dadurch würde man sich vielleicht kleine weitere Kopiererei antun müssen.

Bevor man sich aber die ganze Arbeit macht, ist man mit TList doch besser bedinet :mrgreen: .

faux 21. Sep 2005 18:34

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 19:07 Uhr.
Seite 1 von 2  1 2      

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