AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Edit-Feld kriegt den Focus nicht

Ein Thema von ralfiii · begonnen am 6. Jun 2016 · letzter Beitrag vom 8. Jun 2016
Antwort Antwort
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#1

Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 17:13
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.
Angehängte Dateien
Dateityp: zip FocusBug.zip (2,2 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#2

AW: Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 17:40
Mit SENDMESSAGE geht es:

Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
begin
     SendMessage(self.handle, WM_AfterShow, 0,0);
end;
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 17:51
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.


Mit SENDMESSAGE geht es
  Mit Zitat antworten Zitat
t.roller
(Gast)

n/a Beiträge
 
#4

AW: Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 18:18
Dann mach es so in FormActivate:

Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
begin
 PostMessage(self.handle, WM_AfterShow, 0,0);
end;
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 19:04
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 OnAfterShow oder 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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

AW: Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 19:13
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;
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Edit-Feld kriegt den Focus nicht

  Alt 6. Jun 2016, 19:16
Mein Weltbild wäre ja so einfach gewesen dass ich auf dem Popup-Formular einfach ActiveControl auf das Edit-Feld setze. Aber das kümmert ihn nicht.

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

In der VCL fehlt wirklich ein OnFullyInitializedAndReady -Event.
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Edit-Feld kriegt den Focus nicht

  Alt 7. Jun 2016, 10:10
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.

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 OnAfterShow oder 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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#9

AW: Edit-Feld kriegt den Focus nicht

  Alt 7. Jun 2016, 11:08
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 7. Jun 2016 um 11:15 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
489 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Edit-Feld kriegt den Focus nicht

  Alt 8. Jun 2016, 12:33
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:22 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