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 :

Piloter un composant situé dans une fiche à partir d'une autre fiche


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut Piloter un composant situé dans une fiche à partir d'une autre fiche
    Salut à tous,

    J'ai un petit souci sur Delphi.

    Je travaille sur une application qui doit traiter des informations.
    Ce traitement dure plusieurs secondes.
    Je souhaite donc mettre en place une ProgressBar pour que l'utilisateur puisse visualiser la progression de ce traitement.
    Jusque là, aucun souci, c'est simple à faire.
    Maintenant, afin d'améliorer l'ergonomie du programme, je souhaite faire apparaître cette ProgressBar dans une fenêtre et non dans la fiche principale.
    Pour cela, j'ai créé une fiche supplémentaire associée à une nouvelle unité que j'ai déclarée dans la clause uses de l'unité principale.
    J'ai placé ma ProgressBar dans cette fiche et je souhaite la piloter à partir de l'unité principale avec une boucle dans ce style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    While I < .... do with Form_Secondaire.ProgressBar
    begin
       ...
       Form_Secondaire.ProgressBar.Position := I;
       Inc(I);
    end;
    A la compilation, je n'ai aucun problème, mais lorsque le lance le programme, j'ai une erreur d'exception de type violation d'accès en écriture qui se déclenche à l'exécution de la ligne Form_Secondaire.ProgressBar.Position := I; comme si le composant, du fait qu'il ne soit pas sur la même unité que la boucle qui doit le piloter, n'est accessible qu'un lecture seule.

    Est-il possible de piloter un composant situé sur une fiche à partir de l'unité d'une autre fiche ?
    Si c'est possible, comment faire ?

    Merci pour vos lumières.

    Naga

  2. #2
    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
    la fiche n'est probablement pas crée, ou la variable Form_Secondaire ne pointe pas dessus...

    mais j'ai posté il y a quelque temps un code qui correspond à cette problématique -> ici
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    la fiche n'est probablement pas crée, ou la variable Form_Secondaire ne pointe pas dessus...

    mais j'ai posté il y a quelque temps un code qui correspond à cette problématique -> ici
    Salut Paul,

    Si j'ai bien compris l'exemple que tu as posté sur l'autre sujet, tu met en place une méthode qui permet d'afficher une fenêtre tant qu'un certains traitement (réalisé par le programme lui-même) est en cours (lister des fichiers avec une tempo).

    Mon cas est un peu différent :
    En faite, mon outils doit exécuter un script (.CMD) qui va lancer certains traitements plus ou moins longs en fonction de la réactivité des machines. La seule astuce que j'ai trouvée pour éviter de planter l'ensemble est de mettre une temporisation dans mon programme pour laisser au script le temps de faire son taffe avant de continuer.
    Donc, mon programme n'a aucune visibilité sur l'évolution de ce traitement.

    Ceci dit, mon souci n'est pas à ce niveau mais plutôt sur l'utilisation de ma ProgressBar :
    J'ai donc deux ensembles Form + Unités associées.
    Le code principale est dans l'unité principale et la ProgressBar dans l'autre unité (ou plutôt dans sa form associée).
    J'ai fais une déclaration mutuelle des deux unités pour être sûr qu'elles communiquent bien (clauses uses).
    J'ai tenté de passer par des variables intermédiaires déclarées dans la section Public pour piloter mon bazars, mais sans succès (puis ça fait trop bricolage).

    La fiche est bien créée car elle apparaît et les variables sont bien reconnue sinon le compilateur aurait râlé (je suis en XE2 et il râle souvent avec moi :p).

    Naga

  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
    Citation Envoyé par Naga2 Voir le message
    Salut Paul,

    Si j'ai bien compris l'exemple que tu as posté sur l'autre sujet, tu met en place une méthode qui permet d'afficher une fenêtre tant qu'un certains traitement (réalisé par le programme lui-même) est en cours (lister des fichiers avec une tempo).

    Mon cas est un peu différent :
    En faite, mon outils doit exécuter un script (.CMD) qui va lancer certains traitements plus ou moins longs en fonction de la réactivité des machines. La seule astuce que j'ai trouvée pour éviter de planter l'ensemble est de mettre une temporisation dans mon programme pour laisser au script le temps de faire son taffe avant de continuer.
    Donc, mon programme n'a aucune visibilité sur l'évolution de ce traitement.

    Ceci dit, mon souci n'est pas à ce niveau mais plutôt sur l'utilisation de ma ProgressBar :
    J'ai donc deux ensembles Form + Unités associées.
    Le code principale est dans l'unité principale et la ProgressBar dans l'autre unité (ou plutôt dans sa form associée).
    J'ai fais une déclaration mutuelle des deux unités pour être sûr qu'elles communiquent bien (clauses uses).
    J'ai tenté de passer par des variables intermédiaires déclarées dans la section Public pour piloter mon bazars, mais sans succès (puis ça fait trop bricolage).

    La fiche est bien créée car elle apparaît et les variables sont bien reconnue sinon le compilateur aurait râlé (je suis en XE2 et il râle souvent avec moi :p).

    Naga
    les variables sont connues mais ce n'est pas pour cela que leur contenu est valide, d'où l'erreur

    par défaut, Delphi ajoute les fiches créées dans le fichier DPR, elles sont donc automatiquement créées et les variables affectées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    begin
      Application.Initialize;
      Application.MainFormOnTaskbar := True;
      Application.CreateForm(TForm1, Form1);
      Application.CreateForm(TForm2, Form2);
      Application.Run;
    end.
    du coup, un Uses de Unit2 dans Unit1 permet d'accéder à Form2.ProgressBar sans problème....à l'exception du code de TForm1.OnCreate car celui-ci se déclenche avant la création de Form2 !

    si Form2 n'est pas créée, on a par contre une erreur d'exception car la variable Form2 existe bien mais elle est vide.

    si les deux fiches sont bien présentent dans le DPR et que le code n'est pas exécuté dans OnCreate...je ne vois pas d'explication, il faudra nous donner plus d'information sur ton code.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    du coup, un Uses de Unit2 dans Unit1 permet d'accéder à Form2.ProgressBar sans problème....à l'exception du code de TForm1.OnCreate car celui-ci se déclenche avant la création de Form2 !

    si Form2 n'est pas créée, on a par contre une erreur d'exception car la variable Form2 existe bien mais elle est vide.

    si les deux fiches sont bien présentent dans le DPR et que le code n'est pas exécuté dans OnCreate...je ne vois pas d'explication, il faudra nous donner plus d'information sur ton code.
    Effectivement l'erreur semble être liée au fait que le souhaite lancer le traitement automatiquement au chargement de l'application (les deux unités sont bien déclarées dans le fichier .DPR).

    Mais, après quelques essais, je ne suis donc pas en mesure de lancer ce traitement au chargement car j'ai l'impression que le système traite le code dans cet ordre séquentiel :
    1- Création de la fiche principale,
    2- Exécution de tous les événements qui sont associées à la fiche principale,
    3- Création de la fiche secondaire,
    4- Exécution de tous les événements qui sont associées à la fiche secondaire.

    Ce qui m’ennuie beaucoup si je souhaite lancer le traitement dans l'événement OnActivate de la fiche principale par exemple.
    J'ai testé aussi avec l'événement OnShow sans plus de succès.
    Donc, ai-je la possibilité de lancer le traitement automatiquement au chargement de l'application tout en ayant bien la ProgressBar dans la fiche secondaire ?

    Naga

  6. #6
    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
    il suffit de supprimer la création de la seconde fiche dans le DPR (création qui n'a probablement pas lieu d'être) et de l'ajouter juste avant de faire appel à la progressbar

    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
     
    uses
      Unit2;
     
    procedure TForm1Create(Sender: TObject);
    var
      Form2: TForm2;
    begin
      Form2 := TForm2.Create(Self);
      try
        Form2.Show;
        while ... do
        begin
          Form2.ProgressBar.Position := i;
          ...
        end;
      finally
       Form2.Free;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Maintenance nucléaire
    Inscrit en
    Janvier 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Maintenance nucléaire
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 107
    Points : 36
    Points
    36
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    il suffit de supprimer la création de la seconde fiche dans le DPR (création qui n'a probablement pas lieu d'être) et de l'ajouter juste avant de faire appel à la progressbar

    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
     
    uses
      Unit2;
     
    procedure TForm1Create(Sender: TObject);
    var
      Form2: TForm2;
    begin
      Form2 := TForm2.Create(Self);
      try
        Form2.Show;
        while ... do
        begin
          Form2.ProgressBar.Position := i;
          ...
        end;
      finally
       Form2.Free;
      end;
    end;
    Super, je n'avais pas pensé au try ... finally.

    Impec ça fonctionne bien, merci Paul pour ton aide. J'ai appris quelques petits trucs.

    Naga

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/03/2010, 15h43
  2. [Batch] Créer une chaine à partir d'une variable et d'une autre chaine
    Par mlle lain dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/11/2009, 16h26
  3. Saisir une image à partir d'une photo ou d'une vidéo
    Par lohengrin56 dans le forum Flash/Flex
    Réponses: 0
    Dernier message: 07/07/2009, 16h17
  4. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  5. Réponses: 5
    Dernier message: 22/05/2008, 14h42

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