Bonjour,
j'ai l'habitude de démarrer mes programmes Lazarus (et je viens de vérifier VCL) ainsi :
Je construis une Form LoginForm à partir de fLogin.pas (Form1) que j'appelle en ShowModal [ LoginForm:= TForm1.Create(nil); ]. Par une méthode ou une autre, elle me renvoie une valeur qui indique au programme s'il faut ou non ouvrir fMain.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 program Test08; uses Vcl.Forms, fLogin in 'fLogin.pas' {Form1}, fMain in 'fMain.pas' {Form2}; {$R *.res} var LoginForm: TForm1; LoginSucceeded: Boolean; begin Application.Initialize; //code initial // Application.MainFormOnTaskbar := True; // Application.CreateForm(TForm1, Form1); // Application.CreateForm(TForm2, Form2); //remplacé par... LoginForm:= TForm1.Create(nil); try LoginForm.ShowModal; LoginSucceeded := LoginForm. SuccessFull; finally LoginForm.Free; end; if LoginSucceeded then begin Application.CreateForm(TForm2, Form2); Application.Run; end; end.
Dans cette Form1, il y a un TEdit qui prend le focus. En Lazarus et VCL, cela se passe normalement.
En FMX, il est nécessaire pour donner le focus au TEdit d'ajouter Edit1.SetFocus (dans le OnShow). Dans tous les cas, le champ prend bien le focus.
Avec le code usuel par défaut de démarrage du projetj'obtiens ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 program Test08FMX; uses System.StartUpCopy, FMX.Forms, fLogin in 'fLogin.pas' {Form1}, fMain in 'fMain.pas' {Form2}; {$R *.res} var LoginForm: TForm1; LoginSucceeded: Boolean; begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.Run; end.
Alors qu'avec le code modifié :j'obtiens cela :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 program Test08FMX; uses System.StartUpCopy, FMX.Forms, fLogin in 'fLogin.pas' {Form1}, fMain in 'fMain.pas' {Form2}; {$R *.res} var LoginForm: TForm1; LoginSucceeded: Boolean; begin Application.Initialize; // Application.CreateForm(TForm1, Form1); // Application.CreateForm(TForm2, Form2); LoginForm:= TForm1.Create(nil); try LoginForm.ShowModal; LoginSucceeded := LoginForm. SuccessFull; finally LoginForm.Free; end; if LoginSucceeded then begin Application.CreateForm(TForm2, Form2); Application.Run; end; end.
Je le reprécise : Le champ Edit1 prend bien le focus dans tous les cas (i.e. si je saisis quelques lettres, elles se placent bien dans le TEdit), mais le curseur Texte n'apparaît pas dans le second cas FMX. Comment expliquer cette différence de comportement ?
Partager