Laden...

Gleicher Menüpunkt von verschiedenen Komponenten

Erstellt von husky410 vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.191 Views
husky410 Themenstarter:in
225 Beiträge seit 2005
vor 18 Jahren
Gleicher Menüpunkt von verschiedenen Komponenten

Ich habe mehrere Komponeten die denselben Menupünkt einhängen wollen, z.B. ein "Undo". Ich dachte mir jetzt, dass ich bereits eingehängte Meüpunkte in einer Liste halte und bei der Erstellung überprüfe ob dieser bereits existiert. Falls er bereits erstellt wurde, füge ich keinen neuen Menüpunkt ein, sondern füge nur das Event dem Eventhändler (mit +=) des bereits bestehenden hinzu. Aber wie manage ich, dass die Eventprozedur der trichtigen Komponente aufgerufen wird? Ich habe ja keinen Einfluss auf deren Prozeduren. Soweit ich weiss, werden bei einem Event alle registrierten handler informiert.

Wenn ich z.B. zwei Controlbars (A und B) habe, auf A der Fokus ist, soll bei ansprechen eines Menüpunktes eine MessageBox erscheinen. Wenn B den Fokus hat soll sich bei dem gleichen Menüpunkt z.B. die Hintergrungfarbe von B geändern werden.

Hat jemand von euch eine Idee?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo husky410,

ich denke, das geht so nicht. Erzeuge einfach einen neuen MenuItem. Das ist nicht nur die einfachste, sondern hier auch die beste Lösung. Kostet ja kein Geld.

herbivore

1.549 Beiträge seit 2004
vor 18 Jahren

du hast doch den sender also wo genau ist dein Problem?

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo S.H.-Teichhof,

wenn er denselben MenuItem verwendet, ist eben der Sender immer derselbe.

herbivore

1.549 Beiträge seit 2004
vor 18 Jahren

ups hatte überlesen das es der gleiche sender ist war mein fehler

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

husky410 Themenstarter:in
225 Beiträge seit 2005
vor 18 Jahren

@herbivore:
wenn ich einen neuen menüpunkt mehrmals zulasse, dann habe ich irgendwann 5 Undo, oder 5 Copy Menübefehle, weil 5 verschiedene komponenten diesen brauchen!

@S.H.-Teichhof:
Aber der sender ist doch immer der gleiche, nämlich der eine menüpunkt...

1.549 Beiträge seit 2004
vor 18 Jahren

und wenn du den Verschiedenen Punkten den gleichen Text und unterschiedliche namen gibst?

Wir Arbeiten eigendlich nicht wir nehmen nur das geld

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo husky410,

ach, es geht um eine MDI-Anwendung? Dann musst du nur eine MenuItem und nur einen EventHandler verwenden und in diesem EventHandler abfragen, welche Komponente gerade aktiv ist.

herbivore

husky410 Themenstarter:in
225 Beiträge seit 2005
vor 18 Jahren

Ja.
Nur das Problem ist, dass die Komponente den EventHandler hat und nicht ich bzw. die weitere komponenten jederzeit hinzukommen könnten.
Beispiel (habe einfache buttons genommen):

:::


Button fremdbutton1 = new Button();
fremdbutton1.Click += new EventHandler(fremdbutton1_Click);
void fremdbutton1_Click(object sender, EventArgs e)
{ // mach irgendwas }

// Fremd-Komponente2, dieser code liegt ebenfalls ausserhalb:


Button fremdbutton2 = new Button();
fremdbutton2.Click += new EventHandler(fremdbutton2_Click);
void fremdbutton2_Click(object sender, EventArgs e)
{ // mach irgendwas }

// Meine Komponente


Button masterbutton = new Button();
.... Get Fremdbuttons(...)
{
  for(....)
  {
    masterbutton.Click += fremdbuttons[].EventHandler 
  }
}
Oder sehe ich den Wald vor lauter Bäumen nicht !????! (EDIT){red}(Talla): Bitte Code Tags verwenden!
49.485 Beiträge seit 2005
vor 18 Jahren

Hallo husky410,

dann darfst du eben nicht direkt die EventHandler der Komponenten registrieren, sondern musst eine Weiche in Form eines eigenen/übergreifenden EventHandlers einrichten.

herbivore

K
3 Beiträge seit 2006
vor 18 Jahren

Kann hier bitte jemand ein Beispiel posten (verstehe nur Bahnhof bzgl. "Weiche in Form", ...).

Danke.

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo klabauter,

ein Beispiel habe ich nicht, aber schwer ist es auch nicht. Da das Menü zum MdiParent gehört, aber in der Regel auf die MdiChilds wirken sollen, es aber auch nicht geht/sinnvoll ist, dass die MdiChilds ihre EventHandler direkt registrieren, muss eben der MdiParent einen EventHandler registrieren, in diesem EventHandler feststellen, welches MdiChild-Aktiv ist und dessen EventHandler oder Methoden aufrufen.

herbivore

K
3 Beiträge seit 2006
vor 18 Jahren

hallo herbivore

Wenn ich das richtig verstehe, dann muss ich das wie folgt machen:

Beim Klick im MDI auf den Speichern Knopf wird das Clickevent ausgeführt. Dort schau ich welches Child gerade offen ist und starte eine Methode im Child.

Dadurch muss ich aber im Click Event beim Speichernknopf jedes Child berücksichtigen.

Kann ich nicht einfach ein Save Event in jedem Child (zB in einer Form-Base) erstellen und das Save Event im MDI sendet diesen einfach an das aktive Child weiter (hab allerdings keine Ahnung wie das geht)?

klabauter

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo klabauter,

ja, das kannst du so machen. Also die Form-Oberklasse deklariert die (virtual) Save-Methode. Und die Unterklassen überschreiben die Save-Methode (override). Wenn alle deine Mdi-Childs von der Oberklasse erben, dann kannst du das aktive MdiChild einfach auf den Oberklassen-Typ casten und Save aufrufen.

herbivore