Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Hilfe bei Menuitems mit Submenus
mandras - Fr 23.03.12 23:49
Titel: Hilfe bei Menuitems mit Submenus
Betr: Delphi 6
Mir fiel folgendes Verhalten eines MainMenu auf (alle Menuitems haben korrekte HelpContext-Einträge):
1- Wenn ein TMenuItem keine Unterpunkte aufweist wird, falls es markiert ist, die Online-Hilfe korrekt aufgerufen
2- Wenn Unterpunkte existieren wird die Online-Hilfe nicht aufgerufen.
Eine Debugger-Session führte zur Erkenntnis daß im Fall 2 kein HELP-Event erzeugt wird, warum auch immer. Ich denke es liegt am Mapping eines Windows-Menüs auf die VCL-Ebene.
Suchmaschinchen halfen mir nicht weiter, daher hier die Frage:
Gibt es einen Workaround so daß für die Einträge gemäß 2) das Hilfesystem aufgerufen wird?
jaenicke - Sa 24.03.12 09:04
mandras hat folgendes geschrieben : |
Ich denke es liegt am Mapping eines Windows-Menüs auf die VCL-Ebene. |
Nein, es liegt wohl eher am Windows-Menü selbst. ;-)
Windows erzeugt auch keine Click-Message für Menüeinträge, die Untermenüeinträge haben. Deshalb vermute ich mal auch in diesem Fall liegt es daran.
mandras - So 25.03.12 00:56
jaenicke hat folgendes geschrieben : |
mandras hat folgendes geschrieben : | Ich denke es liegt am Mapping eines Windows-Menüs auf die VCL-Ebene. | Nein, es liegt wohl eher am Windows-Menü selbst. ;-) |
Das meinte ich mit "Mapping".
Immerhin werden "WMMenuSelect"-Nachrichten gesendet. Damit kann ich festellen welcher Menüeintrag von der Maus gerade geärgert wird. Das kann ich abfangen und auch somit die HelpContext der jeweiligen Einträge feststellen. Und in Variablen speichern.
Aber: Solange Windows die Oberhoheit hat (also die Darstellung des Menüs erfolgt etc) reagiert die Applikation nicht auf F1.. Ich würde gerne auf Global Key Hooks verzichten.
Wüßte jemand wie ich auf möglichst einfache Art das Drücken der Taste F1 für die aktuelle Applikation abfangen kann WÄHREND Windows die Menüs handled?
Ja, ich weiß.. esoterische Frage.. Andererseits wäre mir eine konsistente Online-Hilfe auch ganz lieb. "Intiutiv" wäre das richtige Wort.
Moderiert von
Narses: Beiträge zusammengefasstIch denke ich habe das Problem gelöst.
Falls jemand anderes auch darüber stolpert hier der Code incl. Erläuterungen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75:
|
procedure Tmainform.WMMenuSelect(var Message: TWMMenuSelect); begin ActiveMenu := Message.Menu; ActiveMenuItem := Message.IDItem; ActiveMenuFlag := Message.MenuFlag; end;
function TMainForm.CheckContextHelp:integer; var MenuItem: TMenuItem; ID: Integer; FindKind: TFindItemKind; begin Result := 0; if Menu <> nil then begin MenuItem := nil; if (ActiveMenuFlag <> $FFFF) or (ActiveMenuItem <> 0) then begin FindKind := fkCommand; ID := ActiveMenuItem; if ActiveMenuFlag and MF_POPUP <> 0 then begin FindKind := fkHandle; ID := GetSubMenu(ActiveMenu, ID); end; MenuItem := Menu.FindItem(ID, FindKind); end; if (MenuItem <> nil) and (MenuItem.Count > 0) then begin if MenuItem.HelpContext <> 0 then Application.HelpContext(MenuItem.HelpContext); Result := 1; end; end; end;
function KeyboardHookProc(Code: Integer; WordParam: Word; LongParam: LongInt) : LongInt; begin case WordParam of vk_F1: begin result := Mainform.CheckContextHelp; exit; end; end; result:=0; end; |
jaenicke - So 25.03.12 14:27
Vorsicht, du klaust damit anderen Anwendungen den Keyboard-Hook, auch wenn du den Tastendruck gar nicht behandelst... keine gute Idee. ;-)
mandras - So 25.03.12 14:54
Berechtigter Einwand, ich denke aber hier nicht zutreffend da der (das?) Hook nur auf Applikationsebene definiert wurde. Andererseits, sollte in der Anwendung selbst noch irgendein Hook sein (von dem ich nicht zwangsläufig wissen muß), sollte die Kette korrekt forgesetzt werden. Danke für den Hinweis :)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!