![]() |
Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfokus.
Liste der Anhänge anzeigen (Anzahl: 2)
Beschreibung des Symptoms
Wenn man von „TCustomControl“ eine visuelle Komponente ableitet, dann liefert die Funktion „Focused“ in der „Paint“-Methode nicht das erwartete Ergebnis „true“, obwohl das Steuerelement den Fokus haben müsste. Dadurch, dass das Ergebnis von „Focused“ in der „Paint“-Methode nicht abgefragt werden kann, entfällt die Visualisierung des Fokus mit dem Aufruf von „DrawFocusRect“. Behebung des Fehlers Durch die Einführung einer Feldvariablen „fFocused“, der Eigenschaft „Focused“, der Überlagerung der virtuellen Methode „setFocus“ und die Umleitung einer Reihe von Windows-Botschaften kann die erwartete Funktionalität hergestellt werden. Siehe Demonstrationsprogramm. Demonstrationsprogramm Das Demonstrationsprogramm zeigt zwei übereinander angeordnete Panele. Oben befindet sich ein Instanz vom Typ „TBorderIcon“, die auf den Fokus und die Tastatur erwartungsgemäß reagiert. Unten befindet befindet sich eine Instanz von Typ „TBoderIcon2“, die auf naheliegende Weise von „TCustomControl“ abgeleitet wurde aber nicht die Funktionalität hat. Des weiteren befindet sich für Testzwecke unten rechts noch eine Standardschaltfläche „Button1“. Bei wiederholten Betätigen der Tabulatortaste wechselt der Fokus zwischen „BorderIcon1“, „Button1“ und verschwindet dann. Beim nächsten Druck erscheint er wieder auf „BorderIcon1“. |
AW: Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfoku
Das ist vielleicht etwas weit über das Ziel hinaus geschossen. Es genügt, die folgenden beiden Message-Handler zu überschreiben um ein Neuzeichnen bei einem Focuswechsel auszulösen.
Delphi-Quellcode:
(Nebenbei bemerkt, sollte in Message-Handlern in der Regel das inherited aufgerufen werden, da sonst das Standardverhalten unterdrückt wird)
procedure TBorderIcon2.WMKillFocus(var Message: TWMKillFocus);
begin inherited; Invalidate; end; procedure TBorderIcon2.WMSetFocus(var Message: TWMSetFocus); begin inherited; Invalidate; end; Das Setzen von TabOrder im FormCreate wirkt sich immer auf den aktuellen Parent aus. Da dieser für BorderIcon2 erst nach der TabOrder gesetzt wird, bekommt das BorderIcon2 nach dem Setzen von Parent die TabOrder 1, denn Button1 hat bereits die TabOrder 0 innerhalb Panel2. |
AW: Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfoku
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:07 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