IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Delphi Discussion :

Tâches à réaliser pendant l'affichage d'une SplashForm


Sujet :

Delphi

  1. #1
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut Tâches à réaliser pendant l'affichage d'une SplashForm
    Bonjour,

    Je voudrais savoir s'il y a une possibilité de faire un travail de préparation qui s'affiche (par des messages) pendant l'affichage d'un splashForm mais dont le code ne serait pas dans la structure du fichier principal du programme comme ça se fait habituellement tel que ci-après, mais dans l'unité de la SplashForm. J'ai fait un essai dans le OnActivate ou OnShow de la SplashForm et l'évènement onCloseQuéry d'une fenêtre mais ça ne fonctionne pas. La fenêtre de l'application se lance immédiatement et on ne voit pas défiler les messages de la SplashForm...

    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
     
    var SplashForm : TSplashForm;
    begin
      Application.Initialize;
      SplashForm := TsplashForm.create(application);
      SplashForm.Show;
      SplashForm.Update;
      try
        {Ici le code du travail qui se fait avant le lancement de la Fiche principale de l'application}
        ...
        Application.CreateForm(TForm1, Form1); // Fiche principale application    
        SplashForm.close;
      finally
        SplashForm.Release;// libération de la mémoire
      end;
      Application.Run;
    end.
    Le but serait d'éviter de déclarer des variables dans le corps principal qui sont donc globales alors qu'elles ne servirons pratiquement plus (sauf exception) par la suite.

    L'utilisation du sleep ne me convient pas non plus car c'est trop figé du fait que les tâches à réaliser sont différentes en temps.

    Merci pour vos réponses

    Je programme en Lazarus 3.2.2 sous windows 10 pro

  2. #2
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    essaye le sendmessage user+1

  3. #3
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Bonjour Alweber,

    Tu veux dire de n'afficher la fenêtre principale que sur réception du message envoyé par SendMessage depuis ma splashForm?
    C'est peut-être une piste en effet!
    Reste la question de la création de la fiche principale. Peut-être vaudrait-il mieux la crééer à partir de la Fiche SplashForm dans ce cas...


    A+
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Jlmat Voir le message
    Bonjour Alweber,

    Tu veux dire de n'afficher la fenêtre principale que sur réception du message envoyé par SendMessage depuis ma splashForm?
    C'est peut-être une piste en effet!
    Reste la question de la création de la fiche principale. Peut-être vaudrait-il mieux la crééer à partir de la Fiche SplashForm dans ce cas...

    A+
    Oui si tu as besoin je peux te faire un exemple

  5. #5
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    J'utilise aussi une splashform dans mon application mais je ne la ferme pas depuis le programme principal comme toi.

    Le code du programme principal devient celui-ci:
    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
     
    var SplashForm : TSplashForm;
    begin
      Application.Initialize;
      SplashForm := TsplashForm.create(application);
      SplashForm.Show;
      SplashForm.Update;
      try
        {Ici le code du travail qui se fait avant le lancement de la Fiche principale de l'application}
        ...
        Application.CreateForm(TForm1, Form1); // Fiche principale application    
      finally
      end;
      Application.Run;
    end.
    Pour la fermeture, j''utilise un TTimer dans la fenêtre principal que j'appelle TimerInit dont la propriété Enabled est égal à false.
    Lorsque je souhaite fermer la Splashform, (depuis la form principale, lorsque toutes les phases d'initialisation sont terminées) j'active le timer par TimerInit.Enabled:=true;
    Dans l'évènement OnTimer j'écris ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TFormApp.TimerInitTimer(Sender: TObject);
    begin
      TimerInit.enabled:=false; // One shot timer
      if Assigned(SplashForm) and SplashForm.visible then SplashForm.close;
    end;

  6. #6
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Il faut aussi impérativement que la propriété FormStyle de la SplashForm soit égale à fsStayOnTop si tu veux qu'elle reste visible par dessus la fenêtre principale.
    Et la propriété Position=poMainFormCenter

  7. #7
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut

    Bon désolé, j'étais en train de rédiger ce post quand je viens de m'apercevoir que vous aviez envoyé des réponses entre temps. Ne pouvant annuler ma réponse (une amélioration à envisager pour les gestionnaires du site s'ils ont le temps!), je suis obliger de valider...
    Je reviens vers vous...
    Voici la nouvelle structure que j'essaye de mettre en place :

    Pour le corps principal de l'application:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Application.Initialize;
      Application.CreateForm(TSplashForm,SplashForm);
      Application.Run;
    Pour la SpashForm:
    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
    Const
      kMsg : array[1..3] of String[64] = ('Msg1','Msg2','Msg3');
    type
      TSplashForm = class(TForm)
        procedure Timer1Timer(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
        indexTache      : integer;
        procedure Tache_1;
        procedure Tache_2;
        procedure Tache_3;
      public
        { Déclarations publiques }
      end;
     
    var
      SplashForm: TSplashForm;
     
    implementation
    uses Unit1; // unité de la fenêtre principale de l'Application à lancer
    {$R *.dfm}
     
     
    procedure TSplashForm.FormCreate(Sender: TObject);
    begin
      Timer1.Enabled := True;
      indexTache     := 1; // pour lancer la première tâche...
    end;
     
    procedure TSplashForm.Timer1Timer(Sender: TObject);
    begin
      Label2.Caption := String(kMsg[IndexTache]);
      Label2.Update;
      case IndexTache of
      1: Tache_1;
      2: Tache_2;
      3: Tache_3;
      4: Application.CreateForm(TForm1, Form1); // Création de la fenêtre principale de l'application
      end;
    end;
     
    procedure TSplashForm.Tache_1;
    begin
         ...  // opérations à effectuer
        inc(indexTache);
        sleep(500); // pour un minimum de temps d'affichage. s'additionnera donc au temps réel de l'opération
    end;
     
    // idem pour les taches 2 et 3
     
    end.
    Pour la Fiche principale de l'appli, je rajoute dans la création de la form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      Form1.Show;
      SplashForm.Free;
    Ma splashForm fait bien défiler les tâches mais ma fenêtre principale n'apparait pas!
    Grr!

    Je programme en Lazarus 3.2.2 sous windows 10 pro

  8. #8
    Membre averti Avatar de franckcl
    Homme Profil pro
    Developpeur Delphi
    Inscrit en
    Septembre 2004
    Messages
    516
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Developpeur Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2004
    Messages : 516
    Points : 443
    Points
    443
    Par défaut
    Donc tu créés une fenêtre principale que tu detruits pour en créer une autre qui à son tour devient principale....par très sein quand même.
    Essaie plutôt de voir avec un timer dans la fenêtre principal comme indiqué dans mon post précédent.

  9. #9
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    @ Franck, merci pour ta contribution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var SplashForm : TSplashForm;
    begin
      Application.Initialize;
      SplashForm := TsplashForm.create(application);
      SplashForm.Show;
      SplashForm.Update;
      try
        {Ici le code du travail qui se fait avant le lancement de la Fiche principale de l'application}
        ...
        Application.CreateForm(TForm1, Form1); // Fiche principale application    
      finally
      end;
      Application.Run;
    end.
    Cependant ta proposition ne semble pas résoudre la question que tes variables restent en mémoire tout le long de l'application puisque tu les gère depuis ta fiche principale. Tes varaibles utilisées dans la SplasForm sont déclarées probablement globalement...


    @ Alweber, je veux bien que tu me donne un exemple de ta structure que je ne vois pas bien

    Merci à vous
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  10. #10
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Bonjour,

    une astuce que j'utilise parfois

    1- la fiche principale est vide et de la taille du SplahScreen
    2- le SplashScreen est un TFrame placé sur la fiche principale
    3- à la fin du SplashScreen je le remplace par le TFrame principal de l'application en redimensionnant la fiche selon ce qui est prévu

    cela permet de n'avoir qu'une seule MainForm (ce qu'attends Application) alors qu'on change complètement l'aspect de la fenêtre.

    NB: en réalité je n'utilise jamais les SplashScreen, mais j'utilise cette technique pour une fenêtre de connexion.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Voici un exemple (aussi en pièce jointe)
    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
     
    program ex01;
     
    uses
      Vcl.Forms,
      ex01a in 'ex01a.pas' {Form1},
      ex01b in 'ex01b.pas' {Form2};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.ShowMainForm := false ;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Form2.Visible := true ;
      Application.Run;
    end.
    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
     
    unit ex01a;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls;
     
    type
      TForm1 = class(TForm)
        Timer1: TTimer;
        procedure Timer1Timer(Sender: TObject);
      end;
     
    var
      cpt1: integer;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    uses ex01b;
     
    procedure TForm1.Timer1Timer(Sender: TObject);
    begin
      cpt1 := cpt1 + 1 ;
      if cpt1 = 4 then
      begin
        self.Visible := true ;
        form2.Visible := false ;
      end;
      SendMessage(Form2.Handle, WM_USER + 1, 0, 0)
    end;
     
    end.
    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
     
    unit ex01b;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls;
     
    type
      TForm2 = class(TForm)
        ProgressBar1: TProgressBar;
        procedure RecoitMessage(var Msg: TMessage); message WM_USER + 1;
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
    { TForm2 }
     
    procedure TForm2.RecoitMessage(var Msg: TMessage);
    begin
      ProgressBar1.Position := ProgressBar1.Position + 25 ;
    end;
     
    end.
    Fichiers attachés Fichiers attachés

  12. #12
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Bravo Alweber, ça fonctionne!

    J'ai simplement rajouté dans le OnCreate de la Fiche principale, l'ordre de destruction de la splashForm car dans l'exemple du code que tu donnes, tu la fait simplement disparaître de l'écran.

    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
     
    var
      Form1 : TForm1;
      H        :  THandle;
     
    implementation
     
    {$R *.dfm}
     
    uses ex01b;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      H := FindWindow(nil,'Form2');
      if H <> 0  then Form2.Release;
    end;
    Je ne clôture pas le post car je voudrais exploiter la solution de Paul si j'y arrive!
    Car je ne suis pas familiarisé avec les cadres et il en parle souvent et les utilise!
    C'est vrai que j'aime bien la solution des SendMessage que j'utilise souvent dans mes applications, ça remonte au Pascal Objet... ça nous rajeunit pas...

    A+
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  13. #13
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Jlmat Voir le message
    Bravo Alweber, ça fonctionne!

    C'est vrai que j'aime bien la solution des SendMessage que j'utilise souvent dans mes applications, ça remonte au Pascal Objet... ça nous rajeunit pas...
    A+
    Effectivement j'avais oublié Mais comme j'ai commencé turbo-pascal en 1984 je pense que c'est passé dans mon inconscient collectif

  14. #14
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    @ Paul


    Je suis "dégoutté" d'être passé à côté de l'utilisation des frames. Je n'avais pas compris son utilité avant aujourd'hui. Un comble quand je pense aux nombreuses heures passées à utiliser des copier/coller de lignes d'anciennes présentations de fenêtres!

    Mais cependant en essayant de répondre à ma question initiale, j'ai quelques difficultés...

    Si je reprends ta proposition:
    1- la fiche principale est vide et de la taille du SplahScreen
    2- le SplashScreen est un TFrame placé sur la fiche principale
    3- à la fin du SplashScreen je le remplace par le TFrame principal de l'application en redimensionnant la fiche selon ce qui est prévu
    Pour l'étape 1:
    - Donc tu créer seulement la Fiche principale dans le code source
    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
     
    program Project1;
     
    uses
      Vcl.Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Frame2: TFrame};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Le frame 2 est ma fenêtre splash. Là j'ai une première difficulté. Par exemple, en reprenant l'exemple simple de AlWeber, ma frame comprend une simple progressBar qui progresse au rythme du timer mis sur la fiche principale.
    Cependant en cherchant dans les évènements de Frame2, je ne trouve pas de méthode comme On Create ou OnActivate...
    En regardant dans la documentation d'embarcadero, il semble pourtant que ces méthodes existent par héritage. Mais Embarcadero ne donne aucune information sur leur utilisation...
    J'ai bien essayé d'utiliser onEnter, mais le focus ne génère pas l'évènement... Là je suis coincé!

    Ensuite, je ne vois pas très bien comment tu réalises le point trois:
    - est-ce que tu détruit le frame 2 comme une fiche normale?
    - quand tu dis que tu la remplaces par Frame principal, cela signifie que ma fenêtre principale de mon application est en réalité un TFrame?!
    là pour le coup, je suis dans l'interrogation car si je dois revoir toutes les méthodes de ma fiche principale du fait que les méthodes utilisées sont différentes, ça n'est plus une petite remise en question, c'est tout à revoir!

    merci pour tes éclairages...

    A+
    Je programme en Lazarus 3.2.2 sous windows 10 pro

  15. #15
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Jlmat Voir le message
    Cependant en cherchant dans les évènements de Frame2, je ne trouve pas de méthode comme On Create ou OnActivate...
    C'est une des grosses différences entre un Frame et une forme. Mais il y a des solutions FAQ
    , cela dit il est aussi possible de docker un TForm (qui elle a ces évènements)

    ça y est je t'avais pourtant écrit que je ne mettrai pas mon grain de sel

    pour FMX, je fais différemment
    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
    115
     
    {$REGION 'Documentation'}
      ///L'écran de démarrage principal
      ///
      /// - peut être annulé par le paramètre -nsp
      /// - peut être rallongé en temps par le paramètre -sp <délai> ou délai est en 100° de secondes
      ///
      /// ATTENTION : le titre de la fenêtre est pris dans le fichier version.txt!
    {$ENDREGION}
     
    unit UnitSplash;
     
    { TODO 2 : Ajouter mise à jour (ftp+download+install) }
     
     
    interface
     
    uses
      System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
      FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects,
      FMX.Controls.Presentation, FMX.StdCtrls;
     
    type
      {Ecran de démarrage}
      TFormSplash = class(TForm)
        SplashImage: TImage;       //< Image
        StartupTimer: TTimer;      //< Timer
        Titre: TLabel;             //< Titre de l'application dans version.txt
        procedure FormCreate(Sender: TObject); //< Creation de l'ecran
        procedure SplashImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF); //< Affichage
        procedure StartupTimerTimer(Sender: TObject); //< Fin du delai
      private
        FInitialized: Boolean;  //< affiche
        procedure LoadMainForm; //< Charge la forme principale
      public
     
      end;
     
    var
      FormSplash: TFormSplash;
     
    {$I Version.Txt}
     
    implementation
     
    uses
      System.Devices, MainUnit;
     
    {$R *.fmx}
     
    resourcestring
      SNotSuitableForDevice = 'L''application n''est pas prévue pour de type d''appareil!';
     
    {Création de l'écran}
    procedure TFormSplash.FormCreate(Sender: TObject);
    var i : word; //< pour boucle sur les paramètres
    begin
      Caption:=nomApplication;
      Titre.text:=Format('%s %s',[nomApplication,numVersion]);
      StartupTimer.Enabled := false;
      StartupTimer.Interval := 500; //< modifiable 5s. par défaut
      for i := 1 to ParamCount-1 do
        begin
         if SameText(ParamStr(i),'-nsp')
          then begin
               StartupTimer.Interval:=10;
               break;
          end;
         if SameText(ParamStr(i),'-sp')
           then StartupTimer.Interval:=StrToIntDef(ParamStr(i+1) ,StartupTimer.Interval);
        end;
    end;
     
    procedure TFormSplash.LoadMainForm;
    {<Charge la fenêtre principale de l'application selon le type d'appareil}
    type
      TFormClass = class of TForm;
    var
      form: TForm;
      formClass: TFormClass;
    begin
      formClass := nil;
      case TDeviceInfo.ThisDevice.DeviceClass of
        TDeviceInfo.TDeviceClass.Desktop: formClass := TMain;
    // autres appareils
      end;
     
      if formClass <> nil then begin
        form := formClass.Create(Application);
        form.Show;
        Application.MainForm := form;
      end
      else begin
        ShowMessage(SNotSuitableForDevice);
      end;
      Close;
    end;
     
    procedure TFormSplash.SplashImagePaint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
    {< démarre le timer}
    begin
      StartupTimer.Enabled := not FInitialized;
    end;
     
    procedure TFormSplash.StartupTimerTimer(Sender: TObject);
    {< Au démarrage du timer}
    begin
      StartupTimer.Enabled := false;
      if not FInitialized then begin
        FInitialized := true;
        LoadMainForm;
      end;
    end;
     
    end.
    du coup source le projet est "simple"
    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
     
    program GesDocFacture;
     
    {
    paramètres de l'application
     -ip adresse : adresse du serveur Firebird
     -nsp        : pas de splash screen
     -sp délai   : temps d'affichage minimum du Splash Screen
     -f          : Possibilité de modifier gabarit facture fastreport
    }
    uses
      System.StartUpCopy,
      FMX.Forms,
      MainUnit in 'MainUnit.pas' {Main},
      UnitSplash in '..\UnitSplash.pas' {FormSplash},
     ...;
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.CreateForm(TFormSplash, FormSplash);
      Application.Run;
    end.
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  16. #16
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 689
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 689
    Points : 13 118
    Points
    13 118
    Par défaut
    Je ne dis pas que la version d'ALWEBER ne fonctionne pas mais elle part du principe que rien n'est fait dans TForm1.OnCreate (ou tout du moins rien qui ne prenne beaucoup de temps) puisque Form2 ne sera affichée qu'à la fin de sa construction !

    La première version proposée est mieux à la seule différence qu'il ne faut pas redéclarer une variable SplashForm dans la source du projet. Celle déclarée dans l'unité est suffisante et de plus utilisable dans toutes les autres unités à travers uses, exactement ce que tu souhaites

    En ce qui concerne le timer du Splash, et bien il est inutile de s'en occuper, tu le poses sur la fiche (SplashForm) en enabled et c'est tout

    Disons qu'il est fixé à 3 secondes. Si le temps de chargement est inférieur à ce temps, il restera affiché 3 secondes minimum. Il n'y a rien de plus détestable qu'une fenêtre dont on a pas le temps de lire le contenu, voire qui ne produit qu'un flash à l'écran si le chargement est instantané !
    Si le temps de chargement est plus long, et bien la fenêtre disparaîtra immédiatement à la fin du chargement. S'il a pris 20 secondes, inutile d'attendre 3 secondes de plus.

    Ce comportement s'explique simplement par le fait que le message WM_TIMER ne sera interprété que lorsque l'application aura le temps de le faire, soit sur Application.Run.

    Si tu veux mettre à jour du texte sur le splash, il faudra bien sûr appeler Update de la fiche et non Application.ProcessMessages qui aurait pour effet d'interpréter immédiatement WM_TIMER.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TSplashForm.Status(aText: string);
    begin
      Label1.Caption := aText;
      Update;
    end;
     
    procedure TSplashForm.Timer1Timer(Sender: TObject);
    begin
      Release;
    end;

  17. #17
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Je ne dis pas que la version d'ALWEBER ne fonctionne pas mais elle part du principe que rien n'est fait dans TForm1.OnCreate (ou tout du moins rien qui ne prenne beaucoup de temps) puisque Form2 ne sera affichée qu'à la fin de sa construction !
    L'objectif est de modéliser la solution qui fonctionne aussi s'il y a pas mal de chose à faire dans le onCreate ce qu'il m'arrive de faire dans certain de mes développements.
    EN fait le sendmessage est prioritaire ce qui explique la réactivité

  18. #18
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 689
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 689
    Points : 13 118
    Points
    13 118
    Par défaut
    Comment envoyer un message à une fiche qui n’existe pas encore ?

  19. #19
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Jlmat Voir le message
    @ Paul


    Je suis "dégoutté" d'être passé à côté de l'utilisation des frames. Je n'avais pas compris son utilité avant aujourd'hui. Un comble quand je pense aux nombreuses heures passées à utiliser des copier/coller de lignes d'anciennes présentations de fenêtres!

    Mais cependant en essayant de répondre à ma question initiale, j'ai quelques difficultés...

    Si je reprends ta proposition:


    Pour l'étape 1:
    - Donc tu créer seulement la Fiche principale dans le code source
    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
     
    program Project1;
     
    uses
      Vcl.Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas' {Frame2: TFrame};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    Le frame 2 est ma fenêtre splash. Là j'ai une première difficulté. Par exemple, en reprenant l'exemple simple de AlWeber, ma frame comprend une simple progressBar qui progresse au rythme du timer mis sur la fiche principale.
    Cependant en cherchant dans les évènements de Frame2, je ne trouve pas de méthode comme On Create ou OnActivate...
    En regardant dans la documentation d'embarcadero, il semble pourtant que ces méthodes existent par héritage. Mais Embarcadero ne donne aucune information sur leur utilisation...
    J'ai bien essayé d'utiliser onEnter, mais le focus ne génère pas l'évènement... Là je suis coincé!

    Ensuite, je ne vois pas très bien comment tu réalises le point trois:
    - est-ce que tu détruit le frame 2 comme une fiche normale?
    - quand tu dis que tu la remplaces par Frame principal, cela signifie que ma fenêtre principale de mon application est en réalité un TFrame?!
    là pour le coup, je suis dans l'interrogation car si je dois revoir toutes les méthodes de ma fiche principale du fait que les méthodes utilisées sont différentes, ça n'est plus une petite remise en question, c'est tout à revoir!

    merci pour tes éclairages...

    A+
    alors en effet les Frame n'ont pas d'évènements OnCreate OnDestroy, mais tu peux surcharger le constructor

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type
      TFrame1 = class(TFrame)
      public
       constructor Create(AOwner: TComponent); override;
      ...
     
    constructor TFrame1.Create(AOwner: TComponent);
    begin
      inherited;
      // mettre ici le code qui va bien
    end;
    sinon j'ai mis un exemple ici
    https://github.com/tothpaul/DelphiTi...ter/SplashTest
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  20. #20
    Membre actif
    Avatar de Jlmat
    Homme Profil pro
    Consultant en Ressources Humaines, Retraité passionné de programmation
    Inscrit en
    Avril 2008
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant en Ressources Humaines, Retraité passionné de programmation
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 284
    Points : 287
    Points
    287
    Par défaut
    Euh, là va me falloir du temps pour étudier les réponses supplémentaires de Sergio et Andnotor!

    Finalement, t'as craqué Sergio, ha c'est le virus de l'informatique, sympa celui là!

    Avant que je ne m'aventure dans le Labyrinthe de vos neurones, je dois comprendre de quoi vous parlez:

    @ Sergio

    C'est une des grosses différences entre un Frame et une forme. Mais il y a des solutions FAQ
    , cela dit il est aussi possible de docker un TForm (qui elle a ces évènements)
    Docker, c'est à dire mettre un TFrame sur une TForm?

    Dis moi si je me trompe.
    L'exemple que tu proposes est écrit pour FMX. Là aussi faudra que je m'y mettre car au niveau graphique, àa l'air plus sympa que la VCL!
    Du coup dans ton exemple, tu lances la SplashForm qui gère tout : procédures de tâches et contrôle du timer qui détecte la fin de tes tâches. Ai-je bien survoler le code?

    OK, faut que j'essaye!

    @ Andnotor

    Euh... Je reprends après! Faut que je vois quelque chose...
    Je programme en Lazarus 3.2.2 sous windows 10 pro

Discussions similaires

  1. Affichage d'une image pendant le chargement
    Par abbd dans le forum Windows Forms
    Réponses: 3
    Dernier message: 25/04/2008, 21h34
  2. Réponses: 3
    Dernier message: 10/08/2007, 10h32
  3. Réponses: 7
    Dernier message: 04/04/2007, 15h18
  4. affichage d'une page pendant son chargement
    Par boss_gama dans le forum ASP
    Réponses: 3
    Dernier message: 17/08/2006, 18h04
  5. Réponses: 11
    Dernier message: 17/05/2006, 08h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo