![]() |
Button Selbstzerstörung
Hallo!
Habe folgende Aufgabenstellung: a) Erstelle dynamische Buttons auf einem Layout b) Beim Klick auf einen der neu generieren Buttons führe Schritt a) aus Klar ist, das ich beim Freigeben auch den aktuell geklickten Button zerstören muss -> Exception -> logisch Wie kann man das "umschiffen"?
Delphi-Quellcode:
type barray = Array of TButton;
var btns: barray; procedure TForm1.abtnClick(Sender: TObject); var i: Integer; begin for i := length(btns) - 1 downto 0 do btns[i].Free; SetLength(btns, 0); for i := 0 to random(9) + 1 do begin btns[i] := TButton.Create(nil); btns[i].name := 'abutton' + IntToStr(i); btns[i].text := 'Button' + IntToStr(i+1); btns[i].Parent := GridLayout1; btns[i].OnClick := abtnClick; end; end; |
AW: Button Selbstzerstörung
Delphi-Quellcode:
if Sender = deinButton then
NichtZerstören; |
AW: Button Selbstzerstörung
Zitat:
|
AW: Button Selbstzerstörung
Ich verstehe das hinten und vorne nicht. Ein OnClick-Event eines Buttons kann doch den Button ganz normal zerstören? Schreib doch einfach mal in das
Delphi-Quellcode:
-Event eines normalen Buttons
OnClick
Delphi-Quellcode:
. Wo soll denn da die Exception sein?
Sender.Destroy()
Wo ich eher eine Exception sehe ist hier:
Delphi-Quellcode:
Wie soll das funktionieren? Du setzt das Array (unnötigerweise) auf Länge Null und fängst dann an, darin herumzuschreiben.
SetLength(btns, 0);
for i := 0 to random(9) + 1 do begin btns[i] := TButton.Create(nil); [...] |
AW: Button Selbstzerstörung
Zitat:
|
AW: Button Selbstzerstörung
Die OnClick-Behandlung veranlasst ja noch der Button selbst.
Nach Erledigung kommt der Programmablauf wieder zurück zum Button. Was dann passiert kannst Du nicht beeinflussen. Vielleicht will Windows den Button jetzt nochmal zeichnen o.ä. - und plötzlich ist er weg ;-) Also der bisherige Speicherbereich ist undefiniert. Ein Workaround wäre, den Button unsichtbar zu machen und irgendwo zu merken (in einer Liste oder globalen Variable o.ä.). Dann kannst Du etwas später, wenn mal Zeit ist (und Windows garantiert nicht mehr benutzt), diesen freigeben. Also so etwas wie einen Papierkorb bauen, der immer mal geleert wird. Sonst wäre auch möglich, eine Message an den Button zu senden, der ihn veranlasst, sich freizugeben. Dazu gab es schon Beiträge in der DP. |
AW: Button Selbstzerstörung
Zitat:
Delphi-Quellcode:
:stupid:
type barray = Array of TButton;
var btns: barray; procedure TForm1.abtnClick(Sender: TObject); var i: Integer; MichNicht:TButton; begin for i := length(btns) - 1 downto 0 do if TButton(Sender) = self then btns[0] := btns[i] else btns[i].Free; for i := 1 to random(9) + 1 do begin btns[i] := TButton.Create(nil); btns[i].name := 'abutton' + IntToStr(i); btns[i].text := 'Button' + IntToStr(i+1); btns[i].Parent := GridLayout1; btns[i].OnClick := abtnClick; end; end; |
AW: Button Selbstzerstörung
Mit dem IdleWorker (s. da ->
![]()
Delphi-Quellcode:
uses
IdleWorker; procedure TForm1.abtnClick(Sender: TObject); begin TIdleWorker.Default.Execute( procedure var i: Integer; begin // alte Buttons entsorgen for i := low(btns) to high(btns) do btns[i].Free; // ein DisposeOf wäre hier besser // neue Länge für das Array SetLength(btns, random(9) + 1 ); // neue Buttons erzeugen for i := low(btns) to high(btns) do begin btns[i] := TButton.Create(nil); btns[i].name := 'abutton' + IntToStr(i); btns[i].text := 'Button' + IntToStr(i+1); btns[i].Parent := GridLayout1; btns[i].OnClick := abtnClick; end; end ); end; |
AW: Button Selbstzerstörung
Zitat:
DANKE Sir Rufo!!! |
AW: Button Selbstzerstörung
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:56 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