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

Langage Delphi Discussion :

Attendre qu'une form soit chargée avant d'exécuter du code


Sujet :

Langage Delphi

  1. #1
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut Attendre qu'une form soit chargée avant d'exécuter du code
    Hello,

    A l'apparition d'une form, j'aimerais lancer une série de fonctions mais qui doivent s'exécuter uniquement lorsque la form est chargée.

    Le but est que la form s'affiche, et que les résultats des fonctions s'écrivent au fur et à mesure.

    Pour l'instant j'ai mis mes appels de fonctions dans le formShow, et la form n'apparaît qu'une fois toutes les fonctions terminées, ce qui n'est pas terrible (long à charger, et pas d'effet visuel d'incrémentation des résultats).

    Une idée ?

  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Salut,

    Et si tu mettais sur ta Form un Timer avec Enabled:=False lors de la conception, ... puis à la fin du formShow (débrassé de l'appel des fonctions) un simple Timer1.Enabled:=True; de façon à ne déclencher l'appel de tes fonctions qu'en différé avec lévénement OnTimer ça devrait marcher et peut-être même avec l'intervalle par défaut de 1000 millisecondes.

    Mais dans l'événement OnTimer n'oublies pas d'achever ce premier appel à tes fonctions par Timer1.Enabled:=False; sinon ça va tourner en rond voire bloquer.

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Bonjour,

    As tu essayer du coté du OnActivate de ta fiche?

    A+
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Juste avant de lancer la premiere fonction rajoute un Application.ProcessMessages (voir en mettre aussi dans les boucles au endroit clef de tes fonctions).

    Sinon, la solution de GilBert est pas mal non plus

    Citation Envoyé par pitango Voir le message
    Bonjour,

    As tu essayer du coté du OnActivate de ta fiche?

    A+
    Attention avec le OnActivate à chaque fois que la fenêtre à le focus l'évènement est appelé, donc c'est à éviter.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    158
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 158
    Points : 158
    Points
    158
    Par défaut
    Citation Envoyé par Rayek
    Attention avec le OnActivate à chaque fois que la fenêtre à le focus l'évènement est appelé, donc c'est à éviter.
    oups!!

    Effectivement, mauvais idée.
    Pitango
    -------------------------------------------------
    [Delphi7.1 Entreprise][MYSQL 5.0.27][SQL SERVER 7][W2000/NT4]

  6. #6
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    tu peux essayer, dans le formshow, de mettre ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm.Show()
    begin
      inherited;
      Application.ProcessMessages;
      TonTraitement; // avec des Application.ProcessMessages  dans ton traitement à chaque fois que tu veux forcer l'affichage
    end;
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  7. #7
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    @TicTacToe

    Pourquoi un inherited ? Nous sommes sur une procédure TNotifyEvent.

  8. #8
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Merci pour les réponses.

    Le Timer de Gilbert fonctionne parfaitement.

    Par contre j'ai aussi essayé le Application.ProcessMessages dans le FormShow juste avant d'appeler mes fonctions, mais celui-ci ne fonctionne pas : ma form apparaît uniquement lorsque tous les résultats sont calculés.

  9. #9
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    avec des Application.ProcessMessages dans ton traitement à chaque fois que tu veux forcer l'affichage
    ... l'autre jour il a été dit (me souviens plus dans quelle discussion) que Application.ProcessMessages donne le main à Windows pour traiter tout ce qui est en attente et que pour forcer uniquement l'affichage fallait utiliser un UpDate (ex : Edit1.UpDate). Non ?

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  10. #10
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par Cl@udius Voir le message
    @TicTacToe

    Pourquoi un inherited ? Nous sommes sur une procédure TNotifyEvent.
    Que ce soit TNotifyEvent ou pas ne change rien.
    Je travaille surtout en héritage de form, j'ai mis le inherited pour garantir que le code de la fenêtre mère éventuelle soit appelé.

    Mais je pense aussi qu'il y a de forte chance qu'il n'y en ait pas de fenêtre mère dans le code de notre ami, mais au cas ou, ca ne mange pas de pain

    @Gilbert
    Honnetement Je sais plus pour le Application.ProcessMessages, mais il me semble que c'est uniquement pour l'application (mais il me semble seulement...)
    Section Delphi
    La mine d'or: La FAQ, les Sources

    Un développement compliqué paraitra simple pour l'utilisateur, frustrant non ?
    Notre revanche ? l'inverse est aussi vrai ;-)

  11. #11
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par TicTacToe Voir le message
    Je travaille surtout en héritage de form, ...
    Ok, ceci explique cela. Comme je n'ai pas cette habitude de travail, ça ne mettait pas venu à l'idée.

    @+

  12. #12
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Je marque le sujet comme résolu vu que la solution de Gilbert avec le Timer me convient.

    Cependant je reste sur ma faim avec le Application.ProcessMessages, car cette solution ne fonctionne toujours pas chez moi. Donc peut-être à creuser encore pour éviter le léger temps d'attente dû au Timer.

  13. #13
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    quitte a utiliser le timer 1 fois, autant utiliser une methode un peu plus propre.

    Ingrédients:
    1 champ boolean "PremiereFois" dans ta classe

    Préparation
    • mettre PremiereFois a true au Create de ta form
    • Sur le OnActivate, ajouter le code suivant:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
       
      if Self.PremiereFois then
      begin
        PremiereFois := False;
        application.ProcessMessages;
        DemarrerLesCalculs;
      end;


    PS: pense bien a mettre des application.processMessage de temps a autres dans tes calculs pour mettre a jour l'affichage.

  14. #14
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    A MiJack :
    Cependant je reste sur ma faim ...
    Donc peut-être à creuser encore pour éviter le léger temps d'attente dû au Timer.
    ... Bon maintenant que ça marche, réduis la valeur de la propriété Interval du Timer en passant de 1000 millisec à 500, puis 250 et ainsi de suite jusqu'au moment où ça coince : en tâtonnant tu finiras par trouver l'intervalle le plus bref avec lequel cela fonctinnera correctement. Il n'est pas interdit d'espérer que cet intervalle mini soit bigrement plus faible que les 1000 ms cités initialement par prudence mais avec un bécane qui pédalle à "N" Ghz il n'est certainement pas nécessaire de marquer une pause d'une seconde entière entre la fin du formShow et le if PremiereFois then évoqué par Guillemouze...

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  15. #15
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Gilbert Geyer Voir le message
    ... Bon maintenant que ça marche, réduis la valeur de la propriété Interval du Timer en passant de 1000 millisec à 500, puis 250 et ainsi de suite jusqu'au moment où ça coince : en tâtonnant tu finiras par trouver l'intervalle le plus bref avec lequel cela fonctinnera correctement.
    Le timer reste une solution peu fiable. En effet, si sur une machine X, 100 ms sont necessaire pour afficher la forme et ensuite demarrer les calculs, sur une autre machine Y moins puissante, il en faudra peut etre 400 ms. Donc tu ne peux pas vraiment evaluer le temps qu'il te faudra attendre avant d'avoir ton affichage correct !

    Citation Envoyé par Gilbert Geyer Voir le message
    mais avec un bécane qui pédalle à "N" Ghz il n'est certainement pas nécessaire de marquer une pause d'une seconde entière entre la fin du formShow et le if PremiereFois then évoqué par Guillemouze...
    Tout a fait. Je dirais meme plus, il n'est pas necessaire du tout de marquer une pause avec ma methode, etant donné qu'elle a justement pour but de demarrer au moment "exacte" ou la forme est visible. Le timer n'est nullement necessaire avec ma methode

  16. #16
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Re-bonjour,

    Guillemouze a écrit : il n'est pas necessaire du tout de marquer une pause avec ma methode, etant donné qu'elle a justement pour but de demarrer au moment "exacte" ou la forme est visible. Le timer n'est nullement necessaire avec ma methode.
    ... Eh ben oui t'as raison
    ... En fait je me suis laissé pièger par la lecture première ligne de ton message d'Hier 19h25 :
    quitte a utiliser le timer 1 fois, autant utiliser une methode un peu plus propre.
    ... puis j'ai sauté directement à la ligne if Self.PremiereFois then ... et j'en ai déduit que ce sera logé dans le OnTimer (ce n'est qu'en relisant aujourd'hui que j'ai pris conscience que ce sera placé dans le OnActivate)

    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  17. #17
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2003
    Messages
    422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2003
    Messages : 422
    Points : 238
    Points
    238
    Par défaut
    Alors le ProcessMessages ne fonctionne a priori pas ni dans le OnActivate, ni le OnCreate, ni le OnShow. J'ai également ajouté plusieurs ProcessMessages dans mes calculs, mais le tout ne s'affiche qu'à la fin de ceux-ci.

    Pour le timer, j'ai laissé 500 millisecondes, ce qui devrait être une bonne moyenne, mais je suis conscient que ce n'est pas la solution la plus propre.

  18. #18
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Je viens de trouver une méthode pour résoudre ce problème que j'ai déjà rencontré plus d'une fois : C'est de définir un message utilisateur et d'envoyer ce message dans le OnShow de la form par un PostMessage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    const
      WM_CALCUL = WM_USER + 1;
     
    type
     
      TForm1 = class(TForm)
        procedure FormShow(Sender: TObject);
      private
        procedure Calcul(var msg : TMessage);Message WM_CALCUL;
      public
      end;
    Puis dans l'implementation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    procedure TForm1.Calcul(var msg: TMessage);
    begin
      ...
    end;
     
    procedure TForm1.FormShow(Sender: TObject);
    begin
      PostMessage(Self.Handle,WM_CALCUL,0,0);
    end;
    Le message WM_CALCUL sera traité après l'affichage de la fenêtre.
    D'après mes tests, cette méthode fonctionne bien ... Qu'en pensez-vous ?
    A+
    Eb

  19. #19
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    pas bete du tout comme idée
    et ca me semble assez propre comme methode

  20. #20
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 118
    Points : 89
    Points
    89
    Par défaut
    bonjour,

    j 'ai essayer la solution de ebastien , ca marche tres bien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Attendre qu'un recalcul soit effectué avant de continuer le code
    Par ANOVA dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 12/08/2010, 14h27
  2. Attendre qu'une fenetre soit fermée avant de continuer.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/05/2007, 17h43
  3. Attendre qu'une tâche soit terminée avant d'en lancer une autre
    Par guidav dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 16/04/2007, 17h07
  4. Comment faire pour qu'une Form reste en avant-plan?
    Par Bodom-Child dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/08/2005, 10h28
  5. [API Windows]Attendre qu'une fenetre soit dessinee
    Par VoLc0m dans le forum Windows
    Réponses: 21
    Dernier message: 13/05/2005, 15h11

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