AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Modale Form -> SetFocus auf TLabeledEdit geht nicht
Thema durchsuchen
Ansicht
Themen-Optionen

Modale Form -> SetFocus auf TLabeledEdit geht nicht

Ein Thema von Hobbycoder · begonnen am 18. Feb 2019 · letzter Beitrag vom 19. Feb 2019
Antwort Antwort
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
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 18. Feb 2019, 15:38
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.
Heiko
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 18. Feb 2019, 15:45
Hallo,

ich habe mal ein Minimal-Beispiel erzeugt.
Sowohl FormShow als auch FormActivate funktionieren.

Delphi-Quellcode:
procedure TForm133.FormShow(Sender: TObject);
begin
  LabeledEdit2.SetFocus;
end;
Allerdings ohne das LMCLogin.ActiveControl:=LMCLogin.lbledtUsername;


Ist das wirklich dein ganzer Code?

Mache mal ein neues leeres Projekt und probier das aus.
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.605 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 18. Feb 2019, 16:03
Mir würde als erstes einfallen, statt eines LabeledEdit ein Label und ein Edit getrennt zu verwenden. Hast Du das mal probiert?
Thomas Mueller
  Mit Zitat antworten Zitat
Hobbycoder

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

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 19. Feb 2019, 08:30
Hallo,
hast du FormActivate schon probiert?
Gleicher Effekt

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.
War ja auch mehr ein Test.

Hallo,

ich habe mal ein Minimal-Beispiel erzeugt.
Sowohl FormShow als auch FormActivate funktionieren.

Delphi-Quellcode:
procedure TForm133.FormShow(Sender: TObject);
begin
  LabeledEdit2.SetFocus;
end;
Ich habe auch ein Minimalbeispiel erzeugt. Da funktioniert es auch bestens.

Allerdings ohne das LMCLogin.ActiveControl:=LMCLogin.lbledtUsername;


Ist das wirklich dein ganzer Code?

Mache mal ein neues leeres Projekt und probier das aus.
Jepp. Ist der ganze Code. Die Unit LMCLogin.pas habe ich komplett gepostet. Der Aufruf ist natürlich nach hinten raus abgeschnitten. Aber vorweg kommt nichts.

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 Inherited; Application.ProcessMessages; 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.

Danke euch trotzdem, denn ihr habt mich dazu angehalten, das, was vor dem modalen Aufruf kommt, noch mal genauestens anzuschauen.
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#6

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 19. Feb 2019, 08:47
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 Inherited; Application.ProcessMessages; vor dem modalen Aufruf der Loginform eingesetzt, damit alle Zeichenvorgänge und Nachrichten abgearbeitet sind.
Entschuldige bitte diese drastischen Worte, aber falscher kann man es wirklich kaum machen. Im OnPaint einen modalen Dialog aufrufen ist schon ein konzeptioneller Fehler und dann noch die auftretenden Probleme mit einem Application.ProcessMessages kitten ist wie den Teufel mit dem Beelzebub austreiben.

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 19. Feb 2019, 10:40
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;
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.453 Beiträge
 
Delphi 12 Athens
 
#8

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 19. Feb 2019, 11:09
so drastisch würde ich das nicht ausdrucken,
Ich weiß, war nicht so gemeint...
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
702 Beiträge
 
Delphi 12 Athens
 
#9

AW: Modale Form -> SetFocus auf TLabeledEdit geht nicht

  Alt 19. Feb 2019, 11:32
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.
Äh, normalerweise setzt man einfach im Designer für das Form die Eigenschaft ActiveControl auf das Control, das beim ersten Anzeigen des Forms den Focus habe soll...
Peter Below
  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 21:10 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