Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Edit-Feld kriegt den Focus nicht (https://www.delphipraxis.net/189370-edit-feld-kriegt-den-focus-nicht.html)

ralfiii 6. Jun 2016 16:13

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:
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;
(Beispielprojekt ist angehängt)

Klar kann man das sicher irgendwie beheben, aber ich würde gerne verstehen, was hier fehlschlägt.
HILFE!
Danke!
Ralf

PS: Mit D2010 compiliert.

t.roller 6. Jun 2016 16:40

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;

ralfiii 6. Jun 2016 16:51

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:

Zitat von t.roller (Beitrag 1339606)
Mit SENDMESSAGE geht es


t.roller 6. Jun 2016 17:18

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;

Sir Rufo 6. Jun 2016 18:04

AW: Edit-Feld kriegt den Focus nicht
 
Delphi-Quellcode:
OnShow
wird zu dem Zeitpunkt gefeuert, wie es der Name verspricht: während des Anzeigens (das aber aktuell noch nicht abgeschlossen ist).

Sonst würde das Ereignis auch
Delphi-Quellcode:
OnAfterShow
oder
Delphi-Quellcode:
OnShowed
heißen.

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:

mm1256 6. Jun 2016 18:13

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;

Der schöne Günther 6. Jun 2016 18:16

AW: Edit-Feld kriegt den Focus nicht
 
Mein Weltbild wäre ja so einfach gewesen dass ich auf dem Popup-Formular einfach
Delphi-Quellcode:
ActiveControl
auf das Edit-Feld setze. Aber das kümmert ihn nicht.

Testweise habe ich in der DPR-Datei mal das
Delphi-Quellcode:
MainFormOnTaskbar
auskommentiert, und dann funktioniert es auch. Verstanden habe ich das alles aber auch nicht :|

In der VCL fehlt wirklich ein
Delphi-Quellcode:
OnFullyInitializedAndReady
-Event.

ralfiii 7. Jun 2016 09:10

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:

Zitat von Sir Rufo (Beitrag 1339613)
Delphi-Quellcode:
OnShow
wird zu dem Zeitpunkt gefeuert, wie es der Name verspricht: während des Anzeigens (das aber aktuell noch nicht abgeschlossen ist).

Sonst würde das Ereignis auch
Delphi-Quellcode:
OnAfterShow
oder
Delphi-Quellcode:
OnShowed
heißen.

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:


himitsu 7. Jun 2016 10:08

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.

ralfiii 8. Jun 2016 11:33

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 10:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz