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 :

SplashScreen durant l'exécution


Sujet :

Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut SplashScreen durant l'exécution
    Bonjour à tous

    Je suis nul avec les SplashScreen (entre autres).

    J'ai effectué des recherches : http://delphi.developpez.com/faq/?pa...-splash-screen
    et ici aussi : http://www.developpez.net/forums/search.php?searchid=2287951 , url conseillée par ShaireLeTroll.

    Plus d'autres recherches sur le Net. Mais la plupart des splashscreen décrits sont exécutés au démarrage de l'application. D'où le recours à la modification du fichier DPR. Or, ce dont j'ai besoin, c'eest d'un splashscrenn durant l'exécution. En l'occurrence, une tâche assez longue.

    Voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Procedure Appel;
    begin
     
          Form2 := TForm2.Create(Application);
          Form2.Show;
          Sleep(3000);
          Form2.Free;
     
          Form1.Btn_Quitter.SetFocus;
    end;
    La Form2 :

    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
     
     
    unit Unit2;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm2 = class(TForm)
        Label1: TLabel;
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form2: TForm2;
     
    implementation
     
    {$R *.dfm}
     
     
    end.

    Là, elle ne fait rien. C'est juste un exemple. Mais la Form2 contient un TLabel affichant "Patientez". Or, on ne le voit pas.

    Où est-ce que je plante ?

    Merci

    P.S.: rectification. L'instruction suivante affiche bien le label :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm2.FormActivate(Sender: TObject);
    begin
          Form2.Label1.Update; 
    end;

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Ben non, ça ne marche décidément pas.

    J'ai vraiment besoin d'un coup de man pour réaliser un vrai splash screen.

  3. #3
    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
    Bonjour,

    le splashscreen est en effet un écran qui s'affiche au début d'un programme (d'où le fait qu'il soit dans la partie Application, DPR)
    En fait ce que vous cherchez à faire est plutôt d'afficher un message (spécial mais un message quand même) .

    durant l'exécution... une tâche assez longue.
    hum, comment savoir si cette tâche prendra bien 3 secondes ou moins ou plus

    cela veut dire que si l'utilisateur clique sur la form1, une action quelconque va être effectuée => il faudrait plutôt un showmodal mais du coup ce dernier risque de bloquer le traitement !

    A mon avis il va plutôt falloir gérer ça par threads. Je sais, un truc au nom barbare et complexe pour un débutant, mais c'est ainsi que l'on avance
    et heureusement un tutoriel existe merci reisubar
    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

  4. #4
    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
    à priori c'est ça que tu veux.

    NB: pendant le Sleep(3000) l'application ne fait rien du tout, notamment elle n'affichera pas Form2, il suffit d'ajouter un Application.ProcessMessages devant le Sleep pour s'en rendre compte, la fiche s'affiche mais elle ne réagit pas "Pas de réponse de l'application" sur un Sleep trop long.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bonjour.

    Donc, je me suis trompé depuis le début : ce n'est pas d'un splashscreen dont j'ai besoin, mais d'un Thread. Je pourrai donc afficher une fenêtre "Patientez" tout en exécutant une tâche de fond. Laquelle tâche fermera la fenêtre au moment où elle prendra fin.

    Compris. Je vais bosser ce truc-là. Merci

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    à priori c'est ça que tu veux.

    NB: pendant le Sleep(3000) l'application ne fait rien du tout, notamment elle n'affichera pas Form2, il suffit d'ajouter un Application.ProcessMessages devant le Sleep pour s'en rendre compte, la fiche s'affiche mais elle ne réagit pas "Pas de réponse de l'application" sur un Sleep trop long.
    Voilà. Je teste donc ce "faux" splashscreen avec un thread. Je me suis appuyé sur ceci :
    /http://delphi.developpez.com/faq/?page=Thread


    Le fichier .DPR :
    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
     
    program Project1;
     
    uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1},
      Unit2 in 'Unit2.pas',  // Le code du thread
      Unit3 in 'Unit3.pas' {Form3};
     
    {$R *.res}
     
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);  // fenêtre principale
      Application.CreateForm(TForm3, Form3);  // la fenêtre affichant "Patientez ds un TLabel
      Application.Run;
    end.
    J'ai procédé comme indiqué dans les tutos : à travers l'IDE, Fichier/Nouveau/ Objet Thread

    Code du thread :

    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
     
    unit Unit2;
     
    interface
     
    uses
      Classes;
     
    type
      Test_Thread = class(TThread)
      private
        { Déclarations privées }
      protected
        procedure Execute; override;
      end;
     
     
     
    implementation
     
    { Important : les méthodes et propriétés des objets de la VCL peuvent uniquement
      être utilisés dans une méthode appelée en utilisant Synchronize, comme :
     
          Synchronize(UpdateCaption);
     
      où UpdateCaption serait de la forme
     
        procedure Test_Thread.UpdateCaption;
        begin
          Form1.Caption := 'Mis à jour dans un thread';
        end; }
     
    { Test_Thread }
     
     
    USES Unit3;  // La form affichant "Patientez"    
     
     
    procedure Test_Thread.Execute;
    begin
      { Placez le code du thread ici }
     
       Form3.Show; 
     
    end;
     
    end.

    Appel du thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    Procedure Appel_Thread;
    begin
                                                      // Commentaires et code M. Bardou
            Test_Thread := Test_Thread.Create(True); { True : création suspendue – il ne s'exécute pas encore }  // Bug !.  
            Test_Thread.FreeOnTerminate:=True;//on veut une destruction automatique après exécution.
    
            // Commentaires et codes personnels
            Copier(Handle_App, 'C:\CONVERSION', 'C:\DOWNLOADS');  // SHFileOperations : volontairement assez long
    
            // Code M. Bardou
            Test_Thread.Resume;    { maintenant, le thread est exécuté (sa procédure execute est exécutée) }
    end;
    Voici le message retourné par Delphi :



    Où est mon erreur ?

  7. #7
    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
    Le nom du thread (Test_Thread) ne peut pas avoir le même nom que la classe (Test_Thread).
    A part ça, ta procédure Copier doit être dans Execute du thread, sinon il est inutile.

  8. #8
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    D'accord. Je vais donc changer le nom du treadh.

    L'autre remarque, je comprends mal. Je crée un thread uniquement pour afficher une fenêtre. La procédure Copier(), ds mon esprit, ce n'est rien moins que la continuation du programme lui-même. Le thread n'a qu'un seul rôle à jouer : afficher une fenêtre. N'est-il pas censé ignorer ce que fait, pendant ce temps-là, la procédure l'appelant ?

  9. #9
    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
    C'est l'inverse, la tâche principale doit s'occuper de l'affichage et le thread du traitement long (la copie).

    Le thread ne va pas démarrer instantanément mais uniquement lorsque l'OS aura décidé de lui allouer du temps processeur. L'appel de Form3.Show surviendra alors que la tâche principale sera déjà en train de copier ton fichier, elle ne répondra donc plus à aucun message jusqu'à sa terminaison.

    De plus, Resume est placé après la copie... Form3 ne sera de tout façon affichée qu'une fois l'opération terminée

  10. #10
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    Bon...

    Donc, lorsqu'on aperçoit une sorte de spashscreen, durant l'exécution d'un logiciel, en fait c'est ce bloc-là de programme qui effectue lui-même la tâche que l'on pensait être une tâche de fond.

    Donc, à chaque fois que, en programmant, on aura besoin d'une fenêtre non modale affichant "simplement" "Veuillez patienter", c'est le bloc de programme affichant cette fenêtre qui fait le travail ? Et donc, on aura besoin d'un thread spécifique à chaque fois que l'on affichera (par exemple) "Patientez" ...

    C'est bien ça ?

  11. #11
    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
    non, d'autre part tu n'as pas regardé le code que je t'ai indiqué qui est un exemple complet de la façon de procéder.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 536
    Points : 121
    Points
    121
    Par défaut
    D'accord. Je recommence pas à pas selon ce code. Ca finira pas rentrer

Discussions similaires

  1. Arrêter une macro durant son exécution
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/10/2007, 14h30
  2. Réponses: 7
    Dernier message: 21/08/2007, 20h21
  3. Réponses: 5
    Dernier message: 12/10/2006, 17h03
  4. Rafraichir le flux HTML durant l'exécution d'une fonction
    Par Johnbob dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/09/2006, 18h03
  5. Réponses: 8
    Dernier message: 16/11/2005, 14h05

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