![]() |
Edit-Feld kriegt den Focus nicht
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Ich hab hier ein bizarres Problem: Wenn ich direkt nach dem OnShow des Hauptformulares eines Programmes ein Login-Fenster hochbringe, dann hat das Eingabefeld im Login-Fenster NICHT den Fokus. (dh der Cursor blinkt nicht im Edit Feld). Der Fokus scheint nirgends zu sein - aber nach 3mal TAb drücken ist er korrekt im Edit. Wenn ich zuvor im OnShow ein leeres Fenster erzeuge und anzeige, dann passt alles.
Delphi-Quellcode:
(Beispielprojekt ist angehängt)
uses
ufrmAdminPw; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // If these lines are commented out, the edit field in the upcoming form isn't active (no blinking cursor) - why?!? // with TForm.Create(self) do // Show; end; procedure TForm1.FormShow(Sender: TObject); begin PostMessage(self.handle, WM_AfterShow, 0,0); end; procedure TForm1.WMAfterShow(var Msg: TMessage); begin with TfrmAdminPw.Create(nil) do begin ShowModal; Free; end; end; Klar kann man das sicher irgendwie beheben, aber ich würde gerne verstehen, was hier fehlschlägt. HILFE! Danke! Ralf PS: Mit D2010 compiliert. |
AW: Edit-Feld kriegt den Focus nicht
Mit SENDMESSAGE geht es:
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin SendMessage(self.handle, WM_AfterShow, 0,0); end; |
AW: Edit-Feld kriegt den Focus nicht
Ja, aber die Konstruktion mit PostMessage ist ja dazu da, dass sich das Formular aufbauen kann, und schon mal was zu sehen ist.
(Bei sehr grossen Anwendungen mit Datenbank-Anbindung ist das hübscher) Bei SendMessage kommt der Login-Dialog VOR dem Hauptformular. Das geht nicht. Da könnt ich den Aufruf gleich direkt bei OnShow reintun und auf die Message pfeifen... Danke dennoch für's Feedback. Zitat:
|
AW: Edit-Feld kriegt den Focus nicht
Dann mach es so in FormActivate:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin PostMessage(self.handle, WM_AfterShow, 0,0); end; |
AW: Edit-Feld kriegt den Focus nicht
Delphi-Quellcode:
wird zu dem Zeitpunkt gefeuert, wie es der Name verspricht: während des Anzeigens (das aber aktuell noch nicht abgeschlossen ist).
OnShow
Sonst würde das Ereignis auch
Delphi-Quellcode:
oder
OnAfterShow
Delphi-Quellcode:
heißen.
OnShowed
Du sendest jetzt im OnShow per PostMessage eine Nachricht und die geht in die Queue. Wenn deine OnShow Methode verlassen wird, dann werden im Zuge des Anzeigens noch die ein oder andere Nachricht verschickt (mit PostMessage) um z.B. den Fokus zu setzen. Darum geht das so nicht :wink: |
AW: Edit-Feld kriegt den Focus nicht
Hallo,
ich mache das gerne im "OnPaint", welches immer zuletzt aufgerufen wird. Dazu dann eine Hilfsvariable, und alles ich chic
Delphi-Quellcode:
type
TForm1 = class(TForm) procedure FormPaint(Sender: TObject); private { Private-Deklarationen } FFirstPaint: boolean; public { Public-Deklarationen } end; procedure TForm1.FormPaint(Sender: TObject); begin if FFirstPaint then begin FFirstPaint := false; . . . Halleluja end; end; |
AW: Edit-Feld kriegt den Focus nicht
Mein Weltbild wäre ja so einfach gewesen dass ich auf dem Popup-Formular einfach
Delphi-Quellcode:
auf das Edit-Feld setze. Aber das kümmert ihn nicht.
ActiveControl
Testweise habe ich in der DPR-Datei mal das
Delphi-Quellcode:
auskommentiert, und dann funktioniert es auch. Verstanden habe ich das alles aber auch nicht :|
MainFormOnTaskbar
In der VCL fehlt wirklich ein
Delphi-Quellcode:
-Event.
OnFullyInitializedAndReady
|
AW: Edit-Feld kriegt den Focus nicht
OK, hab's jetzt in OnActivate verschoben, da geht's.
Allerdings verstehe ich an deiner Erklärung nicht, warum der Cursor korrekt angezeigt wird wenn man im OnCreate ein Dummy-Fenster erzeugt. Zitat:
|
AW: Edit-Feld kriegt den Focus nicht
Wenn man nicht weiß wo der Focus sich versteckt, dann kann man die Stelle sich anzeigen/loggen lassen.
Sei es mit einem Timer und/oder den passenden Events Screen.OnActiveFormChange Screen.OnActiveControlChange und sich dann im Log, oder z.B. einem Label, Memo oder Form.Caption, die nötigen Infos anzeigen zu lassen. Screen.FocusedForm Screen.ActiveControl Screen.ActiveCustomForm //Screen.ActiveForm Windows.GetActiveWindow Windows.GetFocus Die WinAPI ist mit aufgeführt, da selbst die VCL manchmal schief steht und der Fokus wo anders ist, als sie denkt. |
AW: Edit-Feld kriegt den Focus nicht
Screen.FocusedForm.Name = 'frmAdminPw'
Screen.ActiveControl.Name = 'ediPasswword' Screen.ActiveCustomForm.Name = 'frmAdminPw' Das wäre hypothetisch alles fein, Cursor blinkt aber keiner. GetActiveWindow ist korrekt, nur Windows.GetFocus steht auf nil. Strange. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:14 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