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

C++Builder Discussion :

problème de mise à jour de TEdit en thread


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut problème de mise à jour de TEdit en thread
    Bonjour à tous,

    Sous BCB C++, soit une TForm "principale" appelée Form1 qui contient un bouton. Ce bouton sert à ouvrir une seconde TForm appelée Form2.

    Je voudrais savoir (c'est très certainement une question basique) qu'elle est la différence entre réaliser l'ouverture de cette Form2 avec :

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TForm2 *F = new TForm2(this)
    F -> Show();
    2) ou tout simplement :

    Je demande cela car il m'est apparu un problème d'affichage de TEdit dans la Form2. En effet, si la Form2 contient un TEdit appelé Edit1, dans le cas où Form2 est ouverte par 1), le code :

    a)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form2->Edit1->Text = "essai";
    n'affiche rien (que le code soit placé à la création de Form2 ou bien suite à clic sur un bouton de Form2) tandis que :

    b)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Edit1->Text = "essai";
    Or dans le cas où Form2 et ouverte par 2), le code a) fonctionne.

    C'est peut-être insignifiant comme cela mais si l'on cherche à faire du thread sur Form2 et que Edit1 doit être mis à jour régulièrement (par ex. état d'avancement du sous-code de Form2 contenu dans son thread), eh bien on est coincé (rien ne s'affiche) si l'on utilise l'ouverture suivant 1) .

    Merci de m'indiquer également la différence entre this et NULL pour 1). Je pense qu'il s'agit de gérer la dépendance de Form2 vis-à-vis de Form1 mais je n'en suis pas sûr.


    Je vous remercie à l'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    J'ajoute également que le fait d'activer Form2 par 2) fait perdre - apparemment - les propriétés du thread comme la gestion de l'événement OnTerminate qui n'est plus pris en compte.

  3. #3
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    L'explication est simple en effet, Form2 et F sont toute les deux des instance de ta classe TForm2 qui en l'occurrence est une fenêtre.
    Borland crée par défaut une instance de chaque fenêtre du projet au démarrage de ton appli, ce qui fait que tu n'est pas obligé de faire les new pour afficher tes Form, c'est ton objet Form2.
    Si tu créé une nouvelle instance de ta Form, en mettant le code a, il va aller mettre à jour l'instance Form2 puisque tu lui prescise Form2, mais toi tu affiche l'instance F qui n'est donc pas mise à jour.
    Par contre si tu met le code b, comme tu ne lui precise pas quel instance tu veut mettre à jour, il va mettre à jour l'instance courante de ta classe TForm2.

    J'espère que ce n'ai pas trop brouillon comme explication

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    Merci pour votre réponse; c'est ce que je pensais. Y a t'il un moyen préférentiel entre 1) ou 2) pour "bien développer", du moins "développer proprement" ?

  5. #5
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Ça dépend de chaque développeur.

    De mon coté, j'aime bien gérer moi même ce que font mes programmes et donc je creer (new) et detruit (delete) moi-même toutes mes TForm (sauf la forme principale).

    Donc dans Projet->Options onglet Fiche il n'y a que ma Form principale dans la liste de gauche, et toutes mes autres Form sont dans la liste de droite (Fiches disponibles).

    C'est la façon dont je développe, c'est la solution que je trouve la plus propre, mais ça reste un avis personnel.

  6. #6
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Personnellement je ne m'embête pas et je garde la 1, mais au niveau c++, il vaut mieux utiliser la 2, pour contrôler correctement ça mémoire par exemple, ce que je fait au niveau professionnelle.
    Pour désactiver la création automatique des Form, tu va dans les opions du projets, dans l'onglet Fiches, tu retire toute les fiches de la liste créé automatiquement sauf la principale, celle que Borland dois lancé au démarrage de l'appli.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    Merci pour ces réponses. Pour utiliser delete, où est ce qu'il faut le placer ? Si la Form2 s'ouvre par clic sur un bouton de Form1, je pense que l'on peut le mettre dans l'évènement OnExit du bouton. Mais qu'en est il à pour l'ouverture sur clic d'un élément (déroulant) d'une barre d'outil ?

  8. #8
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    Nan, pas dans le OnExit! Si tu regarde dans l'aide (F1) du OnExit : "Se produit quand la focalisation passe du contrôle à un autre contrôle"

    Pour détruire une fenêtre tu peux par exemple faire simplement dans ton Bouton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
      TForm2 *f = new TForm2(this) ;
      f->ShowModal() ; // pour montrer la fenetre2 en mode Modal
      delete f;
    }

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    OK Merci. Y a t'il équivalence entre delete et Destroy() ?

  10. #10
    Membre Expert
    Avatar de sat83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2004
    Messages
    1 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 040
    Par défaut
    En c++ builder, il vaut mieux toujours utiliser le mot clé delete pour libérer un objet créer avec new.

    Si mes souvenirs sont bons, delete appelle Free() qui lui même appelle Destroy() .

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    Dernière question : si l'on crée un pointeur f sur la Form2 dans Form1 selon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TForm2 *f = new TForm2(this) ;
    f->ShowModal() ; 
    delete f;
    comment lier ce pointeur avec l'exécution d'un thread en particulier avec la commande synchronize(); le pointeur f étant défini dans Form1 mais pas dans Form2.

    En bref, comment exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    X->Edit1->Text = "essai";
    où Edit1 est un membre de Form2 appelé depuis un thread. X = f ou ... ???

    Merci d'avance

  12. #12
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Il faut que tu passe ton pointeur de Form à ton Thread qui va le stocké dans une variable de type TForm2 * et tu n'aura plus qu'a remplacer ton X par le nom de ta variable.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    On fait ça comment ?? Je pensais faire dans un fichier variable globale (avec extern) et local mais il y a redondance des déclarations et problème à la liaison...

  14. #14
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Et bien dans ta classe Thread tu met dans le .h une variable de type TForm2 * par exemple appelé f, tu déclare une fonction qui à pour paramètre un TForm2 * et lorsque tu créé ta form2 dans le clique de ton bouton tu va appelé la fonction du thread en lui passant ta variable f.
    Dans ta fonction, tu affecte la valeur du paramètre à ta variable que tu as déclaré dans ton .h.
    Et à la place du X pour modifier ton edit tu remplace ton X par le nom de ta variable mis dans le .h.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    Excusez-moi mais ce n'est pas du tout clair. Qu'est-ce qu'il y a dans la fonction ? Où et quand doit elle être appelée ?

    Pour appeler le thread, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Thread = new Thread (false);
    à partir de la Form2 (munie de l'en-tête du ficher thread). Comment y "injecter" le pointeur de Form2 ?

    Merci d'avance.

  16. #16
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    Désolé, je croyé que ton Thread été géré depuis ta Form1.

    Dans le .h de ton Thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "Unit2.h"
    ...
    private:
      TForm2 * f;
    ...
    public:
      void setForm(TForm2 *);
    ...
    Dans le .cpp de ton Thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void TaClasseThread::setForm(TForm2 * paramForm)
    {
      f = paramForm;
    }
    Pour ton Edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f->Edit1->Text = "essai";
    A la création de ton thread dans la Form2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    monThread = new Thread (false);  //On ne nomme pas une variable du même nom qu'un type, donc ta variable Thread ne doit pas s'appeller Thread, je l'ai renommé en monThread
    monThread->setForm(this);

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2008
    Messages : 60
    Par défaut
    Cela fonctionne nickel ! Merci de m'avoir consacré un peu de votre temps.

  18. #18
    Expert confirmé

    Avatar de pottiez
    Homme Profil pro
    Développeur C++
    Inscrit en
    Novembre 2005
    Messages
    7 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2005
    Messages : 7 152
    Par défaut
    De rien

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

Discussions similaires

  1. [MySQL] Problème de mise à jour d'une table
    Par SnickeursMan dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 17/01/2006, 11h39
  2. Problème de mise à jour de données avec IBClientDataset
    Par Papino dans le forum Bases de données
    Réponses: 6
    Dernier message: 26/09/2005, 14h04
  3. [2000 Server] Problème de mise à jour windowsupdate !!
    Par rohstev dans le forum Autres Logiciels
    Réponses: 8
    Dernier message: 24/08/2005, 15h03
  4. Problème de mise à jour de base de données
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 11h38
  5. problème de mise à jour de BD
    Par tidiane dans le forum Bases de données
    Réponses: 5
    Dernier message: 04/03/2004, 15h32

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