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 Markiertes MainMenu-Item in Label ausgeben (https://www.delphipraxis.net/113931-markiertes-mainmenu-item-label-ausgeben.html)

IcyVeins 16. Mai 2008 23:23


Markiertes MainMenu-Item in Label ausgeben
 
Also,
nachdem ich die tolle Idee hatte, irgendwie ein OnClick in das dynamisch erstellte Menü zu hauen, bin ich zu dem Schluss gekommen, dass ich es auf nem anderen Weg versuchen sollte ( Ja, ich mach das noch nicht lange :P ). Also würde ich gerne die Caption des markierten Menü-items in ein Label ausgeben und dann ein globales OnClick mit ein paar Abfragen verwenden...
Hier mal der Code zum erzeugen des Menüs... Wenn mir jemand genau erklären könnte, wie ich es mit ner direkten OnClick-Abfrage hinbekomme, wär ich natürlich auch nicht abgeneigt :)


Über den Code:
Er dient dazu, die Ordnerstruktur eines Verzeichnisses in ein Menü zu packen, so wie die Windows Startleiste...
Delphi-Quellcode:
Procedure CreateTreeMenus( Path : String; Root : TMenuItem );
Var
   SR    : TSearchRec;
   Result : Integer;
   Item  : TMenuItem;
Begin
    Path := IncludeTrailingBackSlash( Path );
    Result := FindFirst( Path + '*.*', faDirectory, SR );
    While ( Result = 0 ) Do Begin
        If ( ( ( SR.Attr And faDirectory ) <> 0 ) And ( SR.Name <> '.' ) And ( SR.Name <> '..' ) ) Then Begin
            Item := TMenuItem.Create(Item);
            Item.Caption := SR.Name;
            Root.Add( Item );
            CreateTreeMenus( Path + SR.Name, Item );
        End;
        Result := FindNext( SR );
    End;
    SysUtils.FindClose( SR );
End;

Nuclear-Ping 16. Mai 2008 23:33

Re: Markiertes MainMenu-Item in Label ausgeben
 
Du musst halt einen Ereignis-Handler für den OnClick-Event machen. Ausserdem warum übergibst du bei TMenuItem.Create das Item selber als Owner ... ? :gruebel:
Delphi-Quellcode:
interface

type
  TForm1 = class (TForm)
    MainMenu1: TMainMenu; // ... oder so, dein Main-Menü halt
    // ...
  private
    procedure CreateTreeMenus (Path : String; Root : TMenuItem);
    procedure MyMenuOnClick (Sender: TObject);
    // ...
  end;

implementation
   
procedure TForm1.CreateTreeMenus (Path : String; Root : TMenuItem);
Var
   SR    : TSearchRec;
   Result : Integer;
   Item  : TMenuItem;
Begin
    Path := IncludeTrailingBackSlash( Path );
    Result := FindFirst( Path + '*.*', faDirectory, SR );
    While ( Result = 0 ) Do Begin
        If ( ( ( SR.Attr And faDirectory ) <> 0 ) And ( SR.Name <> '.' ) And ( SR.Name <> '..' ) ) Then Begin
            Item := TMenuItem.Create(Root); // wenn du schon ein Root übergibst, nutz es auch
            Item.Caption := SR.Name;
            Item.OnClick := MyMenuOnClick;
            Root.Add( Item );
            CreateTreeMenus( Path + SR.Name, Item );
        End;
        Result := FindNext( SR );
    End;
    SysUtils.FindClose( SR );
End;

procedure TForm1.MyMenuOnClick (Sender: TObject);
begin
  ShowMessage ((Sender as TMenuItem).Caption);
end;

IcyVeins 16. Mai 2008 23:38

Re: Markiertes MainMenu-Item in Label ausgeben
 
Danke erstmal :thumb:
Das war mal ein Code-Schnippsel aus den weiten des I-Nets...
Es funktioniert soweit, nur wenn ich jetzt auf ein Verzeichnis gehe, registriert er das als Klick, wenn er das Menü aufklappt... Kann man das irgendwie noch verfeinern?

Nuclear-Ping 16. Mai 2008 23:50

Re: Markiertes MainMenu-Item in Label ausgeben
 
Beim Aufruf eines Untermenüs wird ein OnClick ausgelöst? Aber nur weil du auch klickst, oder? :gruebel:

In dem MyMenuOnClick kannst du den Sender in eine TMenuItem-Variable casten (Item := (Sender as TMenuItem)) und da prüfen, ob er Untermenüs hat (weiß ich grad nicht aus dem Kopf, gibt da aber was wie ItemCount oder so). Wenn ja, wird die Funktion verlassen, wenn nein dann weiter.

IcyVeins 16. Mai 2008 23:58

Re: Markiertes MainMenu-Item in Label ausgeben
 
Es wird auch ohne Klick ausgelöst, habs aber dank deinem Tipp hinbekommen! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:40 Uhr.

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