Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

großes Menü, eine Funktion

1 view
Skip to first unread message

Matthias H.

unread,
Nov 12, 2003, 2:57:47 AM11/12/03
to
Hi Leutz!

Ich hab ein Menü, daß enthält exakt 73 Positionen. Nun
will ich aber nicht 73 Funktionen dafür schreiben, zumal
die alle gleich aussehen könnten. Leider gibt es keine
Menü-Auflistung.
In VB gab es früher die Möglichkeit mehrere Buttons mit
einem Index zu versehen. Man schrieb dann eine Funktion
mit dem Index als Parameter und konnte so die gleiche
Funktion auf alle Buttons ausführen.
Gibt es diese Möglichkeit noch in C#, wenn ja wie? Wenn
nein, welche Möglichkeiten hab ich sonst?

Peter Koen

unread,
Nov 12, 2003, 3:10:02 AM11/12/03
to
"Matthias H." <wa...@gmx.de> wrote in news:0af601c3a8f2$a94d6700
$a301...@phx.gbl:

Du könntest dir eine Schleife bauen die per Reflection den Event aus den
einzelnen menüpunkten raussucht und mit AddHandler den EventHandler
zuweist.

Gruß
Peter

--
------ooo---OOO---ooo------

Peter Koen - www.kema.at
MCAD CAI/RS CASE/RS IAT

------ooo---OOO---ooo------

Herfried K. Wagner [MVP]

unread,
Nov 12, 2003, 3:16:21 AM11/12/03
to
* "Matthias H." <wa...@gmx.de> scripsit:

Schau dir mal den "Designer Generated Code" an, also die 'void
InitializeComponent'. Darin siehst du, wie man die Handler mit den
Ereignissen verknüpft. Stattdessen verbindest du einfach alle Ereignisse
der verschiedenen MenuItems mit einem Handler.

--
Herfried K. Wagner
MVP · VB Classic, VB.NET
<http://www.mvps.org/dotnet>

<http://www.plig.net/nnq/nquote.html>

Ralf Schuhmann [MS]

unread,
Nov 12, 2003, 3:19:07 AM11/12/03
to
Hallo Matthias,

ja, das funktioniert schon. Du machst einen Handler und tust diesen dann bei
jedem Menüpunkt eintragen, bei dem Du diesen haben willst. Wie z.B. so:

public void Menue_handler(object sender, MenuEventArgs e)
{
...
}

In den Properyfenster gibt es die Events. Für jeden Menüpunkt den der
Handler implementiert, kannst Du dann diesen Handler angeben.
Oder z.B. mit folgendem:
menuItem1.Click += new System.EventHandler(this.Menue_handler);
menuItem2.Click += new System.EventHandler(this.Menue_handler);
....

Eventuell schaust Du Dir nochmal Delegates an.

Ich hoffe, das hilft weiter.

Viele Grüsse,
Ralf
"Matthias H." <wa...@gmx.de> schrieb im Newsbeitrag
news:0af601c3a8f2$a94d6700$a301...@phx.gbl...

Matthias H.

unread,
Nov 13, 2003, 3:09:11 AM11/13/03
to
Aber wie komm ich dann an das Menü ran, daß diese
Funktion ausgelöst hat? Die Funktion soll ja gleich sein,
aber ich brauch den Namen des Menüs bzw. dessen
Beschriftung, um damit weiterzuarbeiten.
In der Funktion wird zwar das Object sender übergeben,
aber leider kann man damit anscheinend nicht viel
anfangen, da es nur 4 Funktionen bereitstellt, die mir
nicht helfen. Auch kann man keinen zusätzlichen Parameter
übergeben.

Peter Koen

unread,
Nov 13, 2003, 4:26:26 AM11/13/03
to
"Matthias H." <wa...@gmx.de> wrote in news:099101c3a9bd$6b4fc990
$a401...@phx.gbl:

sender ist vom Typen Object. D.h. es kann im Prinzip alles sein und du mußt
das noch richtig casten. Beispielsweise eben auf MenuItem. Dann kannst du
alle Eigenschaften des MenuItem auslesen.

Ralf Peine

unread,
Nov 28, 2003, 8:31:48 AM11/28/03
to
Leider hat Microsoft es versäumt, statt funktionalen
Callbacks Action Objekte mit den Eventhandlern zu
verknüpfen. Folgendes Action-Prinzip habe ich vor über 10
Jahren in der X11-Bibliothek "Interviews" von der
Stanford-University (http://www.stanford.edu) zum ersten
mal gesehen:

/// <summary>
/// Action interface: Use instead of callbacks, if
/// You need extra parameters
/// </summary>
public interface Action {
void Execute();
}

Hier das Beispiel für einen Button (Das kann man für
Menüs ähnlich implementieren):

ButtonWithActions actionButton = new ButtonWithActions();
actionButton.ClickAction = new CloseFormAction(form);

Wenn man jetzt auf den Button klickt, wird vom
EventHandler CloseFormAction.Execute() aufgerufen, was
die Form schliesst. Und hier die benötigten Klassen:

class CloseFormAction : Action {
private System.Windows.Forms.Form form;
public CloseFormAction
(System.Windows.Forms.Form aForm) {
form = aForm;
}
public void Execute() {
form.Close();
}
}

/// <summary>
/// ButtonWithActions: call actions from callbacks
/// </summary>
public class ButtonWithActions :
System.Windows.Forms.Button {
private Action clickAction;
public Action ClickAction {
set {
this.clickAction = value;
}
get {
return this.clickAction;
}
}
public ButtonWithActions() {
this.InitializeComponent();
this.clickAction = null;
}
private void InitializeComponent() {
this.Click += new System.EventHandler
(this.ButtonWithActions_Click);
}
public void executeClickAction() {
if (this.clickAction != null)
this.clickAction.Execute();
}
private void ButtonWithActions_Click
(object sender, System.EventArgs e) {
this.executeClickAction();
}

Vielleicht greift Microsoft ja meine Anregung auf...
Ralf

Herfried K. Wagner [MVP]

unread,
Nov 28, 2003, 12:39:21 PM11/28/03
to
* "Ralf Peine" <ralf....@siemens.com> scripsit:

> Leider hat Microsoft es versäumt, statt funktionalen
> Callbacks Action Objekte mit den Eventhandlern zu
> verknüpfen. Folgendes Action-Prinzip habe ich vor über 10
> Jahren in der X11-Bibliothek "Interviews" von der
> Stanford-University (http://www.stanford.edu) zum ersten
> mal gesehen:

Schön und gut, aber irgendwie reicht mir das, was mit C# bzw. VB.NET
direkt bzgl. Eventhandling möglich ist, aus.

--
Herfried K. Wagner [MVP]
<http://www.mvps.org/dotnet>

Ralf Peine

unread,
Dec 9, 2003, 10:44:10 AM12/9/03
to
On 28 Nov 2003 18:39:21 +0100, hirf-spa...@gmx.at (Herfried K.
Wagner [MVP]) wrote:

>* "Ralf Peine" <ralf....@siemens.com> scripsit:
>> Leider hat Microsoft es versäumt, statt funktionalen
>> Callbacks Action Objekte mit den Eventhandlern zu
>> verknüpfen. Folgendes Action-Prinzip habe ich vor über 10
>> Jahren in der X11-Bibliothek "Interviews" von der
>> Stanford-University (http://www.stanford.edu) zum ersten
>> mal gesehen:
>
>Schön und gut, aber irgendwie reicht mir das, was mit C# bzw. VB.NET
>direkt bzgl. Eventhandling möglich ist, aus.

Ich habe u.a. folgende zwei Gründe, Actions zu verwenden:

1. UserData

Die Userdaten werden vor dem Einbau in die Maske in die Action
gepackt. Der Callback muss sich seine Userdaten aus der Maske holen
und zurückcasten, und alle Probleme behandeln, die dabei entstehen
können.

2. Die Form weiss nichts über unterlagerte
Funktionen/Methoden/Klassen:

Daher kann sie leicht mehrfach eingesetzt werden.
Die Applikation wird unabhängig von den Forms (wichtig bei
komplexen Programmen). Damit kann ein Regressionstest leichter
eingerichtet werden.

Callbacks, in denen this als Pointer auf die Form bereits bekannt ist,
verleiten dazu, dort Funktionalität zu implementieren, die eigentlich
weiter nach "innen" in die Applikation gehört, damit sie auch von
anderen benutzt werden kann.

---
Ralf Peine


---
Ralf Peine, Siemens AG

0 new messages