![]() |
Modale Form -> SetFocus auf TLabeledEdit geht nicht
Hi,
ich bastel jetzt schon ne ganze Weile an einem Problem rum. Ich habe eine Login-Form, aber es will mir nicht gelingen, dem ersten LabeledEdit den Focus zu geben. Mit der Maus oder der Tab-Taste geht's schon, wenn die Form erst mal angezeigt wird, aber ich hätte es gern ohne Useraktion. Bei all den ganzen Versuchen bin ich dann auf
Delphi-Quellcode:
in FormShow hängengeblieben, was zwar den Cursor auf mein LabeledEdit setzt, aber ich dann dort nichts eingeben kann, außer mit Tab zum nächsten Control zu wechseln, was dann zur Folge hat, dass ich das nicht mehr zurück ins vorherige Control komme (weder per Tab noch per Maus).
PostMessage(lbledtUsername.Handle, WM_SETFOCUS, 0, 0);
Ich bin ein bischen ratlos, weil ich mir das Verhalten so gar nicht erklären kann. Weder die Tatsache, dass LabeledEdit.SetFocus oder LMCLogin.ActiveControl:=LMCLogin.lbledtUsername wirkungslos bleiben, noch das sehr merkwürdige Verhalten nach dem PostMessage im FormShow. Zur Verdeutlichung hier mal der Source (die auskommentierten Zeilen spiegeln meine Versuche von Workaround dar):
Delphi-Quellcode:
Aufruf dann so:
unit fLMCLogin;
interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, BadgeBtn, Vcl.StdCtrls, Vcl.ExtCtrls; type TLMCLogin = class(TForm) lbledtUsername: TLabeledEdit; lbledtPassword: TLabeledEdit; bdgbtnLogin: TBadgeBtn; bdgbtnAbort: TBadgeBtn; tmr1: TTimer; procedure FormPaint(Sender: TObject); procedure FormShow(Sender: TObject); procedure lbledtPasswordChange(Sender: TObject); procedure tmr1Timer(Sender: TObject); private FirstPaint: Boolean; { Private-Deklarationen } public { Public-Deklarationen } end; var LMCLogin: TLMCLogin; implementation {$R *.dfm} procedure TLMCLogin.FormPaint(Sender: TObject); begin // if FirstPaint then // begin // FirstPaint:=False; // lbledtUsername.SetFocus; // end; end; procedure TLMCLogin.FormShow(Sender: TObject); begin // FirstPaint:=True; // lbledtPassword.Text:=''; // bdgbtnLogin.Enabled:=False; // lbledtUsername.SelectAll; // lbledtUsername.SetFocus; // self.ActiveControl:=lbledtUsername; // tmr1.Enabled:=True; // Perform(WM_NEXTDLGCTL, 0, 0); PostMessage(lbledtUsername.Handle, WM_SETFOCUS, 0, 0); end; procedure TLMCLogin.lbledtPasswordChange(Sender: TObject); begin bdgbtnLogin.Enabled:=True; bdgbtnLogin.Default:=True; end; procedure TLMCLogin.tmr1Timer(Sender: TObject); begin // tmr1.Enabled:=False; // lbledtUsername.SetFocus; end; end.
Delphi-Quellcode:
PS: Die Unit BadgeButton ist eine selbstgeschriebe, aber auch mit Standard-TButton erreiche ich gleiches Verhalten.
LMCLogin.ActiveControl:=LMCLogin.lbledtUsername;
LMCLogin.lbledtPassword.Text:=''; LMCLogin.bdgbtnLogin.Enabled:=False; if LMCLogin.ShowModal=mrOK then ... |
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Hallo,
hast du FormActivate schon probiert? Zu Deinem FormShow und PostMessage. Du bist innerhalb der Nachrichtenbearbeitung des ON_SHOW und sendest eine weitere Nachricht, hier hätte wieder besseren Wissens sogar SendMessage benutzt, wenn halt überhaupt. |
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Hallo,
ich habe mal ein Minimal-Beispiel erzeugt. Sowohl FormShow als auch FormActivate funktionieren.
Delphi-Quellcode:
Allerdings ohne das LMCLogin.ActiveControl:=LMCLogin.lbledtUsername;
procedure TForm133.FormShow(Sender: TObject);
begin LabeledEdit2.SetFocus; end; Ist das wirklich dein ganzer Code? Mache mal ein neues leeres Projekt und probier das aus. |
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Mir würde als erstes einfallen, statt eines LabeledEdit ein Label und ein Edit getrennt zu verwenden. Hast Du das mal probiert?
|
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Zitat:
Zitat:
Zitat:
Zitat:
Aber ich habe meinen Fehler mittlerweile gefunden. Zur Erklärung: Wenn eine Anwendung eine Anmeldung benötigt, und man die Loginform im OnShow der Mainform modal aufruft, erscheint die MainForm erst, wenn der modale Dialog beendet ist. Ausdiesem Grund packe ich das gern in die OnPaint der Mainform (mit einer Firstpaint-Variable). So auch dieses mal. Allerdings bleibt dann wohl der Fokus noch auf der Mainform. Jetzt habe ich im OnPaint noch ein
Delphi-Quellcode:
vor dem modalen Aufruf der Loginform eingesetzt, damit alle Zeichenvorgänge und Nachrichten abgearbeitet sind. Und dann klappt auch ein SetFocus im FormShow der LoginForm.
Inherited; Application.ProcessMessages;
Danke euch trotzdem, denn ihr habt mich dazu angehalten, das, was vor dem modalen Aufruf kommt, noch mal genauestens anzuschauen. |
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Zitat:
Es gibt genügend Möglichkeiten, den Login-Dialog sauber aufzurufen. Welche davon geeignet sind, hängt von deiner Delphi-Version und einigen anderen Umständen und Vorgaben ab. |
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Hallo,
so drastisch würde ich das nicht ausdrucken, aber ja, es ist grundsätzlich falsch ;) Richtig wäre entweder in der DPR oder im FormActivate des Hauptfensters.
Delphi-Quellcode:
procedure TForm1.FormActivate();
begin OnActivate:= nil; // Mehrfachaufruf von FormActivate verhindern if not Login then begin PostMessage(Handle, WM_CLOSE, 0, 0); Exit; end; end; |
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Zitat:
|
AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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