Entwickler-Ecke

Sonstiges (Delphi) - Ein OnClick für mehrere MainMenue Einträge?


pwsolaris - Mo 02.08.10 10:04
Titel: Ein OnClick für mehrere MainMenue Einträge?
Hallo,

ich habe ein Mainmenu mit drei Hauptpunkten. Zu einem der Hauptpunkte existiert ein Unterpunkt (hier im Beispiel mal "Testfälle" genannt).
Zu dem Unterpunkt "Testfälle" existieren die Einträge "Test A", "Test B" und "Test C".
Für jeden der Testfälle soll nun ein und dieselbe Prozedur aufgerufen werden, jedoch mit unterschiedlichem Übergabeparameter (hier im Beispiel ist der Übergabeparameter die Caption des Menüpunktes: Also "Test A", "Test B" oder "Test C").

Bisher muss ich für jeden Testfall ein eigenes OnClick Ereignis haben.
Ich habe aber vor, das Ganze etwas übersichtlicher zu gestalten und will daher unnötige Codezeilen sparen.

Ist es also möglich, ein einziges OnClick Ereignis zu haben, welches für jeden Untermenupunkt zählt und in dem ich dann den Namen (Caption) des gedrückten Punktes auslesen kann?

In meinem Beispiel ist es ja noch einfach gehalten mit drei Punkten. Im späteren Projekt können es aber wesentlich mehr Punkte werden. Für jeden dieser Punkte dann ein eigenes Ereignis zu benutzen wäre zwar einfach, aber auch unübersichtlich. Zumal bei jedem OnClick ja die gleiche Prozedur aufgerufen wird, nur mit anderem Übergabeparameter.

Ist so etwas also möglich oder muss ich den "großen" Weg gehen?


Xion - Mo 02.08.10 10:38

Hi,

du weist einfach allen Einträgen die selbe Procedure zu.
Die Caption kannst du per TMainMenuItem(Sender).Caption herausfinden. (TMainMenuItem oder so ähnlich, dort steht immer der type, den sender hat).


pwsolaris - Mo 02.08.10 11:42

Wie könnte ich denn dann alle Einträge auf die gleiche Prozedur verweisen?
Also im OnClick Ereignis eines einzelnen Eintrags will ich das ja nicht machen.
Habe hier momentan leider kein Delphi zur Verfügung, kann demnach also nicht eben schnell nachschauen.


jasocul - Mo 02.08.10 11:54

Du kannst im Objekt-Inspektor zum jeweiligen Menüpunkt auch andere Methoden aufrufen, die "passend" sein könnten.
Das funktioniert nicht nur für Menüpunkte. :wink:


Xion - Mo 02.08.10 11:56

user profile iconpwsolaris hat folgendes geschrieben Zum zitierten Posting springen:
Wie könnte ich denn dann alle Einträge auf die gleiche Prozedur verweisen?

Du kannst es entweder im Objektinspektor machen oder (am besten wenn du die Einträge zur Laufzeit erstellst) die procedure zur Laufzeit zuweisen. Dann gäbe es noch die Möglichkeit per FindComponent die entsprechenden Items zu suchen und dann zuzuweisen(langsam).

Dynamsiches zuweisen (Beispiel für TButton):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure ItemOnClick(Sender: TObject);
...
Btn1.OnClick:=ItemOnClick;
Btn2.OnClick:=ItemOnClick;
Btn3.OnClick:=ItemOnClick;
...

procedure TForm1.ItemOnClick(Sender: TObject);
begin
  S:=TButton(Sender).Caption;

  if S='ModusA' then
    beep
  else if S='ModusB' then
    beep
  else
    beep;
end;


//Edit:
Für den Objektinspektor brauchst du natürlich erstmal eine Procedure. Die kannst du z.B. herkömmlich durch doppelklick erzeugen. Den andren weist du dann die selbe procedure zu (also keine neue, wie sie bei Doppelklick erzeugt würde, sondern du gibts in dem Feld einfach die alte an). Diese kannst du später auch noch im SourceCode umbennenen und es wird dann (soweit ich weiß) für die Objekte übernommen.


pwsolaris - Mo 02.08.10 12:11

Alles klar.
Danke :)

Sobald ich wieder in meiner Delphi-Umgebung bin wird das direkt getestet.


//Edit
Hat alles wunderbar geklappt. Danke für eure Hilfe :)