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 Menü selber zeichnen (https://www.delphipraxis.net/22649-menue-selber-zeichnen.html)

Lollipop 20. Mai 2004 20:46


Menü selber zeichnen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe Schwierigkeiten, mein Menü selber zu zeichnen. Um alle Zeichenoperationen korrekt durchführne zu können, möchte ich wissen ob es sich bei dem TMenuItem, den ich zeichne, um einen Eintrag aus einem 'heruntergeklappten' Menü handelt (im Screenshot rot gekennzeichnet) oder um einen der Einträge, die permanent in der Menüleiste zu sehen sind (im Screenshot gelb gekennzeichnet).

Ich habe es mit der Eigenschaft 'Parent' versucht, mit 'Parent.Name' und allerhand anderen Dingen - scheinbar habe ich die einzig 'wahre' Eigenschaft dafür bislang übersehen.
Nun probiere ich aber schon so lange herum, dass ich bald Schaum vor dem Mund bekomme, wenn ich dieses Menü nicht bald mal anständig zeichnen kann. :-(

Ich hoffe, mir kann einer helfen. --> :dp:

Nicodius 20. Mai 2004 20:55

Re: Menü selber zeichnen
 
ich weiß zwar nicht ob ob ich das jetz trichtig verstehe aber --< wenn ichs so verstehe dann gib ich dir ein stichwort sets! --> oder array .. dort speicehrst du die einzelnen Werte(ob vorher drinnen oder nicht) und dann kontrolleirst du ob das vorher sichtbar war oder nicht


sorry falls ich dich missverstanden habe

Lollipop 20. Mai 2004 21:02

Re: Menü selber zeichnen
 
Halo Nico,

danke für Deine Antwort, aber ich habe mich vermutlich ungenau ausgedrückt.

Mein Problem sitzt im Ereignis 'OnAdvancedDrawItem' der Klasse 'TMenuItem'. Innerhalb dieses Ereignisses möchte ich wissen, ob der Menüpunkt, für den dieses Ereignis gerade ausgelöst wurde, einer derjenigen ist, die die horizontale Menüleiste bilden ('Datei' 'Bearbeiten' 'Format' 'Ansicht' 'Hilfe' zum Beispiel für Notepad). Als Alternative kann sich so ein Menüpunkt ja auch in dem 'klappbaren' Teil des Menüs befinden ('Neu' 'Öffnen' 'Sichern' 'Sichern unter' 'Drucken' 'Beenden' für ein typisches 'Datei'-Menü).

Und ich will bzw. muss nun herausfinden, in welcher der beiden Alternativen sich mein aktueller Menüpunkt befindet, da das Design leicht unterschiedlich sein soll.


Lolli


P.S.: Da ich eine Klasse für alle möglichen Menüs entwickle, mag ich mir zur Designzeit keine feste Liste an Menüpunkten erstellen, für die ich ein anderes Design benötige.

alcaeus 20. Mai 2004 21:05

Re: Menü selber zeichnen
 
Also, du gehst die Eigenschaft "Items" des MainMenus durch, dort stehen alle Menüpunkte drin. Darin kommen aber nur die Items vor, die du auch direkt im Menü siehst, keine Untermenüs und nichts. Mit Hilfe des Namens der Komponente dürfte das Problem schnell gelöst sein.

Lollipop 20. Mai 2004 21:23

Re: Menü selber zeichnen
 
:wall:
Meine IF-Abfrage war falsch geklammert.

Das haut hin:
Code:
isMainMenu:= (mItem.GetParentMenu.Items.IndexOf( mItem ) > -1);
Danke an Euch beide. :dp:


Lolli

Robert_G 20. Mai 2004 22:20

Re: Menü selber zeichnen
 
So wäre es auch gegangen:
Delphi-Quellcode:
procedure SetItemEvent(aMenuItem:   TMenuItem;
                       aMeasureItem: TMenuMeasureItemEvent;
                       aDrawItem:   TAdvancedMenuDrawItemEvent);
var
  i                : Integer;
begin
  for i := 0 to pred(aMenuItem.Count) do
    with aMenuItem.Items[i] do
    begin
      OnAdvancedDrawItem := aDrawItem;
      OnMeasureItem     := aMeasureItem;
      SetItemEvent(aMenuItem.Items[i], aMeasureItem, aDrawItem);
    end;
end;

procedure TFormIrgendWas.FormCreate(Sender: TObject);
var
  i                : Integer;
begin
  for i := 0 to pred(MainMenu1.Items.Count) do
    with MainMenu1.Items[i] do
      SetItemEvent(MainMenu1.Items[i], SubItemMeasureItem, SubItemAdvancedDrawItem);
end;
Die beiden Events musst du dann nicht mehr jedem Item im OI zuweisen. ;)

Lollipop 21. Mai 2004 07:36

Re: Menü selber zeichnen
 
Hallo Robert,

nene. Jeden Eintrag per Hand zuzuweisen, wäre mir auch zu aufwändig gewesen. ;-) Im Prinzip verfolgen wir ja beide die gleiche Idee - ich hatte es nun noch vom Form gelöst. Die erste Methode ist öffentlich und arbeitet sich ein beliebiges Menü. Die zweite Methode ist im 'private'-Abschnitt meiner Klasse deklariert und verrichtet die eigentliche 'Drecksarbeit'. ;-)


Delphi-Quellcode:
Procedure t_MenuPainter.AttachToMenu( aMenu : TMenu );
var mIndex : Integer;
Begin
  aMenu.OwnerDraw:= TRUE;

  For mIndex:= 0 To aMenu.Items.Count-1 Do
    AttachToMenuItem( aMenu.Items.Items[mIndex] );
End;

Procedure t_MenuPainter.AttachToMenuItem( aMenuItem : TMenuItem );
var mIndex : Integer;
Begin
  aMenuItem.OnMeasureItem:= doMeasureItem;
  aMenuItem.OnAdvancedDrawItem:= doAdvancedPaint;

  For mIndex:= 0 To aMenuItem.Count-1 Do
    AttachToMenuItem( aMenuItem.Items[mIndex] );
End;


Lolli --> :dp:


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