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 :

Déclaration d'un composant dynamique


Sujet :

C++Builder

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Par défaut Déclaration d'un composant dynamique
    Bonjour tout le monde, j'ai essayé de déclararer un composant dynamique en définissant la taille du composant avec une variable mais borland m'indique une erreur....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int nbimage=10;
    TImage *Image[nbimage];
    Code erreur : [C++ Erreur] Unit1.cpp(24): E2313 Expression constante nécessaire

    Merci

  2. #2
    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
    Comme le message d'erreur l'indique, tu ne peut pas initialiser la taille d'un tableau à partir d'une variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TImage *Image[10]; // C'est OK
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int nbimage=10;
    TImage *Image[nbimage]; //Erreur de compilation

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Par défaut
    Je suis obliger de faire comme sa car c'est une variable que je recupère de l'utilisateur quand il rentre dans le programme, sinon si possible d'avoir une autre solution

  4. #4
    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
    De mon coté, lorsque je dois gérer une liste d'objet dont le nombre n'est pas déterminé à la conception, j'utilise TObjectList. Il s'utilise comme TStringList, avec des objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      TObjectList *objList = new TObjectList() ;
     
      objList->Add( Image1 ) ;
      objList->Add( Image2 ) ;
      objList->Add( Image3 ) ;
      //[...]
      for( int i=0; i< objList->Count; i++ )
      {
         ShowMessage( ((TImage*) objList->Items[i] )->Name ) ; //Au moment de récupérer l'objet, il faut indiquer de quel objet il s'agit, par exemble pour des images (TImage*)
      }
      //[...]
      delete objList ;

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Par défaut
    Oui je suis d'accord mais ton image tu sais combien tu en veu, moi je sais pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      objList->Add( Image1 ) ;
      objList->Add( Image2 ) ;
      objList->Add( Image3 ) ;
     
    //Moi je ne sais pas combien j'ai est

  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
    Ce n'est pas grave, tu peut faire une boucle pour les créer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TImage* image = NULL;
    for(int i=0;i<nbImage;i++)
    {
      image = new TImage(NULL);
      objList->Add(image);
    }

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Par défaut
    Je suis desoler mais je commence a être perdu voici mon code source

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    nbImage=10;
     
    //C'est issi que sa ne fonctionne pas d'ou l'erreur
    TImage *Image[nbImage];
     
    chemin="C:\\Documents and Settings\\09.12.08\\Bureau\\photos\\";
    extension=".bmp";
    Extensions->Add(extension);
     
    //Cette fonction me permet de recuperer chaque chemin de la photo
    Search(chemin, Extensions, ListBox1->Items);
     
     
     for(int m=0;m<lignetab;m++)
     {
     
     
       Image[m]= new TImage(this);
     
       Image[m]->Parent = Form1;
     
       Image[m]->Name="Image"+m;
       Image[m]->Left = 100*m;
       Image[m]->Proportional=true;
     
            if(ExtractFileExt(tab[m]).LowerCase() == ".bmp")
            {
                    Image[m]->Picture->LoadFromFile(tab[m]);
            }
     
     }
    Et si c'est possible de me montrer comment je peut faire avec sa

  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
    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
     
     TObjectList *imgList = new TObjectList( true ) ; //true signifie que TObjectList gère lui même la libération des objets
     TImage *image;
     for(int m=0;m<lignetab;m++)
     {
       image = new TImage(this);
       image->Parent = Form1;
       image->Name="Image"+m;
       image->Left = 100*m;
       image->Proportional=true;
       if(ExtractFileExt(tab[m]).LowerCase() == ".bmp")
       {
             image->Picture->LoadFromFile(tab[m]);
       }
       imgList->Add( image );
     }
    Ensuite imaginons que tu souhaite afficher la n-ième image sur ta fiche
    (en admettant que sur ta fiche tu est un composant TImage appellé Image1):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image1 = (TImage*) imgList->Items[n]
    et ne pas oublier lorsque tu n'a plus besoin de ta liste d'image :


  9. #9
    Membre éclairé
    Inscrit en
    Avril 2008
    Messages
    279
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 279
    Par défaut
    Une question ton code fonctionne, mais ma variable ou je dois definir le nombre d'image je le met ou, car je dois la mettre imperativement

  10. #10
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 407
    Par défaut
    Salut !

    En restant au plus près de sa proposition initiale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int NbImages = 10;
    // On crée un tableau de pointeurs vers TImage
    TImage **Images = new TImage*[NbImages];
    //On crée les images
    for(int j = 0; j < NbImages; j++) 
        {
        Images[j] = new TImage(this); // << à voir pour this
        Images[j]->Parent = ...
        }
    ...
     
    //A terme on doit détruire le tableau
    delete [] Images;
    En s'écartant de sa propostion initiale :

    Un TComponent suffirait amplement pour superviser une liste d'objets qui lui appartiennent, en l'occurence ici, des images !
    L'avantage est qu'on n'a pas besoin de se soucier de gérer la liste ou le tableau !
    Au moment de se détruire, ce superviseur détruira tous les objets dont il est propriétaire !

    Un exemple vite fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class jImages : public TComponent
    {
    protected :
        TImage* __fastcall GetImage(int Index);
    public :
        __fastcall jImages(TComponent *AOwner);
        __fastcall jImages(TWinControl *AOwner, int NbImages);
        __fastcall ~jImages();
        void __fastcall LoadFromFile(AnsiString Filename, int Index);
     
    __property TImage* Image[int Index]={read=GetImage};
    };
    Les méthodes :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    //Constructeur par défaut
     
    __fastcall jImages::jImages(TComponent *AOwner)
        : TComponent(AOwner)
    {
    }
     
    //Constructeur dédié 
     
    __fastcall jImages::jImages(TWinControl *AOwner, int NbImages)
        : TComponent(AOwner)
    {
    TImage *Image;
    for(int j = 0; j < NbImages; j++)
        {
        Image = new TImage(this);
        Image->Parent = AOwner;
        //Image->SetBounds ...
        }
    }
     
    //Destructeur
     
    __fastcall jImages::~jImages()
    {
    }
     
    //Méthode pour charger une image dans l'une d'elles
     
    void __fastcall jImages::LoadFromFile(AnsiString Filename, int Index)
    {
    if(FileExists(Filename) && (Image[Index] != NULL))
        {
        Image[Index]->Picture->LoadFromFile(Filename);
        }
    }
     
    //Gère l'accès aux images sous forme de tableau : propriété Image[int Index]
     
    TImage* __fastcall jImages::GetImage(int Index)
    {
    if((Index >=0) && (Index < ComponentCount)) return (TImage*)Components[Index];
    return NULL;
    }
    Pour l'usage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    jImages *Images;
     
    Images = new jImages(this, 10);
     
    TImage *Image = Images->Image[N];
     
    Images->LoadFromFile("bla bla", 0);
    On peut bien sûr y rajouter tout ce que l'on veut : à chacun sa propre vision du développement !

    A plus !

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

Discussions similaires

  1. [Delphi 7] Déclaration d'un composant dynamique
    Par alainvh dans le forum Débuter
    Réponses: 5
    Dernier message: 06/02/2010, 09h25
  2. créer composant dynamiquement avec sa déclaration
    Par Mihalis dans le forum Delphi
    Réponses: 27
    Dernier message: 13/06/2007, 09h14
  3. [FLASH MX] Nom de composant dynamique
    Par bobgeldof7 dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2004, 23h07
  4. [THandle][DLL] Composant dynamique et THandle
    Par el_diablos dans le forum Langage
    Réponses: 10
    Dernier message: 01/07/2004, 15h01
  5. [JTabbedPane] Accès à des composants dynamiques
    Par SamRay1024 dans le forum Composants
    Réponses: 8
    Dernier message: 26/05/2004, 13h04

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