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..9of 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

user profile iconCenBells 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