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:
Nom : Aide9.jpg
Affichages : 249
Taille : 44,6 Ko

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:
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.
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
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.
La FormSplah existe et s'exécutemais ne s'affiche pas!

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