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
PostMessage(lbledtUsername.Handle, WM_SETFOCUS, 0, 0);
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).
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:
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.
Aufruf dann so:
Delphi-Quellcode:
LMCLogin.ActiveControl:=LMCLogin.lbledtUsername;
LMCLogin.lbledtPassword.Text:='';
LMCLogin.bdgbtnLogin.Enabled:=False;
if LMCLogin.ShowModal=mrOK then
...
PS: Die
Unit BadgeButton ist eine selbstgeschriebe, aber auch mit Standard-TButton erreiche ich gleiches Verhalten.