Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Problem: Sender wird bei OnClick-Ereignis nicht mitübergeben
chrissivo - Do 14.07.05 10:26
Titel: Problem: Sender wird bei OnClick-Ereignis nicht mitübergeben
Hallöle,
habe folgenden Quelltext:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42:
| ... var Form5 : TForm5; knoepfe : Array[0..9] of TButton; auswahl : Integer; ... procedure TForm5.klick(Sender : TObject); begin ShowMessage((Sender as TButton).Name); Form5.Close end;
function menuewahl(menue : Array of String; ueberschrift : String) : Integer; var i : Integer; begin auswahl := -1; Form5 := TForm5.Create(nil); Form5.Caption := ueberschrift; for i := 0 to length(menue)-1 do begin knoepfe[i] := TButton.Create(nil); with knoepfe[i] do begin Parent := Form5; Caption := menue[i]; Height := 40; Width := 150; Left := Parent.Width div 2 - Width div 2; if i <> 0 then Top := Height div 3 * i + (i-1)*Height else Top := Parent.Height - Height * 2; OnClick := Form5.klick; Show; Repaint end end; Form5.ShowModal; Form5.Release; result := auswahl; end; ... |
Die Funktion erstellt mir auf dem Formular mehrere Buttons, wie gewünscht. Doch aus irgendeinem Grund bekomme ich den Namen des Senders nicht heraus. Soweit ich das, sollte das ShowMessage der Klick-Prozedur den Namen des Senders herausgeben, tut sie aber nicht.
Wer kann mir helfen?
Viele Grüße
Chrissi
Delete - Do 14.07.05 10:28
Was passiert denn stattdessen? :roll:
CenBells - Do 14.07.05 10:30
hi,
dir ist bewusst, daß du beim erstellen der Komponente zur Laufzeit explizit einen Namen zuweisen musst? In deinem Code wird nur die Eigenschaft Caption mit einem Wert versehen.
Gruß
Ken
chrissivo - Do 14.07.05 10:35
CenBells hat folgendes geschrieben: |
hi,
dir ist bewusst, daß du beim erstellen der Komponente zur Laufzeit explizit einen Namen zuweisen musst?
|
Nein, war mir nicht bewusst. Ich dachte der Name wäre der Array-Name mit dazugehörogem Feld!
Danke für den Tipp, werde es gleich ausprobieren.
Vielen Dank
Chrissi
chrissivo - Do 14.07.05 10:39
Hallo nochmal,
Vielen Dank, genau das war anscheinend das Problem. Im Nachhinein ist es mir auch klar, dass in dem Array ja nur Objekte stehen und der Name eine Eigenschaft eines solchen ist. :oops:
Danke!
Stefan.Buchholtz - Do 14.07.05 10:44
Du musst den Namen nicht unbedingt setzen - bei zur Laufzeit erstellten Komponenten kannst du sowieso nicht über den Namen darauf zugreifen und du jhast ja auch ein Array dafür.
Wenn du allerdings nur die Caption setzt, solltest du auch die Caption in deinem ShowMessage ausgeben:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure TForm5.klick(Sender : TObject); begin ShowMessage((Sender as TButton).Caption); Form5.Close end; |
Edit: Mir ist noch gerade aufgefallen, dass du deine Buttons nicht freigibst - die menuewahl-Funktion leckt daher Speicher. Du solltest am Ende der Funktion entweder dein Array durchlaufen und für jeden Button explizit Free aufrufen oder das Formular als Owner der Buttons übergeben:
Delphi-Quelltext
1:
| knoepfe[i] := TButton.Create(Form5); |
Dann werden die Buttons beim Zerstören des Formulars (durch Release) mit freigegeben.
Stefan
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!