Thema: Delphi Diverse Fokusprobleme

Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.166 Beiträge
 
Delphi 12 Athens
 
#1

Diverse Fokusprobleme

  Alt 22. Apr 2014, 13:05
Die Suche hat etwas länger gedauert, vorallem da wir bisher dachten der Fehler liegt bei uns (irgendwelchen komischen Dingen in unserem Programm)
und es fiel nicht überall auf, da zufällig bei einigen selbstgebauten Dialogen der Fokus manuell gesetzt wurde.

Das Problem lieg darin, daß öfters der Fokus einfach "verschwindet" und man erst manuell in das Edit/Grid wieder reinklicken muß.


So, aber nun stellte sich raus, daß vermutlich seit den VISTA-Anpassungen, mit den neuen CommonControls, sich im Delphi ein liebevoller Bug versteckt, welcher grob fahrlässig den Fokus zerschießt.
Und (vermutlich) wenn man einen Dialog im OnClose eines Fensters anzeigt, welches dann via caFree erst freigegeben wird, nachdem der Dialog sichtbar wurde, dann dreht alles durch und es passiert schonmal, das gleich die ganze Anwendung den Fokus verliert und im Hintergrund verschwindet.

MDI-Fenster sind für Windows ja mehr Komponenten, als eigenständige "Fenster".


Demo:
- Fokus im Memo
- links den Speedbutton anklicken und Dialog schließen => Fokus bleibt im Memo (siehe Text-Cursor oder einfach mal ein paar Buchstaben eingeben)
- rechts den Speedbutton anklicken => Fokus ist weg (liegt jetzt auf der MainForm)

- bei Fokus auf Button -> nach dem Dialog siehe gepünktelter Fokusrahmen oder einfach mal auf die Leertaste drücken
- Beim Drücken auf einen Button, dann sollte nachher der Fokus beim Button liegen


Grund: Irgendein Trottel Jemand war so schlau, liest vor dem ShowModal das das "für Windows" aktive Fenster aus und gibt ihm nach dem Dialog den Fokus.
Leider ist hier aber nicht die MainForm aktiv, sondern das MDI-Child.

Lösung, bis der Fehler nie repariert wird (da XE garantiert kein Update mehr bekommt): Screen.ActiveControl vorher auslesen und nachher ihm den Fokus zurückgeben.
Oder besser noch nachher SetFocus(AciveControl.Handle); (vorher muß man sich nichts speichern), denn die VCL denkt ja immernoch, daß der Fokus wo ganz anders liegt, nämlich dort, wo er auch sein sollte.

[edit] Neuer Anhang siehe #5
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Apr 2014 um 12:15 Uhr)
  Mit Zitat antworten Zitat