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/)
-   -   HMENU zur laufzeit die Beschriftung herausbekommen (https://www.delphipraxis.net/124824-hmenu-zur-laufzeit-die-beschriftung-herausbekommen.html)

lbccaleb 25. Nov 2008 21:53


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...

lbccaleb 26. Nov 2008 09:28

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Sorry das ich Pushe, aber ich komm irgendwie nicht so recht weiter *grummel*

mkinzler 26. Nov 2008 09:29

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Non-VCL?

lbccaleb 26. Nov 2008 09:32

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
ja, nonVCL

SirThornberry 26. Nov 2008 09:38

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)

mkinzler 26. Nov 2008 09:42

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Das wäre dann aber VCL

SirThornberry 26. Nov 2008 09:45

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 :-)

lbccaleb 26. Nov 2008 09:46

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!

SirThornberry 26. Nov 2008 09:49

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.

lbccaleb 26. Nov 2008 10:06

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:
GetMenuItemInfo(hFilterPopUpMenue, loword(wParam), False, MenuItemInfo1)
//loword(wParam) = ID des Menüs
Hat denn jemand ne ahnung wieso die funktion fehlschlägt??

SirThornberry 26. Nov 2008 10:18

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Welchen Fehler gibt GetLastError?
Was mich verwundert - Laut msdn hat die Funktion nur 3 Parameter :gruebel:

lbccaleb 26. Nov 2008 10:55

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Mhh als Fehler kommt "Falscher Parameter"..


hab noch das hier gefunden:

Zitat:

Zitat von MSDN
To retrieve a menu item of type MFT_STRING, first find the size of the string by setting the dwTypeData member of MENUITEMINFO to NULL and then calling GetMenuItemInfo. The value of cch+1 is the size needed. Then allocate a buffer of this size, place the pointer to the buffer in dwTypeData, increment cch by one, and then call GetMenuItemInfo once again to fill the buffer with the string.

If the retrieved menu item is of some other type, then GetMenuItemInfo sets the dwTypeData member to a value whose type is specified by the fTypefType member and sets cch to 0.

Windows 98/Me and Windows 2000/XP: dwTypeData and cch are used with MIIM_STRING.

Windows 95/98/Me: GetMenuItemInfoW is supported by the Microsoft Layer for Unicode. To use this, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.

Aber das verstehe ich irgendwie nicht!

lbccaleb 26. Nov 2008 12:46

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Habe jetzt ne Möglichkeit gefunden!

Mit folgender Funktion hab ichs gemacht:


Delphi-Quellcode:
function GetMenuString(hMenu: HMENU; uIDItem: UINT; lpString: PChar;
  nMaxCount: Integer; uFlag: UINT): Integer; stdcall;
MSDN-Library durchsuchenGetMenuString

lbccaleb 28. Nov 2008 19:59

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:
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;
so lief es, bis heute Morgen, bis vorhinn!! Nun auf einmal kommt ne Fehlermeldung:

Zitat:

---------------------------
Application Error
---------------------------
Exception EAccessViolation in module user32.dll at 00062785.

Access violation at address 76FA2785 in module 'user32.dll'. Write of address 0041E290.


---------------------------
OK
---------------------------

Luckie 28. Nov 2008 20:12

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Wo wird der Speicher für MenueTemp reserviert?

lbccaleb 28. Nov 2008 20:18

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Auserhalb der Fenster Funktion, also gleich am Anfang der Unit.

Luckie 28. Nov 2008 20:22

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.

lbccaleb 28. Nov 2008 20:28

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??

lbccaleb 29. Nov 2008 13:13

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:
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

...
Ich bekomme einfach die Caption des Menüs nicht mehr ausgelesen, woran kann das noch liegen??

Luckie 29. Nov 2008 13:37

Re: HMENU zur laufzeit die Beschriftung herausbekommen
 
Delphi-Quellcode:
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;
Dazu passendes Menü:
Code:
Datei
  Test
"Test" ist der nullte Submenüneintrag vom Hauptmenü "Datei".


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