(Gast)
n/a Beiträge
|
[NonVCL] PopupMenü - Auf das Anklicken eines Items reagieren
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
|