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 :

Exécution d'un code après le "démarrage" de l'application


Sujet :

Langage Delphi

  1. #1
    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 Exécution d'un code après le "démarrage" de l'application
    Salut à tous,
    Je me demande si il n'existe pas un moyen propre d’exécuter du code une fois que l'application est réellement lancée et prête à être utilisée.

    Par exemple, j'ai une application qui peut prendre /AutoStart en ligne de commande, qui lance le même traitement que si l'utilisateur avait cliqué sur un des boutons de la form principale. (ce n'est qu'un des cas pour lesquels j'ai besoin de ce style de fonctionnement)
    La question est donc de trouver l'endroit depuis lequel lancer ce traitement.
    • Au Create : trop tôt, la form n'est pas affichée
    • Au OnShow : trop tôt, la form n'est toujours pas affichée
    • Au OnActivate : c'est presque ca, mais peut etre lancé plusieurs fois si la form perd et reprend le focus au sein de l'application


    Actuellement, j'ai 2 méthodes. Une que je trouve assez dégueulasse, un autre que je préfère mais qui ne me semble pas très jolie.
    La première et plus simple : un timer sur la form de 1 seconde, que je désactive au 1er événement.
    La deuxième, c'est un message local, genre UM_START, que je post sur mon handle dans le create de ma form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TForm1.create(AOwner: TComponent);
    begin
      inherited;
      PostMessage(Self.Handle, UM_START, 0, 0);
    end;
    Connaissez-vous un moyen plus propre d'arriver à mes fins ?

    J'ai pensé aussi à utiliser le OnActivate + un boolean pour en faire le traitement qu'une seule fois, mais ça ne me semble pas être la solution idéale.

    Merci de votre aide

  2. #2
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    2 méthode,
    en utilisant un timer, ou voir du coté postemessage+application.prossecemessage que je préfére

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Aucune méthode n'est "dégueulasse" et je dirais même plus : ces deux méthodes sont (presque) identiques

    Si tu as un besoin visuel, il faut bien attendre que l'application soit prête. La meilleure façon est d'envoyer un message asynchrone et de laisser l'application se débrouiller.
    Pourquoi sont-elles identiques ? Et bien le timer n'est rien d'autre qu'un PostMessage(WM_TIMER)

    Tu aurais également la possibilité d'attendre que l'application soit Idle, soit attendre que la pile des message ait été vidée.

  4. #4
    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 Andnotor Voir le message
    Pourquoi sont-elles identiques ? Et bien le timer n'est rien d'autre qu'un PostMessage(WM_TIMER)
    ... à ceci pres que le timer à un temps minimum avant de lancer l'evenement, donc est un poil plus complexe que le simple PostMessage fait par mes soins

    J'avais pensé au Idle, mais je ne suis pas sur de son comportement, et ca fait un traitement de plus a chaque Idle (tu me dira on s'en fout, si il est Idle c'est justement qu'il a du temps libre :p).

    Si tu avais à voter entre le Idle et le PostMessage, tu choisirai lequel ?

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 764
    Points : 13 386
    Points
    13 386
    Par défaut
    Le timer te donne un sentiment de sécurité parce que tu te dis qu'en retardant l'événement d'une seconde, tu es bon ! ça marchera dans 99% des cas, mais le 1% restant, tu vas vraiment te creuser la tête

    Démarrer une application avec ou sans paramètre n'est pas différent. Que tu doive presser un bouton "Démarrer" ou qu'il y ait un /Autostart, le programme doit être dans un état stable ; tout ce qui doit être créé l'a été !

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Application.CreateForm(TForm3, Form3);
      Application.CreateForm(TForm4, Form4);
    
      Form1.procedure1();
    
      Application.Run;
    end.

  7. #7
    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
    @tarek :
    ca ne repond pas a mon probleme, dans ton cas, l'application ne tourne pas, et les form ne sont pas visibles

    @andnotor :
    C'est pour ca que je n'aime pas le timer. En passant par le message, je sais que le create et le show auront été faits

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2012
    Messages : 111
    Points : 171
    Points
    171
    Par défaut
    bon jour
    dans mon cas si votre probleme just l'affichage d'une forme vou pouvez utilisez form1.show avant la brocedure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Application.CreateForm(TForm3, Form3);
      Application.CreateForm(TForm4, Form4);
     
      Form1.show;
      Form1.procedure1();
     
      Application.Run;
    end.
    A+

  9. #9
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par tarekk73 Voir le message
    bon jour
    dans mon cas si votre probleme just l'affichage d'une forme vou pouvez utilisez form1.show avant la brocedure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Application.CreateForm(TForm3, Form3);
      Application.CreateForm(TForm4, Form4);
     
      Form1.show;
      Form1.procedure1();
     
      Application.Run;
    end.
    A+
    sa fait longtemps que je ne crée plus mes forms au démarrage de l'appli

  10. #10
    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 edam Voir le message
    sa fait longtemps que je ne crée plus mes forms au démarrage de l'appli
    Pareil ... enfin à part la forme principale

    Bon, je crois que je n'aurai pas plus de réponses, je met le sujet en résolu.

    Merci de votre aide

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

Discussions similaires

  1. Exécuter automatiquement du code après onStart()
    Par Caleo dans le forum Android
    Réponses: 1
    Dernier message: 03/11/2013, 11h36
  2. [VB.net] Exécuter code après ajout dans datagridview
    Par collaud_vb dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/09/2006, 11h45

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