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 Zwei PopUp's zusammenführen? (https://www.delphipraxis.net/109282-zwei-popups-zusammenfuehren.html)

taaktaak 27. Feb 2008 14:47


Zwei PopUp's zusammenführen?
 
Moin, Moin.

In einer von TTreeView abgeleiteten Komponente möchte ich ein PopUpMenü bereitstellen, welches Standardoperationen (Layout, Sortierung) bereitstellt. Mit Einbindung der Komponente steht dieses dem Anwendungsprogramm dann automatisch zur Verfügung und kann dann um anwendungsbezogene Aufgaben ergänzt werden.

Meine Überlegung ist nun, das anwendungsbezogene Popup "ganz normal" und ohne Bezug auf das in der Komponente enthaltene Popup zu definieren und in einem zweiten Schritt das neu erstellte Popup mit dem bereits in der Komponente enthaltenen zu einem optisch einzigen Popup zu "verschmelzen".

Natürlich könnte man das in der Komponente enthaltene Popup erweitern, aber vielleicht gibt es ja auch eine Möglichkeit, das vorstehend beschriebene "Verschmelzen" zu realisieren?

Hat jemand eine Idee, oder ist mein Denkansatz grundsätzlich nicht umzusetzen?

shmia 27. Feb 2008 17:16

Re: Zwei PopUp's zusammenführen?
 
Delphi-Quellcode:
procedure CloneMenuItem(source, dest : TMenuItem);
begin
   dest.Action := source.Action;
   dest.Caption := source.Caption;
   dest.ShortCut := source.ShortCut;
   dest.Checked := source.Checked;
   dest.Enabled := source.Enabled;
   dest.Visible := source.Visible;
   dest.OnClick := source.OnClick;

   dest.HelpContext := source.HelpContext;
   dest.Hint       := source.Hint;
   dest.RadioItem  := source.RadioItem;
end;

procedure CopyMenuItems(source, dest : TMenuItem);
var
   i : Integer;
   mi : TMenuItem;
begin
   Assert(Assigned(source), 'no source menu item');
   Assert(Assigned(dest), 'no destination menu item');
//   dest.Clear; // auskommentiert, da MenuItems im Ziel erhalten bleiben sollen

   for i :=0 to source.Count-1 do
   begin
      mi := TMenuItem.Create(dest);
      CloneMenuItem(source.Items[i], mi);
      dest.Add(mi);
      if source.Items[i].Count > 0 then
         CopyMenuItems(source.Items[i], mi); // rekursiver Aufruf ;-)
   end;
end;
Der Aufruf wäre dann:
Delphi-Quellcode:
CopyMenuItems(Komponente.PopupMenue.Items, PopupMenue1); // oder anderstrum, je nachdem, was dann das aktive PU-Menue sein soll

taaktaak 27. Feb 2008 17:48

Re: Zwei PopUp's zusammenführen?
 
Ja, das schaut ja wirklich sehr gut aus; werde es mal in Ruhe ausprobieren. Hatte nicht mit einer betriebsfertigen Lösung gerechnet. Aber wenn ich mir den Code so anschaue, muss ich doch stark bezweifeln, ob ich das, selbst bei konkreten Hinweisen, hinbekommenn hätte.

Vielen, vielen Dank shmia :hi:

taaktaak 27. Feb 2008 20:09

Re: Zwei PopUp's zusammenführen?
 
So, habe es jetzt mit Erfolg getestet!
Es funktioniert!
Im Aufrufbeispiel hat sich ein Flüchtigkeitsfehler eingeschlichen; es muss natürlich auch der zweite Parameter als Items übergeben werden:
Delphi-Quellcode:
CopyMenuItems(Komponente.PopupMenue.Items, PopupMenue1.Items);
 // oder andersrum, je nachdem, was dann das aktive PU-Menue sein soll
Thanks a lot :thumb:

taaktaak 27. Feb 2008 21:25

Re: Zwei PopUp's zusammenführen?
 
Leider, leider befällt mich nun eine gewisse Ernüchterung :cry:

Da das ganze ja letztlich ein KOPIEREN des einen in das andere PopUp darstellt, verliert das Programm den Zugriff auf Eigenschaften des kopierten PopUps. Ein deaktivieren/aktivieren eines Eintrags des "kopierten PopUps" ist nicht mehr möglich, da diese Operationen ja an das Original gesendet werden und nicht an die Kopie. Damit wäre mein Ansinnen dann doch uninteressant - oder bin ich schon wieder zu blöd eine Lösung zu finden?????

ULIK 28. Feb 2008 05:00

Re: Zwei PopUp's zusammenführen?
 
Den Code der beim Anwählen eines Menüpunkts ausgeführt wird nicht in den OnClick Handler des Menüitems legen sondern immer mit Actions arbeiten. Dann kannst Du eine Action beliebig vielen Items zuweisen und wenn Du sie deaktivieren willst: Action deaktivieren und schon sind alle zugehörigen Menüpunkte auch deaktiviert!
Und dann klappt auch der obige Codemit dem Duplizieren des Popups :-)

Grüße,
Uli

taaktaak 28. Feb 2008 07:43

Re: Zwei PopUp's zusammenführen?
 
Guten Morgen Uli,
vielen Dank für den Hinweis! :hi:

Hatte letzte Nacht noch weiter gegrübelt. Problem war, dass im OnClick des Source-PopUps einige Tests und Einstellungen von Untermenüs vorgenommen wurden. Das Source-PopUp-OnClick steht nach dem kopieren der Items in das Destination-Popup aber nicht mehr zur Verfügung.

Die Lösung in meinem konkreten Fall, liegt letztlich auf der Hand: Die Tests und Einstellungen mussten einfach nur in die OnClick-Events der Source-Items aufgenommen werden, die die jeweiligen Untermenüs aufrufen. Die OnClick-Events der einzelnen Items werden ja kopiert und stehen im Destination-Popup zur Verfügung - mein Ziel ist also erreicht!

Muss zu meiner Schade gestehen, dass ich noch nie (?! :oops: ) mit Actionlists gearbeitet habe, werde mir das einmal näher anschauen.

SirThornberry 28. Feb 2008 08:54

Re: Zwei PopUp's zusammenführen?
 
Ich würde am kopieren festhalten. Um Änderungen am Nutzermenü jedoch mit zu bekommen würde ich vor jedem anzeigen das Menü erneut kopieren (natürlich vorher die alten Einträge raus schmeißen).


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:26 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