Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 10:13 Uhr.
Seite 2 von 2     12   

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