Bonjour,
Je me casse la tête depuis un moment sur le contrôle d'une fenêtre Splash. Les exemples que j'ai vu sont basés sur un Timer dont le temps est prédéterminé.
J'ai un certain nombre d'opérations qui doivent se dérouler avant le lancement de l'application. Ce sont des opérations de vérification et de maintenance ou l'utilisateur peut intervenir.
Tant que l'utilisateur n'a pas validé le contrôle de ces opérations, la fenêtre principale de l'application ne doit pas se lancer ou apparaitre.
J'ai choisi de mettre ces contrôles avant le lancement de l'application car une fois les paramètres et maintenances effectués, je peux détruire le Splash qui est volumineux en terme de mémoire et de code.
J'ai modélisé mon problème ci-dessous:
Le TimerFictif n'existe pas dans mon application réelle car c'est le temps réel d'éxécution des tâches. A chacune des 3 étapes (plus d'une dizaine pour l'instant dans mon projet...), je mets un interval de temps différent...
Le Timer Attente est un temps minimum de visualisation de l'étape de vérification et ne lance pas l'étape suivant tant que ce temps fixe n'est pas terminé, même si la vérification informatique est plus rapide, ce qui est le cas pour la pluspart...
Je n'ai pas encore gérer tout le code car je n'arrive pas à faire apparaître la SplashForm avant la fenêtre principale qui elle s'affiche.
Voici le code de départ:
Je ne comprends pas pourquoi la fiche splash n'apparait pas! j'ai essayé plusieurs choses sans succès. Voici le code de l'unité Splash:
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 program project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX} cthreads, {$ENDIF} {$IFDEF HASAMIGA} athreads, {$ENDIF} Interfaces, // this includes the LCL widgetset Forms, unit1, unit2 { you can add units after this }; {$R *.res} begin RequireDerivedFormResource := True; Application.Scaled := True; Application.Initialize; FormSplash := TFormSplash.Create(Application); FormSplash.Show; FormSplash.Update; Application.CreateForm(TForm1, Form1); FormSplash.Close; Application.Run; end.
La FormSplah existe et s'exécutemais ne s'affiche pas!
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 unit Unit2; {$mode ObjFPC}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ComCtrls, StdCtrls, ExtCtrls; type { TFormSplash } TFormSplash = class(TForm) PB1 : TProgressBar; PB2 : TProgressBar; PB3 : TProgressBar; StaticText1 : TStaticText; StaticText2 : TStaticText; StaticText3 : TStaticText; TimerAttente : TTimer; TimerFictif : TTimer; procedure FormActivate(Sender : TObject); procedure FormCreate(Sender : TObject); procedure TimerFictifTimer(Sender : TObject); private public nEtape : integer; FinEtap, FinSplash : boolean; procedure DoVerifEtape(nEtap : integer); end; var FormSplash : TFormSplash; implementation {$R *.lfm} { TFormSplash } procedure TFormSplash.FormCreate(Sender : TObject); begin nEtape := 1; FinEtap := false; FinSplash := false; PB1.Position := 0; PB2.Position := 0; PB3.Position := 0; TimerFictif.Enabled := False; // simule la durée d'éxécution d'une étape TimerFictif.Interval := 50; end; procedure TFormSplash.TimerFictifTimer(Sender : TObject); begin if not FinSplash then Case nEtape of 1: begin {étape de vérification n°1} PB1.Position := PB1.Position + PB1.Step; if PB1.Position >= 100 then nEtape := 2; end; 2: begin {étape de vérification n°2} PB2.Position := PB2.Position + PB2.Step; if PB2.Position >= 100 then nEtape := 3; end; 3: begin {étape de vérification n°3} PB3.Position := PB3.Position + PB3.Step; if PB3.Position >= 100 then begin nEtape := 0; FinSplash := True; end; end; end; end; procedure TFormSplash.FormActivate(Sender : TObject); begin DoVerifEtape(nEtape); end; Procedure TFormSplash.DoVerifEtape(nEtap : integer); begin Case nEtap of 1: begin {étape de vérification n°1} With TimerFictif do begin Interval := 50; Enabled := True; end; end; 2: begin {étape de vérification n°2} With TimerFictif do begin Interval := 30; Enabled := True; end; end; 3: begin {étape de vérification n°3} With TimerFictif do begin Interval := 100; Enabled := True; end; end; end; end; end.
Je vous met en project1.zip, le code de l'ensemble, ça sera sans doute plus simple de voir où je me suis planté...
Merci pour votre aide
Partager