Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi [NonVCL] PopupMenü - Auf das Anklicken eines Items reagieren (https://www.delphipraxis.net/70834-%5Bnonvcl%5D-popupmenue-auf-das-anklicken-eines-items-reagieren.html)

Daniel G 5. Jun 2006 15:46


[NonVCL] PopupMenü - Auf das Anklicken eines Items reagieren
 
Irgendwie finde ich den Titel doof, aber es ging nicht besser. Ok, mein Problem ist Folgendes:

Ich habe mein Programm erst mit der VCL vorgeschrieben, bis der Kern der Anwendung lief. Jetzt portiere ich das Projekt nach NonVCL und habe in der VCL - Anwendung Folgendes:

Delphi-Quellcode:
Procedure TForm1.ProgressItemClicks(Sender: TObject);
var
  MenuItemEx: TMenuItem;
begin
  if NOT (Sender is TMenuItemExtended) then
  begin
    ShowMessage('Unerwarteter Aufruf:' + #13#10 + #13#10 + Sender.ClassName);
    exit;
  end;

  MenuItemEx := TMenuItem(sender);
  MenuItemEx.Checked := True;
  Ardeo.DiscReadSpeed := MenuItem.Tag;
end;
Hintegrund: Beim Erstellen des Menüs wird eine unbekannte Anzahl an Menueinträgen erstellt. Der "OnClick" - Routine hatte ich die obige Prozedur zugewiesen. Klickt der Anwender jetzt auf ein Item, dann kann ich mir über den "Sender" den Text bzw. ein paar Werte holen. Die Frage ist jetzt, wie realisiere ich das NonVCL? Ich bin jetzt so weit:

Delphi-Quellcode:
 WM_TNAMSG:
      case lp of
        WM_RBUTTONUP:
          begin
            hm := CreatePopupMenu;
            AppendMenu(hm,MF_OWNERDRAW or MF_GRAYED,IDM_INFO_TEXT,'Drive Tranquilizer 0.1 Beta');
            AppendMenu(hm,MF_OWNERDRAW or MF_GRAYED,IDM_INFO_TEXT,'© 2006 by Daniel Gilbert');
            AppendMenu(hm,MF_SEPARATOR,IDM_INFO_TEXT,'');
            AppendMenu(hm,MF_OWNERDRAW or MF_GRAYED,0,PChar(RES_ACTIVATE));

            for i := 0 to DrivesArray.Count - 1 do
            begin
            hmSub[i] := CreatePopUpMenu;
            //Creates the Entry which displays the hmSub Menu
            AppendMenu(hm,MF_STRING or MF_POPUP,hmSub[i],PChar(DrivesArray.Drives[i].Name));
            //Creates Submenu
            AppendMenu(hmSub[i],MF_STRING,0,PChar('MAX'));
            AppendMenu(hmSub[i],MF_SEPARATOR,0,nil);

            For n := 0 to DrivesArray.Drives[i].count - 1 do
             begin
              Temp := PChar(IntToStr(DrivesArray.Drives[i].Speeds[n]) + 'X  [' + IntToStr(DrivesArray.Drives[i].Speeds[n]*176) + ' KB/s]');
              TempS := IntToStr(DrivesArray.Drives[i].HAID) + IntToStr(DrivesArray.Drives[i].LUN) + IntToStr(DrivesArray.Drives[i].Target) + '9' + IntToStr(DrivesArray.Drives[i].Speeds[n]);
              Val(TempS,ID,cod);
              AppendMenu(hmSub[i],MF_STRING,n,Temp);
             end;
            MenuInf.cbSize := SizeOf(TMenuInfo);
            MenuInf.fMask := MiM_STYLE;
            MenuInf.dwStyle := MNS_NOTIFYBYPOS;
           
            SetMenuInfo(hmSub[i],MenuInf);
            end;


            AppendMenu(hm,MF_SEPARATOR,0,'');
            AppendMenu(hm,MF_STRING,IDM_HELP,PChar(RES_HELP));
            AppendMenu(hm,MF_STRING,IDM_INFO,PChar(RES_INFO));
            AppendMenu(hm,MF_SEPARATOR,0,'');
            AppendMenu(hm,MF_STRING,IDM_EXIT,PChar(RES_EXIT));

            GetCursorPos(p);
            SetForegroundWindow(wnd);
            TrackPopupMenuEx(hm,TPM_RIGHTALIGN,p.X,p.Y,wnd,nil);

            for i := 0 to 23 do
              DestroyMenu(hmSub[i]);
            DestroyMenu(hm);


          end;
Meine Hoffnung war jetzt, dass wenn ich auf ein Item des Menüs hmSub[i] klicke, die Message "WM_MENUCOMMAND" gesendet wird. Wird sie aber irgendwie nicht. Was mache ich da Falsch? Oder gibt es eine andere Möglichkeit?

Verzweifelte Grüße vom
Daniel

MathiasSimmack 5. Jun 2006 16:30

Re: [NonVCL] PopupMenü - Auf das Anklicken eines Items reagi
 
Stichwort: Luckies API-Tutorials -> Kapitel über Menüs und/oder TNA-Tools :stupid:

Daniel G 5. Jun 2006 16:32

Re: [NonVCL] PopupMenü - Auf das Anklicken eines Items reagi
 
:wall:

Fehler:
Ich hab' Delphi-Referenz durchsuchenSetMenuInfo auf das Untermenü angewandt. Richtig ist es, diese Funktion auf das Hauptmenü anzuwenden. Falls jemand das Problem in Zukunft haben sollte. :zwinker:

@Mathias: Ähh.. danke. :wink:


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