Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GetMenuItemInfo -> falscher Parameter (https://www.delphipraxis.net/61823-getmenuiteminfo-falscher-parameter.html)

Luckie 26. Jan 2006 20:01


GetMenuItemInfo -> falscher Parameter
 
Ich bekomme bei diesem Code immer die obige fehlermeldung:
Delphi-Quellcode:
        hMenu := GetMenu(hDlg);
        hSubMenu := GetSubMenu(hMenu, 3);
        ZeroMemory(@mii, sizeof(TMenuItemInfo));
        if not GetMenuItemInfo(hSubMenu, 0, True, mii) then
          DisplayErrMsg(hApp, APPNAME, GetLastError);
        AppendMenu(mii.hSubMenu, MF_STRING, 0, 'Test');
Ich frage mich nur warum? :gruebel:

Noch etwas näheres zur Erklärung:

Code:
Benutzer | Ansicht | Extras | Hilfe
                              Sprache > Deutsch
                                        Englisch
Ich brauche das Handle vom Menüpunkt "Sprache", um dort dynamisch die Menüpunkte "Deutsch" und "Englisch" zu erstellen. Ob das mit AppenMenu geht, bin ich mir noch gar nicht mal so sicher, aber ich bekomme ja erst gar nicht das Handle auf den MenuIzem "Sprache".

Ich bin für jedwede Vorschläge offen.

Luckie 26. Jan 2006 20:46

Re: GetMenuItemInfo -> falscher Parameter
 
Man sollte alles lesen:
Zitat:

Note that you must set MENUITEMINFO.cbSize to sizeof(MENUITEMINFO) before calling this function.
:roll:

Aber mii.hSubMenu ist immer noch null. Der Menüpunkt "Sprache" ist als Popup deklariert in der Ressource. Und im PSDK steht:
Zitat:

hSubMenu
Handle to the drop-down menu or submenu associated with the menu item. If the menu item is not an item that opens a drop-down menu or submenu, this member is NULL. Set fMask to MIIM_SUBMENU to use hSubMenu.
Also sollte es das doch tun:
Delphi-Quellcode:
hMenu := GetMenu(hDlg);
hSubMenu := GetSubMenu(hMenu, 3);
ZeroMemory(@mii, sizeof(TMenuItemInfo));
mii.cbSize := sizeof(TMenuItemInfo);
mii.fMask := MIIM_SUBMENU;
GetMenuItemInfo(hSubMenu, 0, True, mii);
AppendMenu(mii.hSubMenu, MF_STRING, 0, 'Test');

turboPASCAL 26. Jan 2006 22:58

Re: GetMenuItemInfo -> falscher Parameter
 
Warum nicht so?
Code:
(0) (1)
File Help
     (0) Anderes
     (1) ---------
     (2) Sprache > Deutsch
                   Test
Delphi-Quellcode:
//..
  _hMenu := GetMenu(hwnd);
  _hSubMenu := GetSubMenu(_hMenu, 1);
  _hSubMenu := GetSubMenu(_hSubMenu, 2);
  AppendMenu(_hSubMenu, MF_STRING, 0815, 'Test');
  DrawMenuBar(hwnd);

Luckie 26. Jan 2006 23:02

Re: GetMenuItemInfo -> falscher Parameter
 
Auf meine Anwendung angepass:
Delphi-Quellcode:
        hMenu := GetMenu(hDlg);
        hSubMenu := GetSubMenu(hMenu, 3);
        hSubMenu := GetSubMenu(hSubMenu, 0);
        AppendMenu(hSubMenu, MF_STRING, 0815, 'Test');
        DrawMenuBar(hDlg);
Aber auch jetzt ist nach dem zweiten Aufruf von GetSubMenu hSubMenu immer 0.

turboPASCAL 26. Jan 2006 23:14

Re: GetMenuItemInfo -> falscher Parameter
 
Liste der Anhänge anzeigen (Anzahl: 3)
Also bei mir klappt das ohne Probleme.
Delphi-Quellcode:
var hMenu : HMENU;
Ist das so dekl. dann ändere doch mal in
Delphi-Quellcode:
var _hMenu : HMENU;
aber nicht in der DlgFuncProc als lokale Variable.

:gruebel:

Luckie 26. Jan 2006 23:55

Re: GetMenuItemInfo -> falscher Parameter
 
hMenu ist als THandle deklariert, was anderes wird HMENU auch nicht sein. Ich gucke mir mal deine Demo an.

In deiner Demo existiert schon der erste Eintrag, nämlich "Deutsch". Ich habe da aber noch keinen. So, wenn ich da schon einen habe, dann geht es auch. Hm, Deutsch wird da auf alle Fälle auftauchen, könnte ich also so machen.

Vielen Dank für deine Mühe mit der Demo. :thumb:

turboPASCAL 27. Jan 2006 00:09

Re: GetMenuItemInfo -> falscher Parameter
 
Bitte.

Eine Sprache würde ich gleich als "Programmsprache" integrieren. Es kann ja sein das versehentlich eine dll gelöscht wurde... erster Menüpunkt...


übrigens:

THandle = System.THandle = Cardinal
HMENU = type LongWord;

oder so.

Luckie 27. Jan 2006 00:11

Re: GetMenuItemInfo -> falscher Parameter
 
Ursprünglich ist auch alles Deutsch. Aber wenn man auf Englisch umstellt, die deutsche DLL löscht und dann wieder auf deutsch würde alles leer bleiben. Ich habe es hetzt so gemacht, dass wenn DLL nicht vorhanden gar nichts passiert und die ursprüngliche Sprache nicht geändert wird. Aber wer eine mitgelieferte DLL löscht, ist selber schuld. ;)

Trotzdem muss ich jetzt irgendwie tricksen, dass er die Deutsche DLL überspringt. :roll: Oder ich muss, wenn ich alle drinne habe, den ersten Dummy-Eintrag wieder löschen. ;)

turboPASCAL 27. Jan 2006 00:12

Re: GetMenuItemInfo -> falscher Parameter
 
:mrgreen:

Luckie 27. Jan 2006 01:21

Re: GetMenuItemInfo -> falscher Parameter
 
Es läuft. :hello: :firejump:

Jetzt brauche ich nur noch die Sprach-DLL zu erzeugen und brauche nur noch die DLLs zu verteilen. Der Bneutzer muss sie dann nur noch in das entsprechende Verzeichnis kopieren und er hat die Sprache zur Auswahl. :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz