![]() |
Fokus wird nicht gesetzt
Hallo,
habe ein sehr merkwürdiges Verhalten: Ich rufe von einem MDI Formular ein anderen Formular mit SHOWMODAL auf. Alles funktioniert im Prinzip einwandfrei. Im Formactivate ist ein edxxx.setfocus. Man sieht, dass beim Öffnen des Formulars ganzkurz der Fokus im Feld xxx drin steht, dann verschwindet der Fokus im Nirwana. Auch das nachträgliche Setzen des Fokus mit einen Timer geht nicht. Im ganzen Formular ist kein weiteres SETFOCUS vorhanden. Drücke ich sehr oft auf die Tab-Taste erscheint irgendwann ein Fokus. Ich kann auch direkt mit der Maus den Fokus setzen und arbeiten. Auf dem Formular habe ich ein Button mit Cancel=True. ESC funktioniert erst, wenn der Fokus einmal sichtbar ist (entweder Maus oder vielfaches Tab). ALT-Leertaste zeigt mir das Systemmenü an, ich kann aber die Pfeiltasten nicht verwenden, um einen Eintrag auszuwählen. Auch das funktioniert erst, wenn das Formular den Fokus einmal sichtbar hatte. Habe auch Bringtofront probiert, aber es bringt nichts. Es hat übrigens früher mit Delphi 2006 funktioniert. Seit der Umstellung auf XE nicht mehr. Wer weiß Rat? Gruß Alfonso |
AW: Fokus wird nicht gesetzt
Hat die Form überhaupt noch den Fokus?
PS: Wie wäre es mit dem Property FocusedControl (oder so ähnlich) der Form? |
AW: Fokus wird nicht gesetzt
Bringt leider nichts. self.FocusControl(cbAlleSeiten) setzt mir zwar für eine kleine Zeit den Fokus, (umrandung um Checkbox sichtbar), dann verschwindet der Fokus. Das Formular hat den Fokus. Wenn ich ALT+K drücke, wird der Button O~K ausgeführt.
Weitere Ideen? Gruß Alfonso |
AW: Fokus wird nicht gesetzt
Liste der Anhänge anzeigen (Anzahl: 1)
Ups, ich meinte ActiveControl, welches man schon im OI setzen kann.
Du könntest ja mal prüfen, wo Form.ActiveControl oder Screen.ActiveControl hinzeigt. Im Anhang befindet sich eine Demo, mit einer Methode zum Prüfen was wo aktiv ist. Entweder hängt man es an einen Timer, oder an die verschiedenen Events im System. (Screen, Application oder besser TApplicationEvents) |
AW: Fokus wird nicht gesetzt
Danke für deinen Code.
Habe es eingebaut und es zeigt mir im Titel "Active" + den Namen des richtigen Formulars + den Namen des richtigen Feldes. Es liegt aber auf dem Feld kein Fokus drauf. Klicke ich nun auf ein anderes Fenster ausserhalb der Anwendung (z.B. Firefox), ändert sich der Titel zu inactive. Klicke ich wieder in die Applikation ändert sich der Titel in Active und der Fokus ist an der richtigen Stelle gesetzt. Ich weiss immer noch kein Rat.:( |
AW: Fokus wird nicht gesetzt
Ich habe jetzt über einen SendKey Trick das Formular ausgetrickst. Nach 1 Sekunde wird dieser Timer aufgerufen:
Code:
Damit wird dann tatsächlich der Fokus gesetzt.
procedure TfrmPrintRechnung.tmr1Timer(Sender: TObject);
var key:Char; begin //Kleiner Hack, da der Fokus nicht richtig gesetzt wird, simuliere ich ein Tastendruck key:='X'; Keybd_event(vk_Menu, 0, 0, 0); keybd_event(vkKeyScan(key), 0, 0, 0);// der eigendliche Tastendruck keybd_event(vkKeyScan(key), 0, KEYEVENTF_KEYUP, 0); Keybd_event(vk_Menu, 0, KEYEVENTF_KEYUP, 0); end; Das ist wirklich nicht was ich mir vorstelle, aber ich suche schon seit 3 Stunden nach einer Lösung. Falls jemand eine bessere Lösung weiss, bitte posten!!! Gruß Alfonso |
AW: Fokus wird nicht gesetzt
Ein Bug?
Es gibt ja einmal den Fokus, welchen Delphi glaubt gesetzt zu haben und dann noch den Fokus, welcher beim WinControl wirklich aktiv ist. Hab selber grade mit sowas zu kämpfen :cry: ![]() Was sagt diese Variante?
Delphi-Quellcode:
procedure TForm4.Timer1Timer(Sender: TObject);
var S: string; H: HWND; C: TControl; B: array[0..MAX_PATH] of Char; i: Integer; begin if Application.Active then S := 'Active ' else S := 'Inactive '; if Assigned(Screen.ActiveCustomForm) then S := S + Screen.ActiveCustomForm.ClassName + '.' + Screen.ActiveCustomForm.Name + ' '; if Assigned(Screen.ActiveForm) and Assigned(Screen.ActiveForm.ActiveMDIChild) then S := S + 'MDI:' + Screen.ActiveForm.ActiveMDIChild.ClassName + '.' + Screen.ActiveForm.ActiveMDIChild.Name + ' '; if Assigned(Screen.ActiveControl) then S := S + Screen.ActiveControl.ClassName + '.' + Screen.ActiveControl.Name + ' '; H := GetActiveWindow; C := FindControl(H); if not Assigned(C) then begin GetClassName(H, @B, MAX_PATH); S := S + '(' + B + ' '; end else S := S + '(' + C.ClassName + '.' + C.Name + ' '; H := GetFocus; C := FindControl(H); if not Assigned(C) then begin GetClassName(H, @B, MAX_PATH); S := S + B + ') '; end else S := S + C.ClassName + '.' + C.Name + ') '; Application.Title := S; for i := 0 to Screen.CustomFormCount - 1 do Screen.CustomForms[i].Caption := S; end; [add] Statt deinem Hack würde ich es mal so probieren (in dem Timer)
Delphi-Quellcode:
bzw.
if Application.Active then
SetActive(Screen.ActiveControl.Handle);
Delphi-Quellcode:
if Application.Active and (Screen.ActiveControl.Handle <> GetActive) then
SetActive(Screen.ActiveControl.Handle); |
AW: Fokus wird nicht gesetzt
Gleicher Effekt. Vor der Klammer steht das gleiche wie in der Klammer und immer das was richtig ist, und zwar der Control der den Fokus haben soll. Sobald ich Anwendungsfenster wechsle, ist es auf inaktiv und wenn ich zurück komme steht wieder das richtige und der Fokus ist plötzlich da.
Gruß und Danke für deine Mühe Alfonso |
AW: Fokus wird nicht gesetzt
Mein Delphi XE kennt kein SetActive. Auch die Hilfe nicht.
Hast du dich verschrieben? Gruß Alfonso |
AW: Fokus wird nicht gesetzt
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz