Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 22. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#1

CanFocus and Active: Probleme

  Alt 17. Dez 2008, 09:58
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
Daniel Marschall
  Mit Zitat antworten Zitat