Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TMainMenu duplizieren (https://www.delphipraxis.net/140379-tmainmenu-duplizieren.html)

Keks 17. Sep 2009 00:04


TMainMenu duplizieren
 
Ich benötige auf einer zweiten Form das MainMenu der MainForm etwas abgeändert.
Da das Menü dynamisch erzeugt wird, würde ich mir diesen Aufwand für die zweite Form gerne sparen und einfach das erste Menü kopieren, leicht abwandeln und zuweisen/anzeigen.

Leider weiß ich nicht, wie ich das nun am einfachsten machen kann. Ein einfaches Zuweisen resultiert in "Menu 'MM' is already being used by another form" - es wird also eher ein Verweis übergeben und nicht wirklich kopiert.

Wie dann? Alle Items und Subitems in Schleifen oder regressiv durchgehen finde ich zu umständlich.

Wie also am einfachsten?

himitsu 17. Sep 2009 00:17

Re: TMainMenu duplizieren
 
Zitat:

Zitat von Keks
Wie dann? Alle Items und Subitems in Schleifen oder regressiv durchgehen finde ich zu umständlich.

ich befürchte das wird der gängige Weg sein
alles durchgehn und je gefundenem item eine Kopie (ein Neues Item, mit selber Caption und Co.) erstellen

man könnte auch einfach die HauptItems im Menü auf das andere Menü übertragen, aber dabei würden sie aus dem QuellMenü verschwinden



eine einfache Lösung wäre aber:
- du erstellst also das "Original"-Menü dynamisch?
- dann leg den Code zum Erstellen in eine gemeinsame Prozedur, welcher du die jeweilige Form übergibst)
- rufe diese Funktion einmal für die erste Form auf und laß dort das Menü erstellen
- und dann einfach nochmal die selbe Prozedur für deine neue Form aufrufen und dort wieder ein Menü erstellen lassen

- in der Prozedur kannst du dann ja auf via IF-Then die änderungen, welche du eigentlich nachträglich machen woltest direkt beim Aufbau des Menüs einfließen lassen.

Keks 17. Sep 2009 00:32

Re: TMainMenu duplizieren
 
Danke für die schnelle nächtliche Antwort :)

Zitat:

Zitat von himitsu
- du erstellst also das "Original"-Menü dynamisch?

Naja, Teile davon. Sonst hätte ich Deinen Vorschlag schon umgesetzt gehabt. :)
Es ist ein überschaubarer Aufwand, es so umzubasteln, dass es komplett dynamisch erstellt wird. Dachte aber, das kann ich mir evtl. sparen.

Schade, dass es keine einfache Funktion dafür gibt. :(
Naja, ich lass das hier erstmal noch so stehen. Falls jemandem noch was einfaches einfällt, bitte Bescheid geben. Ansonsten bau ich das morgen Abend dann wirklich so um.

Satty67 17. Sep 2009 08:50

Re: TMainMenu duplizieren
 
Man könnte mit Merge Form1.TMainMenu vor Aufruf von Form2 an Form2.TMainMenu kleben, danach (noch vor Anzeige des Form2) weitere Anpassungen.

Ob man Merge besser nur einmal beim Form2.Create aufruft und wie sich das dann ganz genau verhält, müsstest Du testen. Eine 1:1 Kopie funktioniert tadellos. Auch mehrfacher Aufruf von Merge erzeugt keine doppelten Einträge.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.MainMenu2.Merge(MainMenu1);
  Form2.ShowModal;
end;
PS: Sehe gerade in der Delphi Hilfe (zumindest von D5) ist auch eine elegante Vorgehensweise beschrieben, wenn beide Menüs in Teilen von einander abweichen.

Keks 17. Sep 2009 14:05

Re: TMainMenu duplizieren
 
Mit Merge kannn ich eine 1:1 "Kopie" erstellen. Diese lässt sich aber leider nicht bearbeiten, weil hier das Original-Menü quasi als Verweis eingebunden wird.

Wo genau hast Du das Beispiel in der Delphi-Hilfe gefunden?
In Delphi 2006 finde ich zumindest unter "TMainMenu.Merge Methode" nichts.

Satty67 17. Sep 2009 14:14

Re: TMainMenu duplizieren
 
Hmm, habe es nur schnell 1:1 getestet, da mir die Hilfe sugerierte, dass es auch nach Deinen Wünschen geht.

Ich zitiere mal aus der Delphi-5 Hilfe, denke als Ausschnitt sollte das soweit erlaubt sein:
Zitat:

Beschreibung

Rufen Sie Merge auf, um ein anderes Hauptmenü mit dem vorliegenden Hauptmenü zu kombinieren. Im Parameter Menu geben Sie das Menü an, das mit diesem Menü kombiniert werden soll.

Wenn zum Beispiel das Hauptmenü des ersten Formulars einer Anwendung als Hauptmenü für die gesamte Anwendung verwendet werden soll, integrieren Sie durch einen Aufruf von Merge die Hauptmenüs aller weiteren Formulare der Anwendung in das Hauptmenü des ersten Formulars.

Abhängig vom Wert der Eigenschaft GroupIndex der Einträge des Hauptmenüs können Einträge ersetzt oder neu hinzugefügt werden. In der Beschreibung von GroupIndex finden Sie dazu detaillierte Informationen.

Wenn die Kombination von Menüs bei der Anzeige eines anderen Formulars automatisch durchgeführt oder aufgehoben werden soll, setzen Sie die Eigenschaft AutoMerge aller Formulare, deren Menüs integriert werden sollen, auf True.
Schnell getestet:

Lege für zusätzliche Menüpunkte in Form2.MainMenu einen anderen GroupIndex fest, danach Merge mit Form1.MainMenu. Voila sind aus beiden die MenuItems kombiniert.

Problem:

Hauptmenu-Punkte tauchen dann doppelt auf. Also Innerhalb z.B. dem Datei-Menü einzelne Sub-Einträge zuzufügen scheint nicht zu funktionieren, es erschein ein zweites Datei-Menü. (Also Funktionsweise wie bei MDI-Anwendungen)

Anders ausgedrückt, werden beim Merge alle Einträge eines GroupIndex entfernt, wenn dieser GroupIndex beim zugefügten Menü bereits existiert. Guppen können nicht gemischt werden, sondern nur weitere MenüGruppen zugefügt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz