AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfokus.
Thema durchsuchen
Ansicht
Themen-Optionen

Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfokus.

Ein Thema von HintByError · begonnen am 30. Dez 2018 · letzter Beitrag vom 31. Dez 2018
Antwort Antwort
HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
20 Beiträge
 
Delphi XE2 Professional
 
#1

Von „TCustomControl“ abgleitete visuelle Komponente erhält nicht den Tastaturfokus.

  Alt 30. Dez 2018, 22:36
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“.
Miniaturansicht angehängter Grafiken
tcustomcontrol.png  
Angehängte Dateien
Dateityp: zip TCustomControl.zip (111,1 KB, 6x aufgerufen)
Wolfgang Sauer
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
10.995 Beiträge
 
Delphi 12 Athens
 
#2

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

  Alt 31. Dez 2018, 11:12
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
20 Beiträge
 
Delphi XE2 Professional
 
#3

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

  Alt 31. Dez 2018, 19:56
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.
Wolfgang Sauer
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz