HMENU zur laufzeit die Beschriftung herausbekommen
Hallo Community,
Ich erzeuge zur Laufzeit ein PopUp-Menü dabei sind die einzelnen Einträge unterschiedlich, sprich, die Beschriftung ist anders! Wie kann ich nun anhand der Messages den Text herrausbekommen, mit welchem ich das Menü erzeugt habe? Danke schon mal im vorraus... |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Sorry das ich Pushe, aber ich komm irgendwie nicht so recht weiter *grummel*
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Non-VCL?
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
ja, nonVCL
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Ich habe leider gerade kein Delphi zur Hand aber ich würde wie folgt vorgehen.
Ein Popupmenu nehmen und einen Eintrag anlegen. Dann per Quelltext die Caption abfragen (in etwa: PopupMenu1.Items[i].Caption) und dann nach der Declaration von Caption suchen (rechtsklick und entsprechenden Punkt im Menü auswählen oder Strg + Linke Maustaste auf Caption) |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Das wäre dann aber VCL
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Nein, wäre es nicht. Das war eine beschreibung wie ich heraus finden würde wie es nonvcl geht. Denn im Source der VCL steckt mehr oder weniger tief vergraben der nonvcl aufruf. Und wenn man die Declaration sucht und dort schaut wie es in der VCL implementiert ist findet man eben den nonvcl-Aufruf :-)
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Ja, VCL weiß ich wie ich es machen würde...
Naja, ist für meinen MediaPlayer! Lade die Filter als PopUp-Menü, und wollte dann bei Click Sie weiterverarbeiten! Da ich aber nicht weiß, welcher Filter, welchem Menü zugeordnet wurde, brauche ich die Bezeichnung, denn beim laden wird die ja nach dem Filter benannt! |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
wie gesagt sollst du es auch nicht mit der VCL machen sondern einfach in den VCL Sourcen schauen ;-) Da ich gerade kein Delphi zur Hand habe kann ich nicht selbst schauen und habe daher beschrieben wo/wie ich schauen würde.
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Also die VCL macht es über MenuItemInfo.dwTypeData
Damit hatte ich auch schon rumgespielt, naja aber irgendwie kommt da bei mir nicht vernünftiges bei raus ;-)
Delphi-Quellcode:
Hat denn jemand ne ahnung wieso die funktion fehlschlägt??
GetMenuItemInfo(hFilterPopUpMenue, loword(wParam), False, MenuItemInfo1)
//loword(wParam) = ID des Menüs |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Welchen Fehler gibt GetLastError?
Was mich verwundert - Laut msdn hat die Funktion nur 3 Parameter :gruebel: |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Mhh als Fehler kommt "Falscher Parameter"..
hab noch das hier gefunden: Zitat:
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Habe jetzt ne Möglichkeit gefunden!
Mit folgender Funktion hab ichs gemacht:
Delphi-Quellcode:
GetMenuString
function GetMenuString(hMenu: HMENU; uIDItem: UINT; lpString: PChar;
nMaxCount: Integer; uFlag: UINT): Integer; stdcall; |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Mhh, jetzt hab ich doch noch nen Problem!
Zuerst ging es, und nun auf einmal kommt ne Fehlermeldung wenn die Zeile mit "GetMenuString" ausgeführt wird!
Delphi-Quellcode:
so lief es, bis heute Morgen, bis vorhinn!! Nun auf einmal kommt ne Fehlermeldung:
var
MenuTemp: PChar; WM_COMMAND: ... 10001..11000: begin; MenueTemp := ''; {Fehler-->}GetMenuString(hFilterPopUpMenue, LoWord(lParam), MenueTemp, 255, MF_BYCOMMAND); //Restlicher Abschnitt funktioniert, getestet.. if Length(MenueTemp) > 0 then if Assigned(Graph) then if Succeeded(Graph.FindFilterByName(StringToOleStr(MenueTemp), Filter)) then begin; ShowFilterPropertyPage(hWnd, Filter); Filter := nil; end; end; Zitat:
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Wo wird der Speicher für MenueTemp reserviert?
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Auserhalb der Fenster Funktion, also gleich am Anfang der Unit.
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Hm, ich hätte ihn lokal angefordert. Aber forderst du auch genug an? Laut der Hilfe wird ja der erforderliche Speicher in einem Parameter der Funktion zurückgegeben. Die übliche Vorgehensweise ist, dass man die Funktion erstmal mit nil aufruft und dann ein zweites mal mit dem erfordrlichen Speicher.
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Aso, um den nötigen Speicher zu reservieren?? aber wie mach ich das genau?? hättest du nen bsp?? Und ist es gut so, wie ich "MenueTemp" deklariert hab??
|
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Ich versteh es nicht *grummel*
ich hab es jetzt so nochmal versucht (das hab ich hier auch im Forum gefunden)
Delphi-Quellcode:
Ich bekomme einfach die Caption des Menüs nicht mehr ausgelesen, woran kann das noch liegen??
var
len: integer; MenueString: String; begin; len := GetMenuString(hFilterPopUpMenue, LoWord(lParam), nil, 0, MF_BYCOMMAND); SetLength(MenueTemp, len + 1); GetMenuString(hFilterPopUpMenue, LoWord(lParam), PChar(MenueTemp), (len + 1), MF_BYCOMMAND);// <> 0 then ... |
Re: HMENU zur laufzeit die Beschriftung herausbekommen
Delphi-Quellcode:
Dazu passendes Menü:
procedure TForm2.Button1Click(Sender: TObject);
var MenuString: PChar; len: Integer; begin len := GetMenuString(GetSubMenu(MainMenu1.Handle, 0), 0, nil, 0, MF_BYPOSITION); if (len > 0) then begin GetMem(MenuString, len + 1); try GetMenuString(GetSubMenu(MainMenu1.Handle, 0), 0, MenuString, len + 1, MF_BYPOSITION); ShowMessage(MenuString); finally FreeMem(MenuString); end; end; end;
Code:
"Test" ist der nullte Submenüneintrag vom Hauptmenü "Datei".
Datei
Test |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:07 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