Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Neuen Beitrag zur Code-Library hinzufügen (https://www.delphipraxis.net/33-neuen-beitrag-zur-code-library-hinzufuegen/)
-   -   Delphi Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfokus. (https://www.delphipraxis.net/199157-von-%84tcustomcontrol%93-abgleitete-visuelle-komponente-erhaelt-nicht-den-tastaturfokus.html)

HintByError 30. Dez 2018 23:36

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“.

Uwe Raabe 31. Dez 2018 12:12

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:
procedure TBorderIcon2.WMKillFocus(var Message: TWMKillFocus);
begin
  inherited;
  Invalidate;
end;

procedure TBorderIcon2.WMSetFocus(var Message: TWMSetFocus);
begin
  inherited;
  Invalidate;
end;
(Nebenbei bemerkt, sollte in Message-Handlern in der Regel das inherited aufgerufen werden, da sonst das Standardverhalten unterdrückt wird)

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.

HintByError 31. Dez 2018 20:56

AW: Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfoku
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1422351)
Es genügt, die folgenden beiden Message-Handler zu überschreiben um ein Neuzeichnen bei einem Focuswechsel auszulösen.
Delphi-Quellcode:
procedure TBorderIcon2.WMKillFocus(var Message: TWMKillFocus);
begin
  inherited;
  Invalidate;
end;

procedure TBorderIcon2.WMSetFocus(var Message: TWMSetFocus);
begin
  inherited;
  Invalidate;
end;

Stimmt. Die Variable „fFocused“ und die damit zusammenhängenden Anweisungen werden nicht benötigt. Die Zahl der Eingriffe über Windows-Botschaften bleibt aber gleich, um die angestrebte Funktionalität zu erreichen. Die Leertaste und die Eingabetaste sollen sich so verhalten wie bei einer Schaltfläche. Beim Klicken mit der Maus, soll der Fokus auch entsprechend geschaltet sein. Es läuft darauf hinaus, dass von „TCustomControl“ ein Basistyp „TCustemFocus“ abgeleitet wird, der den richtigen Tastaturfokus zeigt. Während Elemente, die dies nicht benötigen von „TCustomControl“ abgeleitet werden. Vielen Dank für den Hinweis.


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:21 Uhr.

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