Je me demande si cela ne viens pas de mon compilateur ?
Oui, et non, en même temps...
C'est une des joyeusetés de la VCL: les classes qui dérivent de TObject doivent être créées par un new, et on ne peut pas en créer un tableau !
C'est clair quand tu faisLe compilo gueule tout de suite.
Par contre il laisse passer
TList* listeDeListe=new TList[10];
et tu le découvres à l'exécution...
Par exemple:
1 2 3 4 5 6 7 8 9 10 11
| class TListX : public System::TObject
{
public:
__fastcall TListX(void) : System::TObject() { }
};
class TListY
{
public:
__fastcall TListY(void) { }
}; |
1 2 3 4 5
| void __fastcall TForm33::vBtn1Click(TObject *Sender)
{
TListY *testListeY=new TListY[10];
TListX *testListeX=new TListX[10];
} |
Pour TListY, ça passe.
Pour TListX, violation d'accès....
Pour terminer:
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
| void __fastcall TForm33::vBtn1Click(TObject *Sender)
{
TPers *pPers=new TPers[6];
pPers[0].Nom="Image1"; //liste 0 image 0 //colone ligne
pPers[1].Nom="Image2"; // liste 1 image 1
pPers[2].Nom="Image3"; // liste 2 image 2
pPers[3].Nom="Image4"; // liste 0 image 3
pPers[4].Nom="Image5"; // liste 1 image 5
pPers[5].Nom="Image6"; // liste 2 image 6
int NbListe=3;
//const int NombreListe= NbListe;
TList *TabList=new TList;
for (int i=0; i<NbListe; i++)
TabList->Add(new TList);
// initilsation de liste
TList* liste0 = (TList*)(TabList->Items[0]);
TList* liste1 = (TList*)(TabList->Items[1]);
TList* liste2 = (TList*)(TabList->Items[2]);
liste0->Add(&pPers[0]); //image1 liste0
liste1->Add(&pPers[1]); //image 2 liste1
liste2->Add(&pPers[2]); //image 3 liste 2
liste0->Add(&pPers[3]); //image 4 liste0
liste1->Add(&pPers[4]); //image 5 liste 1
liste2->Add(&pPers[5]); // image 6 liste 2
AfficheListe2(TabList);
} |
Allez, si tu veux vraiment utiliser des TList, y'a moyen de rendre la chose plus pratique:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class TPers
{
public:
AnsiString Nom;
TPers(AnsiString nom) : Nom(nom) {}
TPers(void) {}
};
template <class T> class TListT : public TList
{
public:
__property T* Items[int p_indice] = {read = LireItem, write=EcrireItem};
private:
T* __fastcall LireItem(int i) { return (T*)Get(i); }
void __fastcall EcrireItem(int i, T* p) { Put(i, p); }
}; |
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
| void __fastcall TForm33::vBtn2Click(TObject *Sender)
{
int NbListe=3;
TListT<TPers>* uneListe = new TListT<TPers>;
uneListe->Add(new TPers("Im1"));
uneListe->Add(new TPers("Im2"));
TPers* pers = uneListe->Items[0];
uneListe->Items[1]->Nom = "Im3";
for (int i=0; i<uneListe->Count; i++)
delete uneListe->Items[i];
delete uneListe;
TListT< TListT<TPers> > *TabList=new TListT< TListT<TPers> >;
for (int i=0; i<NbListe; i++)
TabList->Add(new TListT<TPers>);
TabList->Items[0]->Add(new TPers("Image1")); //image1 liste0
TabList->Items[1]->Add(new TPers("Image2")); //image 2 liste1
TabList->Items[2]->Add(new TPers("Image3")); //image 3 liste 2
TabList->Items[0]->Add(new TPers("Image4")); //image 4 liste0
TabList->Items[1]->Add(new TPers("Image5")); //image 5 liste 1
TabList->Items[2]->Add(new TPers("Image6")); // image 6 liste 2
TabList->Items[2]->Items[0]->Nom = "Toto";
AfficheListe2(TabList);
for (int i=0; i<TabList->Count; i++)
{
TListT<TPers>* listeP = TabList->Items[i];
for (int j=0; j<listeP->Count; j++)
delete listeP->Items[j];
delete listeP;
}
delete TabList;
} |
Partager