![]() |
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:
So, alles klappt soweit, die Buttons werden wie gewünscht erstellt, angezeigt und geändert.
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; 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; |
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:
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.
Btn:=TButton.Create(Form_Main);
|
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:
oder
**Btns[Count[color=#ff0000]-1[/color]].Btn.Free;
Btns[Count[color=#ff0000]-1[/color]].App:=''; Dec(Count); SetLength(Btns,Count);
Code:
:wink:
**[color=#008000]Dec(Count);[/color]
Btns[Count].Btn.Free; Btns[Count].App:=''; SetLength(Btns,Count); |
Re: Dynamisch erstellte Buttons wieder Freigeben
jheins hatte recht :wall:
|
Re: Dynamisch erstellte Buttons wieder Freigeben
Delphi-Quellcode:
Der Unterschied ist, das mit Form_Main die Buttons immer Form_Main gehoeren.
Btn := TButton.Create(Self);
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. |
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... |
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. |
Re: Dynamisch erstellte Buttons wieder Freigeben
oder man macht es so :
Delphi-Quellcode:
for i := 0 to Count do
TButton(FindComponent('Btn_'+IntToStr(i))); |
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 02:32 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