Autor Beitrag
chrissivo
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 130

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: Do 14.07.05 10:26 
Hallöle,
habe folgenden Quelltext:

ausblenden volle Höhe 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 14.07.05 10:28 
Was passiert denn stattdessen? :roll:
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: 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

_________________
Eine Klasse beschreibt die Struktur und das Verhalten einer Menge gleichartiger Objekte.
chrissivo Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 130

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 130

WIN XP, WIN 2000, WIN MCE, WIN 98
D5 Pers
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: 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:

ausblenden 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:

ausblenden Delphi-Quelltext
1:
knoepfe[i] := TButton.Create(Form5);					


Dann werden die Buttons beim Zerstören des Formulars (durch Release) mit freigegeben.

Stefan