Einzelnen Beitrag anzeigen

Benutzerbild von Der Jan
Der Jan

Registriert seit: 22. Dez 2005
289 Beiträge
 
Delphi XE7 Ultimate
 
#8

Re: Verwenden von property in C++ Builder

  Alt 20. Jan 2006, 23:37
Soooo. Hab zwar nicht genau das gefunden, was ich posten wollte, aber etwas ähnliches. Erstmal der Source. Ist schon paar Jahre alt, nicht wirklich optimal, sollte aber das Prinzip zeigen.
Die Liste selbst ist allerdings nicht von TObjectList abgeleitet, wie man sieht. Hab noch paar Kommentare eingefügt...

Code:
// in .h

//Die Listenelemente sind von dieser Klasse
class TServer          
{
public:
    AnsiString asURL;
    AnsiString asLocation;

    __fastcall TServer();
    __fastcall TServer(AnsiString asDesc);
};
//---------------------------------------------------------------------------
class TServerList          //die Listeklasse als solches...
{
private:
    TList *pList;
protected:
//darf man: der Funktionsrumpf direkt in der Definition, da es keine wirkliche Trennung
//zwischen interface und implementation gibt, wie in Pascal
    int __fastcall GetCount() {return pList->Count;};
public:
    __fastcall TServerList();     //Konstruktor
    __fastcall ~TServerList();    //Destruktor

    TServer *GetItem(int iIndex);

//Die Methoden entsprechen denen der TList Klasee der VCL, man könnte noch mehr
//implemtieren, wie Exchange oder so, hab ich aber nicht gebraucht.
    int  __fastcall Add(TServer *pSite);
    void __fastcall Delete(int iIndex);
    void __fastcall Clear();
    int  __fastcall IndexOf(AnsiString asSearch);
    int  __fastcall Load();
    int  __fastcall Save();

    __property int Count = {read = GetCount};
    __property TServer *Item[int iIndex] = {read = GetItem};
};
Code:
//in .cpp
__fastcall TServer::TServer()
{
    asURL = "";
    asLocation = "";
}
//---------------------------------------------------------------------------
__fastcall TServer::TServer(AnsiString asDesc)
{
    int iPos = asDesc.Pos(";");
    if(iPos == 0)
    {
      asURL = asDesc;
      asLocation = "???";
    }
    else
    {
      asURL = asDesc.SubString(1, iPos - 1);
      asLocation = asDesc.SubString(iPos + 1, asDesc.Length() - 1);
    }
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TServerList::TServerList()
{
    pList = new TList;
}
//---------------------------------------------------------------------------
__fastcall TServerList::~TServerList()
{
    if(pList)
    {
      for(int i = pList->Count - 1; i >= 0 ; i--)
      {
//Ein Type-casting. TList->Items gibt TObject* (also ein Zeiger auf TObject) zurück,
//wir brauchen für die Freigabe aber TServer*
        delete (TServer *)(pList->Items[i]);
        pList->Delete(i);
      }
      delete pList;
      pList = NULL;
    }
}
//---------------------------------------------------------------------------
int __fastcall TServerList::Add(TServer *pSite)
{
    return pList->Add(pSite);
}
//---------------------------------------------------------------------------
void __fastcall TServerList::Delete(int iIndex)
{
    if(iIndex >= pList->Count)
      return;
    delete (TServer *)(pList->Items[iIndex]);
    pList->Delete(iIndex);
}
//---------------------------------------------------------------------------
void __fastcall TServerList::Clear()
{
    //Liste von hinten löschen
    for(int i = pList->Count - 1; i >= 0; i--)
    {
      delete (TServer *)(pList->Items[i]);
      pList->Delete(i);
    }
}
//---------------------------------------------------------------------------
int __fastcall TServerList::IndexOf(AnsiString asSearch)
{
    for(int i = 0; i < pList->Count; i++)
      if(asSearch == GetItem(i)->asURL)
        return i;
    return -1;
}
//---------------------------------------------------------------------------
TServer * TServerList::GetItem(int iIndex)
{
    return (TServer *)(pList->Items[iIndex]);
}
//---------------------------------------------------------------------------

//Load und Save lass ich weg, tut hier nix zur Sache
Ich hoffe es nützt was. Wenn nicht, frag ruhig. Wenns nötig auch per PM

Wenn du nicht gerade 100000 Listenelemente hast, kannst du die Klasse nutzen, für richtig große Listen/Vektoren etc. sollte man die VCL-Klassen beseite lassen.
Gruß, Jan
  Mit Zitat antworten Zitat