2016-06-09 9 views
1

Ich habe seit ca. 2 Wochen versucht, ein Objekt einer beliebigen Klasse von TComponent auf einem TMemoryStream Objekt mit seiner writecomponent Methode und rief dieses Objekt wieder mit readcomponent Methode abgeleitet zu schreiben. Obwohl ich dachte, dies sei eine leichte Aufgabe, kann ich es nicht richtig machen. Tatsächlich gibt es keinen Kompilierungsfehler, aber die Attribute des Objekts werden nicht korrekt geladen. Bitte hilf mir herauszufinden, was ich falsch gemacht habe. Hier ist mein Codeausschnitt., wie zu schreiben und lesen Komponenten TMemoryStrream

#include <vcl.h> 
#pragma hdrstop 

#include <tchar.h> 
#include <memory> 
#include <iostream> 
#include <conio.h> 

#pragma argsused 

using namespace std; 

class Woman : public TComponent 
{ 
    private: 
    int Age; 
    public: 
    UnicodeString Name; 
    Woman(TComponent* _Owner, int InAge, UnicodeString InName) 
     : TComponent(_Owner) 
    { 
     Age = InAge; 
     Name = InName; 
    } 
    int GetAge() 
    { 
     return Age; 
    } 
}; 

void RegisterClassesWithStreamingSystem(void) 
{ 

    #pragma startup RegisterClassesWithStreamingSystem 

    Classes::RegisterClass(__classid(Woman)); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Woman* FirstWoman = new Woman(NULL, 25, "Anjelina"); 
    UnicodeString as; 
    auto_ptr<TMemoryStream> MStr(new TMemoryStream); 
    auto_ptr<TStringStream> SStr(new TStringStream(as)); 

    MStr->WriteComponent(FirstWoman); 
    MStr->Seek(0, soFromBeginning); 
    ObjectBinaryToText(MStr.get(), SStr.get()); 
    SStr->Seek(0, soFromBeginning); 
    as = SStr->DataString; 

    auto_ptr<TMemoryStream> pms(new TMemoryStream); 
    auto_ptr<TStringStream> pss(new TStringStream(as)); 
    TComponent *pc; 

    ObjectTextToBinary(pss.get(), pms.get()); 
    pms->Seek(0, soFromBeginning); 

    pc = pms->ReadComponent(NULL); 


    Woman* AWoman; 
    AWoman = dynamic_cast<Woman*>(pc); 

    cout << AWoman->GetAge() << endl; 
    cout << AWoman->Name.c_str() << endl; 

    FirstWoman->Free(); 
    pc->Free(); 

    getch(); 
    return 0; 
} 

Antwort

0

Es funktioniert nicht, weil

  1. Ihre Woman Klasse __published Lese-/Schreibeigenschaften hat keine. Die Methoden WriteComponent() und ReadComponent() sind Teil des DFM-Streaming-Systems, und DFMs verlassen sich auf RTTI veröffentlichter Eigenschaften, um ihre Arbeit zu erledigen.

  2. Ein DFM kann keine Instanzen Ihrer Klasse erstellen, da es keinen kompatiblen Konstruktor gibt. Sie verwenden einen benutzerdefinierten Konstruktor, den DFM nicht aufrufen kann.

Sie benötigen eine Klasse entsprechend zu aktualisieren, zB:

class Woman : public TComponent 
{ 
private: 
    int fAge; 
    UnicodeString fName; 

public: 
    __fastcall Woman(TComponent* Owner) 
     : TComponent(Owner) 
    { 
    } 

    __fastcall Woman(TComponent* Owner, int InAge, const UnicodeString &InName) 
     : TComponent(Owner) 
    { 
     fAge = InAge; 
     fName = InName; 
    } 

__published: 
    __property int Age = {read=fAge, write=fAge}; 
    __property UnicodeString Name = {read=fName, write=fName}; 
}; 

Und dann können Sie dies tun:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    auto_ptr<Woman> FirstWoman(new Woman(NULL, 25, L"Anjelina")); 

    auto_ptr<TMemoryStream> MStr(new TMemoryStream); 
    auto_ptr<TStringStream> SStr(new TStringStream(L"")); 

    MStr->WriteComponent(FirstWoman.get()); 
    MStr->Position = 0; 
    ObjectBinaryToText(MStr.get(), SStr.get()); 
    SStr->Position = 0; 
    UnicodeString as = SStr->DataString; 

    auto_ptr<TStringStream> pss(new TStringStream(as)); 
    auto_ptr<TMemoryStream> pms(new TMemoryStream); 

    ObjectTextToBinary(pss.get(), pms.get()); 
    pms->Position = 0; 

    auto_ptr<TComponent> pc(pms->ReadComponent(NULL)); 
    Woman* AWoman = static_cast<Woman*>(pc.get()); 

    cout << AWoman->Age << endl; 
    cout << AWoman->Name.c_str() << endl; 

    FirstWoman.reset(); 
    pc.reset(); 

    getch(); 
    return 0; 
} 

Oder diese:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    auto_ptr<Woman> FirstWoman(new Woman(NULL, 25, L"Anjelina")); 

    auto_ptr<TMemoryStream> MStr(new TMemoryStream); 
    auto_ptr<TStringStream> SStr(new TStringStream(L"")); 

    MStr->WriteComponent(FirstWoman.get()); 
    MStr->Position = 0; 
    ObjectBinaryToText(MStr.get(), SStr.get()); 
    SStr->Position = 0; 
    UnicodeString as = SStr->DataString; 

    auto_ptr<TStringStream> pss(new TStringStream(as)); 
    auto_ptr<TMemoryStream> pms(new TMemoryStream); 

    ObjectTextToBinary(pss.get(), pms.get()); 
    pms->Position = 0; 

    auto_ptr<Woman> SecondWoman(new Woman(NULL)); 
    pms->ReadComponent(SecondWoman.get()); 

    cout << SecondWoman->Age << endl; 
    cout << SecondWoman->Name.c_str() << endl; 

    FirstWoman.reset(); 
    SecondWoman.reset(); 

    getch(); 
    return 0; 
} 
+0

Dank liebe Remy . Ich liebe dich Mann. Es funktionierte. du bist ein Genie –