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