Autor |
Beitrag |
LokutusvB
      
Beiträge: 74
WinXP
Delphi 5, Delphi XE
|
Verfasst: Di 09.10.07 11:01
Hallo Leute,
ich arbeite zur Zeit an einem Programm, welches über verschiedene Buttons (Button1 bis Button 10) verschiedene andere Ereignisse auslöst und Eigenschaften anderer Komponenten (1 bis 10) verändert.
Zur Zeit ist es noch so, dass ich für jeden Button eine separate Click-Procedure (TForm_Main.Button1Click(Sender: TObject) bis Button10) erstellt habe.
Nun soll das Programm aber erweitert werden, die Erweiterungen an sich sind nicht das Problem, nur werden es irgendwann 50 und mehr Buttons sein. Auch alles kein Problem. Nur wird mir irgendwann der Quelltext zu lang und unübersichtlich. Für jeden der Buttons wird beim Click Ereignisse mit anderen Objekten ausgelöst, dieses Vorgehen kann ich wunderbar durch Schleifen und FindComponent-Aufrufe abhandeln. Leider weiss ich momentan noch keine Möglichkeit, wie ich das in einer oder 2 Prozeduren für alle Buttons abhandeln kann, sondern müßte trotzdem für jeden Button eine ButtonXClick-Procedure nutzen, in der ich dann die Abhandlungsprocedure mit Übergabe aufrufe.
Nun zu meiner Frage:
Gibt es eine Möglichkeit, in einer Procedure alle Buttons abzuhandeln?
Also so in etwa
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TForm_Main.ButtonCLick(Sender: TObject): begin
end; |
Ich hoffe, ihr versteht, wie ich das meine und könnt mir bei dem Problem weiterhelfen.
MFG
LokutusvB
Moderiert von Narses: Delphi-Tags hinzugefügt
Zuletzt bearbeitet von LokutusvB am Di 09.10.07 11:12, insgesamt 1-mal bearbeitet
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: Di 09.10.07 11:04
FindComponent sollte Dir auf den richtigen Weg helfen.
|
|
LokutusvB 
      
Beiträge: 74
WinXP
Delphi 5, Delphi XE
|
Verfasst: Di 09.10.07 11:11
jasocul hat folgendes geschrieben: | FindComponent sollte Dir auf den richtigen Weg helfen. |
Ja, soweit gehe ich mit. Nur habe ich noch nichts finden können, mit dem ich abfragen kann, ob ein Button ein Click-Event ausgelöst hat oder nicht, Click oder OnClick hilft mir der der If-Abfrage leider nicht weiter. Das ist hier mein Problem, was ich momentan habe.
MFG
LokutusvB
Zusatz: Lösung gefunden
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm_Main.ButtonClick(Sender: TObject); var ii: Integer;
begin for ii := 1 to 10 do if (Sender = TButton(Form_Main.FindComponent('Button' + IntToStr(ii)))) then ShowMessage('Button' + IntToStr(ii)); end; |
Moderiert von Narses: Delphi-Tags hinzugefügt
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 09.10.07 11:32
Moin und  im Forum!
Du hast da irgendwo einen Denkfehler.  Das Ereignis ist die Information, dass ein Button angeklickt wurde. Welcher steht ja im Parameter Sender. Wenn du einen Index brauchst, kannst du dafür die .Tag-Eigenschaft verwenden.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Andreas Schilling
      
Beiträge: 128
Erhaltene Danke: 1
WIN XP, WIN 7
Delphi 5 Ent, Delphi 2007 Pro, XE4
|
Verfasst: Di 09.10.07 11:37
Wenn der erste Button ein OnClick - Ereignis hat, das im OI bei OnClick allen anderen Button zuweisen. Dann wird beim Klick auf einen Button immer diese eine Procedure verwendet.
Im onClick-Procedure des Button1 kannst du dann auf den "Sender" des Ereignis reagieren
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if [sender as TButton].name = 'Button1' then begin .... end; if [sender as TButton].name = 'Button2' then begin .... end; ...... |
|
|
LokutusvB 
      
Beiträge: 74
WinXP
Delphi 5, Delphi XE
|
Verfasst: Di 09.10.07 11:40
Andreas Schilling hat folgendes geschrieben: | Wenn der erste Button ein OnClick - Ereignis hat, das im OI bei OnClick allen anderen Button zuweisen. Dann wird beim Klick auf einen Button immer diese eine Procedure verwendet.
Im onClick-Procedure des Button1 kannst du dann auf den "Sender" des Ereignis reagieren
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| if [sender as TButton].name = 'Button1' then begin .... end; if [sender as TButton].name = 'Button2' then begin .... end; ...... | |
Hallo an euch  !
Das schaut doch sehr gut aus, das jetzt noch in eine Schleife, und mir bleib ein haufen Tipperrei erspart
Also so in etwa:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| for ii := 1 to MAX_BTN do if [sender as TButton].name = 'Button' + IntToStr(ii) then begin .... .... end; ...... |
ist das soweit richtig?
Zusatz:
Bei meiner gefundenen ersten Lösung meckert Delphi 5 aber auch nicht rumm und gibt mir jeweils das richtige Ergebnis für den Button aus, müßte dann also auch gehen.
MFG
LokutusvB
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 09.10.07 12:23
Moin!
Also IMHO hast du immernoch einen Denkfehler in deinem Anwendungskonzept (heißt: du verwendest die VCL nicht designgerecht)...
Trotzdem nochmal einen Ansatz als Denkzettel:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm_Main.ButtonClick(Sender: TObject);
begin
case (Sender as TButton).Tag of
0: 1: 2: end;
end; |
Setzt voraus, dass du die .Tag-Eigenschaft der Buttons passend im OI einstellst.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
LokutusvB 
      
Beiträge: 74
WinXP
Delphi 5, Delphi XE
|
Verfasst: Di 09.10.07 12:49
Hm, Ok, danke für den Hinweis. Habe jetzt im OI den Buttons jeweils die Tag-Egenschaft vergeben (1 bis 10).
Ist mein folgender Ausschnitt nun desinggrecht, wenn nicht, warum? Verstehe das ganze leider noch immer nicht, warum meine beiden vorherigen Möglihckeiten nicht designgerecht sind.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TForm_Main.ButtonClick(Sender: TObject); var ii: Integer;
begin for ii := 1 to 10 do if (Sender as TButton).Tag = ii then ShowMessage('Test: Button' + IntToStr(ii)); end; |
MFG
LokutusvB
|
|
Miri
      
Beiträge: 657
Delphi 3 Prof., Delphi 2005 PE
|
Verfasst: Di 09.10.07 13:32
Dein Denkfehler ist glaube ich einfach, dass du überhaupt keine Schleife brauchst!
Wenn du im OI jedem Button diese Prozedur im OnClick zuweist, dann wird - egal welcher Button geklickt wird - diese Prozedur aufgerufen.
Dank des Parameters "Sender" und die Nummerierung in den Tags weiß die Prozedur schon, welcher Button gerade gedrückt wurde. Du brauchst also nur noch sagen, was bei welchem Button passieren soll:
Narses hat folgendes geschrieben: | Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm_Main.ButtonClick(Sender: TObject); begin case (Sender as TButton).Tag of 0: 1: 2: end; end; |
|
Sprich: hinter "0:" kommt, was spezielles bei dem Button mit dem Tag 0 passieren soll. Hinter "1:" das, was bei Button mit Tag 1 passieren soll, und so weiter.
Wenn alle Buttons dasselbe tun sollen (z.B. ihre Tag-Nr. ausgeben), brauchst du nicht einaml das case, sondern einfach nur
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm_Main.ButtonClick(Sender: TObject); begin ShowMessage('Test: Button ' + inttostr((Sender as TButton).Tag); end; |
_________________ Anonymes Eckenkind
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 09.10.07 13:33
Moin!
LokutusvB hat folgendes geschrieben: | Ist mein folgender Ausschnitt nun desinggrecht, |
Das bezog sich auf diese Aussage:
LokutusvB hat folgendes geschrieben: | Nur habe ich noch nichts finden können, mit dem ich abfragen kann, ob ein Button ein Click-Event ausgelöst hat oder nicht, Click oder OnClick hilft mir der der If-Abfrage leider nicht weiter. |
LokutusvB hat folgendes geschrieben: | Verstehe das ganze leider noch immer nicht, warum meine beiden vorherigen Möglihckeiten nicht designgerecht sind. |
Konkret: Es gibt keine Möglichkeit, "mit einer if-Abfrage einen Buttonklick zu behandeln", da eine VCL-Anwendung ereignisorientiert abläuft. Das Ereignis ist die Information, dass ein Button angeklickt wurde. Es ist demzufolge "nicht designgerecht", den Buttonzustand pollen zu wollen.
Ich würde das so machen:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm_Main.ButtonClick(Sender: TObject); begin ShowMessage('Test: Button' + IntToStr((Sender as TButton).Tag)); end; |
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
LokutusvB 
      
Beiträge: 74
WinXP
Delphi 5, Delphi XE
|
Verfasst: Di 09.10.07 13:38
Danke euch beiden, jetzt hab ich's gerafft
Super, wie schön einfach das geht, wenn man nicht ganz so kompliziert denkt
Nochmals Danke und MFG
LokutusvB
|
|