AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi In Laufzeit generierte Buttons wieder freigeben
Thema durchsuchen
Ansicht
Themen-Optionen

In Laufzeit generierte Buttons wieder freigeben

Ein Thema von hirnstroem · begonnen am 21. Sep 2005 · letzter Beitrag vom 23. Sep 2005
Antwort Antwort
Seite 1 von 2  1 2      
hirnstroem

Registriert seit: 21. Sep 2005
297 Beiträge
 
Delphi 2006 Professional
 
#1

In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 15:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#2

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 15:15
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
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 17:19
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
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 17:25
Wieso nicht einfach alle Buttons in einen Array of TButton geben und dann jedes Element des arrays per Free lösen?
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
CalganX

Registriert seit: 21. Jul 2002
Ort: Bonn
5.403 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 17:32
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
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 17:40
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...
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 17:55
Zitat von Chakotay1308:
naja... arrays sind böse. Grundsätzlich. *g*
Och, statische sind oft ganz nützlich .
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 .
Zitat:
und wieder richtig ausgelesen werden etc.
Das musst du mir erklären *g* . Ich finde jedenfalls 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;


[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]
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 17:59
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
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 18:23
Zitat von faux:
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?
.

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 von Robert_G:
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 .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Benutzerbild von faux
faux

Registriert seit: 18. Apr 2004
Ort: Linz
2.044 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: In Laufzeit generierte Buttons wieder freigeben

  Alt 21. Sep 2005, 18:34
OK. Aber meistens weiß man im Vorhinein, wieviele Buttons man hat.. Also reicht ein Statischer Array..

Grüße
Faux
Faux Manuel
Wer weiß, dass er nichts weiß, weiß mehr, als der der nicht weiß, dass er nichts weiß.
GoTrillian
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:11 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