Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Dynamisch erstellte Buttons wieder Freigeben (https://www.delphipraxis.net/46099-dynamisch-erstellte-buttons-wieder-freigeben.html)

glkgereon 18. Mai 2005 14:10


Dynamisch erstellte Buttons wieder Freigeben
 
Hi

ich erstelle ein paar Buttons Dynamisch.
erst mal was code:
Delphi-Quellcode:
  TBtn = record
    Btn: TButton;
    App: String;
  end;

  TForm_Main = class(TForm)
  public
    Btns: array of TBtn;
    Count: Integer;
    procedure AddBtn(Cap, App: String);
    procedure ChangeBtn(Index: Integer; Cap, App: String);
    procedure DelLastBtn;
  end;
Delphi-Quellcode:
procedure TForm_Main.AddBtn(Cap, App: String);
begin
  Inc(Count);
  SetLength(Btns,Count);
  with Btns[Count-1] do
    begin
    Btn:=TButton.Create(Form_Main);
    Btn.Name:='Btn_'+IntToStr(Count);
    Btn.Caption:=Cap;
    Btn.Parent:=Form_Main.Grp_Prog;
    Btn.Show;
    Btn.Left:=8;
    Btn.Height:=25;
    Btn.Width:=122;
    Btn.Top:=24+(Count-1)*33;
    Btn.Tag:=Count;
    Btn.OnClick:=BtnClick;
    end;
end;

procedure TForm_Main.ChangeBtn(Index: Integer; Cap, App: String);
begin
  if Index<Count then
    begin
    if Cap<>'Same' then Btns[Index].Btn.Caption:=Cap;
    if App<>'Same' then Btns[Index].App:=App;
    end;
end;

procedure TForm_Main.DelLastBtn;
begin
  Btns[Count].Btn.Free; //<-- Fehler!!!
  Btns[Count].App:='';
  Dec(Count);
  SetLength(Btns,Count);
end;
So, alles klappt soweit, die Buttons werden wie gewünscht erstellt, angezeigt und geändert.
nun klappt aber das löschen nicht.

muss ich irgendwie den button in der groupbox wieder austragen?

Edit: Achso, folgendes funzt:

Delphi-Quellcode:
procedure TForm_Main.FormClose(Sender: TObject; var Action: TCloseAction);
var i:Integer;
begin
  for i:=0 to Count-1 do Btns[i].Btn.Free;
  SetLength(Btns,0);
end;

Bernhard Geyer 18. Mai 2005 14:13

Re: Dynamisch erstellte Buttons wieder Freigeben
 
Wenn du die Freigabe eh nur beim beenden des Formulars durchführen willst, brauchst Du nichts zu machen.
Durch
Delphi-Quellcode:
Btn:=TButton.Create(Form_Main);
teilse Du dem Button mit das Form_Main sein Owner ist und dieser trägt sich in die Verwaltungsliste von Form_Main ein. Damit kann Form_Main die Freigabe selbständig durchführen.

jfheins 18. Mai 2005 14:36

Re: Dynamisch erstellte Buttons wieder Freigeben
 
In der Annahme, dass der Fehler eine AV ist,

könnte es sein, dass du über die Arraygrenzen hinausgehtst ?

Richtig wäre dann also das
Code:
**Btns[Count[color=#ff0000]-1[/color]].Btn.Free;
  Btns[Count[color=#ff0000]-1[/color]].App:='';
  Dec(Count);
  SetLength(Btns,Count);
oder
Code:
**[color=#008000]Dec(Count);[/color]
  Btns[Count].Btn.Free;
  Btns[Count].App:='';
  SetLength(Btns,Count);
:wink:

glkgereon 18. Mai 2005 14:48

Re: Dynamisch erstellte Buttons wieder Freigeben
 
jheins hatte recht :wall:

Robert Marquardt 18. Mai 2005 17:16

Re: Dynamisch erstellte Buttons wieder Freigeben
 
Delphi-Quellcode:
Btn := TButton.Create(Self);
Der Unterschied ist, das mit Form_Main die Buttons immer Form_Main gehoeren.
Sollte man einmal eine zweite Form dieser Klasse erstellen, dann wuerden deren Buttons auch Form_Main gehoeren
und nicht der neuen Form. Das kann boese Fehler nach sich ziehen.

glkgereon 18. Mai 2005 17:31

Re: Dynamisch erstellte Buttons wieder Freigeben
 
ja, schon klar, nur das wird (bei diesem Projekt) NIE passieren.

es geht darum das ich per button andere anwendungen starten will, aber halt nicht weiss wieviele der user haben will.
die Form brauche ich aber nur einmal...

Robert Marquardt 18. Mai 2005 19:14

Re: Dynamisch erstellte Buttons wieder Freigeben
 
Man sollte es sich trotzdem angewoehnen. Es hilft, besonders wenn man weiss was es bedeutet.
Ich sage das ja hier auch fuer alle die diesen Thread lesen.

Coly 20. Mai 2005 12:17

Re: Dynamisch erstellte Buttons wieder Freigeben
 
oder man macht es so :

Delphi-Quellcode:
for i := 0 to Count do
  TButton(FindComponent('Btn_'+IntToStr(i)));

Robert Marquardt 20. Mai 2005 12:58

Re: Dynamisch erstellte Buttons wieder Freigeben
 
Erstens wuerde ich jetzt mal wetten das es "Count - 1" heissen muss und zweitens kann man nicht immer die Buttons in der IDE anlegen.
Manchmal weiss man erst zur Laufzeit wieviel Buttons es werden sollen.


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