![]() |
D12 VCL Eingabefokus nach Menü-Hotkeys
Ein blödes Problem, das ich noch nicht lösen konnte:
Ich habe Child-Formulare, die ich aus einem Hauptmenü heraus aufrufe. Wenn ich in meinem Programm einen Style (nicht "WINDOWS") verwende, so passiert folgendes: Bei Aufruf meiner Child-Form per Menü-Hotkeys (also nicht per Maus) hat direkt danach weiter das Hauptmenü den Eingabe-Fokus. Das passiert nicht bei Style "WINDOWS". Es gibt nun Kunden, die es gewohnt sind, viel mit den Hotkeys zu arbeiten und direkt nach Aufruf eines Programmpunkts erwarten, dort Eingaben zu machen (z.B. ebenfalls per Hotkey ein Suchfenster zu öffnen). Die geraten jetzt ins Stolpern, da sie zuerst mal das neu aufgemachte Child-Fenster per Maus anklicken müssen. Ich hab schon allerlei Versuche gemacht, den Fokus zur frisch geöffneten Form zu kriegen, aber ohne Erfolg. Vielleicht hat hier jemand eine Idee oder sogar eine Lösung? Winfried. |
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Zeig doch mal etwas Code.
|
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Zitat:
|
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
hallo Peter,
es ist eine MDI-Applikation. Die Child-Forms werden im Click-Event des Menüs instanziert. Leider ist die Applikation extrem groß und komplex (1026 eigene Units aus 26 Jahren Entwicklung + Fremdsoftware) und meine Vermutung, dass das Problem allgemeiner Natur ist, hat sich leider zerstreut. Ein vereinfachter Nachbau der Grund-Elemente (MDI-Parent, Menü, MDI-Child, User-Style) hat nämlich das Problem nicht und ich muss mich jetzt durch Vereinfachung der Problem-App an den Fehler ranhangeln. Breakpoints sind dabei leider kaum nützlich, da sie sofort zu einem Fokus-Wechsel führen. Seltsame Verhaltensweisen hab ich, seit ich Styles verwende, schon häufiger gehabt und die Fehlersuche war jedes Mal recht mühsam. |
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Liste der Anhänge anzeigen (Anzahl: 1)
inzwischen ist es mir doch gelungen, den Fall in einem einfachen Projekt nachzustellen, und ich denke, es handelt sich um einen Bug in der Delphi-Runtime. Eigentlich müsste ein einfacher Workaround möglich sein, aber bislang sind all meine Versuche gescheitert.
Es ist eine VCL-MDI-Anwendung mit einem Style; ich habe im Beispiel mal den "Iceberg Classico" verwendet. Das Hauptfenster bekommt ein Menü, das per &-Shortcuts steuerbar ist (Alt-Taste und markierter Buchstabe). Irgendein MDI-Child ist bereits geöffnet. Ich instanziere und öffne eine neue MDI-Child-Form per &-Shortcut. Dann ist weiterhin der Fokus auf der Menüleiste; jeglicher weiterer Tastendruck landet im Menü und nicht in meiner neuen Form. Das passiert nicht, wenn als Style "Windows" genommen wird. Das passiert nicht, wenn zuvor keine andere Form aktiv war. Das passiert nicht, wenn das Menü per Maus bedient wird. Das passiert auch nicht, wenn man zuerst nur die Alt-Taste drückt und wieder loslässt. Dann ist das Menü ja auch aktiviert und man kann ohne Alt-Taste fortfahren im Menü. Ich lege mal das Beispielprojekt gezippt hier rein. Mit Alt-T F öffnet sich Form1. Der Fokus sollte dann auf dessen Exit-Button liegen und ein simple E sollte die Form schließen. Tut es aber nicht. |
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Zitat:
Ein
Delphi-Quellcode:
nach dem Show könnte Abhilfe schaffen...
Unit1.Form1.SetFocus;
|
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
hallo Olli,
ein SetFocus war natürlich mein erster Versuch. Hab's an allen möglichen Stellen probiert, ohne Erfolg. Es gibt leider auch nichts (mir bekanntes), um dem Menü den Fokus zu entziehen. Ich hab das Projekt auch mal probeweise mit D11 kompiliert; da ist der Fehler auch schon drin. Zur Sache mit der Alt-Taste: Ich hab hier sogar noch eine D2007-Version des Programms, die noch gewartet wird. Da funktioniert alles richtig. Das Problem ist, soweit ich das erkennen kann, erst mit den Styles reingekommen. Dummerweise ist der Fehler ein halbes Jahr im Testbetrieb niemandem aufgefallen und jetzt, da die Auslieferung an die Kunden gestartet ist, wird es richtig eng. |
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Programme im Hintergrund haben nicht das Recht sich selbstständig in den Vordergrund zu drängeln.
Das aktive Programm darf aber fremde Programme vorholen und ihnen die Kontrolle übergeben. ![]() ![]() ... Wenn dein Programm durch irgendwass kurz den Fokus verliert, dann ist es am Arsch. z.B. ein Fenster schließen, wo es fehlschlägt einem anderen eigenem Fenster vorübergehend den Fokus zu überlassen und erst dann das Neue öffnen. passiert z.B. selbst der Delphi-IDE gern, wenn gewisse Options-/Fehlerdialoge geschlossen werden. Oder, was ich grade eben als Problemchen hatte. * ein Vorauswahldialog geht im OnCreate auf * der wird geschlossen (Klick auf OK-Knopf) und es tritt ein Fehler auf (hier in einem Query mit defektem SQL) * der Fehlerdialog erwischt noch das grade noch aktive Vorauswahl-Fenster und merkt sich dessen Handle (HWND) * * VCL-Dialoge merken sich im ShowModal den Vorherrigen und wollen anschließend den Fokus zurück dahin verschieben * der Vorgänger ist inzwischen weg, es tritt sowas wie ein Windows.SetFocus(0) auf * und das Programm wird ganz nach hinten geschoben, hinter alle Fenster anderer Programme |
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Zitat:
Probiere Mal:
Delphi-Quellcode:
PostMessage(Unit1.Form1.Handle, WM_SYSKEYDOWN , VK_MENU, 0);
PostMessage(Unit1.Form1.Handle, WM_SYSKEYUP , VK_MENU, 1); |
AW: D12 VCL Eingabefokus nach Menü-Hotkeys
Hi Olli,
mit Deiner Lösung geht's. Kann sogar in FormCreate-Events der Basis-Formulare eingebaut werden, womit das Problem einfach zu lösen ist. Muss ich nur noch intensiv testen, ob es in allen Situationen problemfrei funktioniert. Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:34 Uhr. |
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-2025 by Thomas Breitkreuz