Autor Beitrag
willi
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 06.10.02 15:45 
hi,
ich habe ein Programm das an die 50 Buttons enthält, auf die ich einzeln anklicken möchte. Nun will ich aber nicht für jeden einzelnen Button eine eigene Prozedur mit einem OnClick-Ereignis schreiben, sondern einfach eine Prozedur haben, in der ich dann weiß, auf welchen Button geklickt wurde.
Habe mir schon überlegt, es mir der Mausposition auszurechnen, aber das fand ich auch nicht so toll.
Ach ja, wenn ich auf einen Button klick, dann soll nur die Caption der Form geändert werden, sonst nichts...
Hat jemand eine Idee???

Danke
Willi
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 06.10.02 16:12 
Hi,

du machst ein OnClick-Ereignis, was Du in jeden Button einfügst im Obejktinspektor. Das Ereignis könnte so aussehen :

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.Button1Click(Sender: TObject);
begin
  if Button1.Focused then Form1.Caption := Button1.Caption;
  if Button2.Focused then Form1.Caption := Button2.Caption;
  if Button3.Focused then Form1.Caption := Button3.Caption;
end;
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 06.10.02 16:27 
Kann man das nicht so machen?

ausblenden Quelltext
1:
Form1.Caption:=TButton(Sender).Caption;					


MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 06.10.02 16:42 
Hallo Peter,

du hast recht, warum einfach wenn's auch umständlich geht. Bin halt nicht gleich draufgekommen :mrgreen:
willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 06.10.02 17:05 
Nein, sorry, so klappt des net. Denn die Caption soll sich ja nur ändern, wenn ein Button angeklickt wird und das erfahr ich ja dadurch nicht.

Ich habe die Buttons auch schon in ein Array of Buttons geladen. Was auch wunderbar klappt. Habe nun immer, wenn sich der Focus ändert, abgefragt, ob ein Button den Focus hat. Das hat aber irgendwie nicht ganz richtig funktioniert, da die Buttons sich nur einmal anklicken lassen, danach is schluss :?
Am Besten wär es wenn ich ein OnClick-Ereignis von dem Array abrufen könnt. Also zum Beispiel (Array[].OnClick, dies klappt natürlich nicht). Da habe ich aber auch keine Ahnung, wie des gehen soll...

MFG
Willi
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 06.10.02 17:10 
Hi,

definiere mal, was sich ändern soll ? Die Caption der Form oder die Caption der Buttons oder was ? Denn die beiden Code-Beispiele funktionieren. Denn Du schreibst es etwas undurchsichtlich.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 06.10.02 17:23 
Hi!

Wenn Du meinen Quelltext jedem Button als OnClick-Ereignis zuweist, dann wird, wenn auf einen Button geklickt wird, die Form den Titel erhalten, den der Button hat. Der Quelltext von bis11 tut das Gleiche!

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 06.10.02 17:33 
Ok, ich wollte es etwas kürzen, aber was solls...

ich habe 50 Buttons und wenn ich auf einen klicke, dann soll sich ein neues Fenster öffnen (Form2). Und die Caption der Form2 soll den Text des Buttons einnehmen ( Also: Form2.caption:=button?.caption).

Nun kann ich es so lösen, indem ich für jeden Button eine eigene Procedur schreibe:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure button1.onclick;
begin
 form2.show;
 Form2.caption:=button1.caption;
end;

procedure button2.onclick;
begin
 form2.show;
 Form2.caption:=button2.caption;
end;


Das wäre aber für 50 Button etwas mühsam und bescheuert.
Deswegen habe ich die ganzen Buttons in ein Array reingeschrieben mit:

ausblenden Quelltext
1:
for i:=1 to 50 do Tage[i]:=TButton(FindComponent('Button'+IntToStr(i)));					


Dies klappt auch.
Aber jetzt weiß ich nicht, wie ich ein OnClick-Ereignis aufrufen kann, wie zum Beispiel
ausblenden Quelltext
1:
procedure tage[].OnClick;					

Das klappt natürlich NICHT...
Aber das mit Form1.Caption:=TButton(Sender).Caption; ist eine sehr gute Idee. Danke
Gibt es vielleicht sowas wie TButton(Sender).OnClick????


So, ist es vielleicht jetzt etwas verständlicher???
Ich hoffe doch
Vielen Dank
Willi
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 06.10.02 17:40 
Dann machste das halt so :

ausblenden Quelltext
1:
2:
3:
4:
5:
procedure TForm1.Button1Click(Sender: TObject); 
begin 
  Form2.Show;
  Form2.Caption:=TButton(Sender).Caption;
end;


Dann diese Procedure in jedes OnClick-Ereignis von jedem Button setzen.
willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 06.10.02 17:51 
Das ist es doch grad... ich will nicht 50 OnClick-Eriegnis Proceduren schreiben, sondern nur eine einzige Procedur. Ist das möglich :?:
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 06.10.02 17:59 
geht das nicht so:

ausblenden Quelltext
1:
2:
3:
4:
5:
procedure TForm1.alles_klick(Sender: TObject); 
begin 
  Form2.Show; 
  Form2.Caption:=TButton(Sender).Caption; 
end;


dann so: (Deine Schleife, nur geändert)

ausblenden Quelltext
1:
2:
3:
4:
5:
for i:=1 to 50 do
begin
  Tage[i]:=TButton(FindComponent('Button'+IntToStr(i)));
  TButton(FindComponent('Button'+IntToStr(i))).OnClick:=alles_klick;
end;


MfG,
Peter

P.S.: Quelltext nicht getestet!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 06.10.02 18:02 
Willi,

Zitat:
Dann diese Procedure in jedes OnClick-Ereignis von jedem Button setzen.


Das habe ich im letzten Posting geschrieben, Du kannst eine Procedure mehren Buttons zuweisen, dies alles machst Du im Objektinspektor.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 06.10.02 18:16 
bis11 hat folgendes geschrieben:

Du kannst eine Procedure mehren Buttons zuweisen, dies alles machst Du im Objektinspektor.

Stimmt, das geht auch. Trotzdem würde es mich interessieren, ob meine Methode auch funktioniert.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 06.10.02 18:22 
Wie wäre es damit:
ausblenden Quelltext
1:
2:
3:
4:
case TButton(Sender).Tag of
  1: ....;
  2: ....;
end;
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 06.10.02 18:25 
@Luckie:
Ist das für das gegebene Problem nicht etwas umständlich? Er will doch nur Caption vom Button für die Form2 übernehmen ... Hoffe ich.

MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 06.10.02 18:44 
Ja genau, richtig erkannt. Es ist etwas umständlich.

@ bis11: ok, das würde gehen und nicht soo umständlich. Aber was wäre wenn man 1000 Buttons hat?? :D Ok, es ist übertrieben, aber mich interessiert es auch, ob es anders geht

@Peter Lustig: Ich hab es ausprobiert, aber geklappt hat es leider nicht :(
Bei mir bringt er den Fehler:
Inkompatible Typen: Liste der Parameter ist unterschiedlich.
Vielleicht hab auch ich was falsch gemacht.

MFG
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 06.10.02 18:47 
War nur ein Vorschlag, eventuell wird es an anderer Stelle noch gebraucht.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 06.10.02 18:51 
Hi!

Habe es gerade mal ausprobiert (den Teil mit dem Array nicht, sondern den Teil der Schleife, den ich hinzugefügt habe). Bei mir funktioniert das. Ist zwar etwas lang, aber so sieht das bei mir aus:
ausblenden volle Höhe 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:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure FormCreate(Sender: TObject);
    procedure alles_klick(Sender:Tobject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.alles_klick(Sender:Tobject);
begin
  form1.Caption:=TButton(sender).caption;
end;

procedure TForm1.FormCreate(Sender: TObject);
VAR i : INTEGER;
begin
  for i:=1 TO 3 DO
  TButton(FindComponent('Button'+IntToStr(i))).OnClick:=alles_klick;
end;


MfG,
Peter

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
bis11
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: So 06.10.02 18:53 
Das ist wohl schon ein bißchen Übertrieben und ich glaube das man das auch nicht brauchen wird. Aber natürlich geht das auch für 1000 Buttons.
willi Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: So 06.10.02 19:04 
Ja, danke Peter Lustig. Es klappt wunderbar. Ich habe vorhin nur einen ganz dummen Fehler reingemacht :oops:
Aber nach deiner Methode klappt es wunderbar und ist am unaufwendigsten.

@bis11:klar kann man das auch für 1000 Buttons machen, nur mit welchen Aufwand??
Auch dir danke, wäre das nächste, was ich gemacht hätte...

Trotzdem danke an alle. Hätte nicht gedacht, dass ich so schnell Antworten bekomm

DANKE
willi