AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Menü selber zeichnen

Ein Thema von Lollipop · begonnen am 20. Mai 2004 · letzter Beitrag vom 21. Mai 2004
Antwort Antwort
Lollipop

Registriert seit: 12. Feb 2003
5 Beiträge
 
#1

Menü selber zeichnen

  Alt 20. Mai 2004, 20:46
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. -->
Miniaturansicht angehängter Grafiken
pl_des_men_.gif  
  Mit Zitat antworten Zitat
Nicodius

Registriert seit: 25. Apr 2003
Ort: Graz
2.234 Beiträge
 
Delphi 2006 Architect
 
#2

Re: Menü selber zeichnen

  Alt 20. Mai 2004, 20:55
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
Nico Müller
  Mit Zitat antworten Zitat
Lollipop

Registriert seit: 12. Feb 2003
5 Beiträge
 
#3

Re: Menü selber zeichnen

  Alt 20. Mai 2004, 21:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

Re: Menü selber zeichnen

  Alt 20. Mai 2004, 21:05
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.
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Lollipop

Registriert seit: 12. Feb 2003
5 Beiträge
 
#5

Re: Menü selber zeichnen

  Alt 20. Mai 2004, 21:23

Meine IF-Abfrage war falsch geklammert.

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


Lolli
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#6

Re: Menü selber zeichnen

  Alt 20. Mai 2004, 22:20
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.
  Mit Zitat antworten Zitat
Lollipop

Registriert seit: 12. Feb 2003
5 Beiträge
 
#7

Re: Menü selber zeichnen

  Alt 21. Mai 2004, 07:36
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 -->
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 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