Einzelnen Beitrag anzeigen

Daniel G
(Gast)

n/a Beiträge
 
#1

[NonVCL] PopupMenü - Auf das Anklicken eines Items reagieren

  Alt 5. Jun 2006, 16:46
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
  Mit Zitat antworten Zitat