Hallo.
Ich habe Probleme mit dem .SetFocus .
Zuerst hatte ich überall ".SetFocus" stehen, bis ich die
Exception mit dem deaktivierten Control oder unsichtbares Fenster erhielt.
Deswegen wechselte ich später zu
if x.CanFocus and Active then x.SetFocus;
Nun habe ich herausgefunden, dass in meinem Programm im OnShow-Ereigniss "Active" unwahr ist, weswegen .SetFocus nicht ausgeführt wird.
Also habe ich "and Active" einfach auskommentiert.
if x.CanFocus {and Active} then x.SetFocus;
Jetzt wird auch im OnShow-Ereignis der Focus korrekt gesetzt.
Aber: Benutzer meldeten mir, dass genau in dieser Version, bei der ich die Änderungen durchgeführt habe, wieder die
Exception kommt "Unsichtbares Fenster oder deaktivertes Control kann nicht den Focus erhalten". (Seltsam: Ich erhalte den Fehler (im Moment) nicht)
Was mache ich nun? Ich verstehe die Funktion von "Active" nicht genau und vor allem, wieso "CanFocus" nicht ordentlich kontrolliert, ob "SetFocus" erfolg haben wird oder nicht. Im QualityCenter bei Borland wurden aber auch ähnliche Dinge gemeldet, dass mit "CanFocus" irgendwas nicht ganz in Ordnung sein sollte/könnte/ist.
Hier ein reproduzierbarer Code:
Delphi-Quellcode:
Application.ShowMainForm := False;
// Form 1
procedure TForm1.FormShow(Sender: TObject);
begin
// Unter gewissen Bedingungen wird entweder das eine Control, oder das andere Control focus'ed,
// deswegen ein SetFocus im OnShow();
if edit2.CanFocus
and Active
then edit2.SetFocus;
// erhält nicht den Focus
if edit2.CanFocus
{and Active} then edit2.SetFocus;
// jetzt erhält es den Focus, aber manchmal Exception
end;
// Da das ShowMainForm = False ist, führe ich den Initialisierung mit einem Timer anstelle des OnShow-Ereignisses aus
// Außerdem: Nur unter _gewissen_ Bedingungen soll das Form auch angezeigt werden. Deswegen schreibe ich den Code im Timer und nicht im OnShow / OnCreate (OnCreate: Andere Forms noch nicht initialisiert).
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := false;
// Hier ist eigentlich zeitaufwändiger Code, weswegen ich es als einmaligen Timer mache...
// Unter gewissen Voraussetzungen wird das Form dann gezeigt:
Show;
end;
Getestet mit D6 / D2006.
Hat jemand eine Idee, was da falsch ist und wieso diese Exceptions nur bei gewissen Benutzern kommen?
Gruß
blackdrake