Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Fokuswechsel eines VCL Controls verhindern (https://www.delphipraxis.net/163565-fokuswechsel-eines-vcl-controls-verhindern.html)

Stevie 4. Okt 2011 18:58

Fokuswechsel eines VCL Controls verhindern
 
Wie kann ich einen Fokuswechsel aus einem Control heraus verhindern? Dabei ist wichtig, dass das Control das selber verhindern kann.

Ich hab mir mal das CMExit genommen und dort ein SetFocus reingesetzt. Das funktioniert auch augenscheinlich wenn man mit Tab das nächste Control anspringen will. Allerdings nicht, wenn ich explizit mit der Maus in ein anderes Control hineinklicke, zumindest nicht auf Windows 7, auf Windows XP sah auch das ganz gut aus.

Union 4. Okt 2011 19:05

AW: Fokuswechsel eines VCL Controls verhindern
 
Könnte man nicht WM_KILLFOCUS abfangen? Oder so:
Delphi-Quellcode:
procedure TForm5.Edit1Exit(Sender: TObject);
begin
  TWinControl(Sender).SetFocus;
end;

Stevie 4. Okt 2011 19:12

AW: Fokuswechsel eines VCL Controls verhindern
 
Scheint, es handelt sich dabei um ein TDateTimePicker spezifisches Problem. Ich hab 2 davon, und bei dem einen will ich verhindern, dass der Fokus verloren geht, wenn kein gültiges Datum eingetragen ist. Klicke ich nun auf den anderen Picker, bekommt der irgendwie den Fokus. Klicke ich auf ein Edit oder einen Button, bekommen diese Controls erwartungsgemäß nicht den Fokus.

Ganz einfach nachzustellen:
Edit und DateTimePicker auf die Form. Ins OnExit des Edits ein Edit1.SetFocus und dann auf den DateTimePicker klicken.

Nachtrag: Scheint sich um ein optisches Problem zu handeln. Das Edit hat weiterhin den Fokus. Im DateTimePicker ist aber der Text als markiert gezeichnet.

Union 4. Okt 2011 19:55

AW: Fokuswechsel eines VCL Controls verhindern
 
Bei mir nicht. Allerdings XP ungethemed, vielleicht liegt es daran?

Stevie 4. Okt 2011 20:12

AW: Fokuswechsel eines VCL Controls verhindern
 
Hatte es auf Windows XP gethemed auch nicht. Und unter Windows 7 Classic Design auch nicht. Nur wenn Aero an ist.

Hab mal einen Workaround, den ich noch testen muss:

Delphi-Quellcode:
procedure TDateTimePicker.WMLButtonDown(var Message: TWMLButtonDown);
begin
  inherited;
  if not Focused then
    Perform(WM_KILLFOCUS, 0, 0);
end;

Union 4. Okt 2011 21:12

AW: Fokuswechsel eines VCL Controls verhindern
 
Auf den ersten Blick sollte das inherited vielleicht ans Ende.

Stevie 4. Okt 2011 21:20

AW: Fokuswechsel eines VCL Controls verhindern
 
Zitat:

Zitat von Union (Beitrag 1128457)
Auf den ersten Blick sollte das inherited vielleicht ans Ende.

Nope, erst muss das ButtonDown abgearbeitet, dann der Focus gelöscht werden.

Union 4. Okt 2011 22:02

AW: Fokuswechsel eines VCL Controls verhindern
 
Geht ein diesem Zusammenhang nicht PeekMessage mit PM_REMOVE?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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