Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
955 Beiträge
 
#1

Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 18. Feb 2019, 14:08
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.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat