TCollection ableitung



  • Hi zusammen,
    ich benutze den C++ Builder Seattle.

    Ich möchte eine Klasse von TCollection ableiten (hab das bisher noch nicht gemacht) und scheitere momentan schon am Konstruktor.

    Bisher habe ich eine Klasse von TComponent abgeleitet:

    class TMyControlsHolder : public TComponent
    {
    private:
    	TMyControlList *pControlsList;  //<-- das ist die Klasse die von TCollection abgeleitet ist
    protected:
    public:
    	__fastcall TMyControlsHolder (TComponent *AOwner);
    	virtual __fastcall ~TMyControlsHolder (void);
    
    	__property TMyControlList * Controls = {read=pControlsList};
    };
    

    Die ControlList sieht im Header folgendermaßen aus:

    class TMyControlList : public TCollection
    {
    
    private:
    	TMyControlsHolder *pOwner;
    //TMyClientControl ist von TCollectionItem abgeleitet
    	void __fastcall SetItem(int Index, TMyClientControl* Value);
    	TMyClientControl* __fastcall Add(void);
    	TMyClientControl* __fastcall GetItem(int Index);
    protected:
    	DYNAMIC System::Classes::TPersistent* __fastcall GetOwner(void);
    public:
    	__fastcall TMyControlList (TMyControlsHolder * AMyControlsHolder);
    	virtual __fastcall ~TMyControlList (void);
    
    	TMyClientControl* __fastcall Insert(int AIndex);
    	__property TMyClientControl* Items[int Index] = {read=GetItem, write=SetItem};
    };
    

    Und so habe ich den Konstruktor definiert:

    __fastcall TMyControlList::TMyControlList (TMyControlsHolder *AMyControlsHolder)
    	: TCollection((TCollectionItemClass)AMyControlsHolder)
    {
    	pOwner = (TMyControlsHolder *)AMyControlsHolder;
    }
    //---------------------------------------------------------------------------
    

    Wenn ich das Programm dann laufen lassen, bekomme ich im Konstruktor von TMyControlList einen Stacküberlauf.
    Ich hab keine Ahnung wie ich TCollection anders verwenden soll, bzw. was ich hier jetzt falsch mache.
    Beispiele hab ich leider auch keine gefunden.
    Vielleicht kann mir ja einer helfen.

    Vielen Dank schonmal.



  • Hm, habe jetzt nochmal ein bißchen weiter gelesen und man muss wohl TCollection die Basisklasse der Listeneinträge mitgeben, damit TCollection bei Add() weiß, welche Klasse erstellt werden muss.
    Also müsste ich eigentlich TMyClientControl rübergeben.

    Die Frage ist jetzt nur wie schreib ich das jetzt korrekt im Konstruktor?



  • Ok, habs rausgefunden.
    TCollection erwartet eine TMetaClass, wie im vorigen Post schon beschrieben, um mit Add, Insert, etc. umgehen zu können.
    Dazu muss die verwendete MetaClass von TMyClientControl ermittelt und übergeben werden.

    __fastcall TMyControlList::TMyControlList (TMyControlsHolder *AMyControlsHolder)
        : TCollection(__classid(TMyClientControl))
    

Log in to reply