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 :

C++ builder prb d instanciation dynamique d une class


Sujet :

C++Builder

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 3
    Points : 4
    Points
    4
    Par défaut C++ builder prb d instanciation dynamique d une class
    Bonjour,

    j ai une class TMultipiste qui creee un lecteur audio multipiste en lui
    passant en parametre constructeur le chemin du dossier contenant les fichiers audio. En fonction du nb de fichiers audio dans ce dossier, la class creee n pistes audio. Le lecteur a des methodes play , stop etc.

    La classe fonctionne .

    Mon probleme est l instanciation de cette class dans form1

    #include Multipiste.h

    dans ma form principale "form1" , je veux pouvoir par exemple
    en cliquant Form1::Btn_creer , creer dynamiquement une instance MP(Nom_du_dossier_mp3_1)
    en lui passant le nom du dossier mp3
    PUIS acceder aux methodes de cette class (PLay, Stop etc ) et au Final
    en cliquant Form1::Btn_effacer, effacer cette instance .

    en cliqnant de nouveau sur Form1::Btn_creer , creer dynamiquement une nouvelle instance MP(Nom_du_dossier_mp3_2)
    avec en parametre un nouveau chemin de dossier mp3
    en cliquant Form1::Btn_effacer, effacer cette nouvelle instance . Etc ...

    et j ai besoin d AVOIR ACCES au pointeur de cette instance partout dans Form1 , tant que le pointeur n est pas effacé.

    afin de pouvoir faire par ex

    Form1::Btn_PLay() //
    {
    MP->Play_Multipiste();
    }
    Form1::Btn_Stop
    {
    Mp->Stop_Multipiste();
    }

    j ai beau me torturer l esprit, si le pointeur sur cette class est global, des que j efface la 1er instance
    (delete MP) , j efface le pointeur global et je ne peux plus reinstancier cette class par new.
    Si ce pointeur est dans Form1, je le mets au debut du code btn_creer, je l instancie avec new, mais je dois l effacer
    afin de pouvoir le reinstancier. Si je l efface a la fin de btn_creer,l objet multipiste N°1 est detruit et je ne peux pas
    faire Form1::Btn_PLay() MP->Play_Multipiste(); DONC c est la que ca bloque . Comment faire ... Merci

  2. #2
    Membre régulier
    Inscrit en
    Août 2010
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 123
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    pas sur de comprendre ton problème.
    Ne confonds tu pas pointeur et objet pointé...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TVehicule *pObj = new Megane();
    pObj->Roule();
    delete pObj;
     
    //---on peut faire pointer le pointeur pObj sur un nouveau véhicule
    pObj = new Formule1();
    pObj->Roule();
    Je suis peut être à coté de la plaque. Montre nous du code pour que l'on comprenne le problème.

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    C'est à se demander comment tu as pu modéliser ta classe sans savoir comment faire le reste !

    Il te suffit de déclarer un pointeur dans la classe de TForm1 (private ou public mais non published puisque ...).
    Ensuite de déclarer les méthodes qui vont agir (en public ou protected)... dans la classe de TForm1 !

    Si tu te donnes la possibilité de maintenir en mémoire différentes instances, tu peux utiliser une TList et de transtyper.
    Petit conseil : veille à dériver au moins de TComponent de sorte que chaque instance ait un propriétaire : c'est au cas où ton pointeur unique serait écrasé ! Form1 détruira tous les objets dont elle est propriétaire !

    Donc pour résumer (sous une forme synthétique) :

    Ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class MyMp : public TComponent
    //...
     
    __fastcall MyMp::MyMp(TComponent *AOwer)
        : TComponent(AOwner)
    {
    //...
    }
    Dans TForm1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public :
    MyMp *Mp;
     
    void __fastcall New();
    void __fastcall Play();
    void __fastcall Stop();
    Les méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void __fastcall TForm1::New()
    {
    if(Mp != NULL) delete Mp;
    Mp = new MyMp(this);
    }
     
    void __fastcall TForm1::Play()
    {
    if(Mp != NULL) Mp->Play();
    }
    Donc ... dans l'espace de TForm1 tu pourras faire tes New(), Play() ...

    A plus !

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/12/2013, 12h15
  2. Instanciation dynamique d'une classe
    Par larnin_ dans le forum Langage
    Réponses: 3
    Dernier message: 23/03/2013, 16h24
  3. Réponses: 9
    Dernier message: 15/02/2013, 23h27
  4. [ClassLoader] Chargement dynamique d'une classe -> problème avec packages !
    Par ymerej dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 31/05/2006, 21h37
  5. [RegEx] Trouver les appels statique et dynamique d'une class
    Par jeff_! dans le forum Langage
    Réponses: 8
    Dernier message: 07/04/2006, 16h31

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