如何通过ReadComponent方法从TStringStream加载对象作为属性

时间:2014-10-01 14:43:38

标签: c++

我希望使用WriteComponent&amp ;;传递一个具有所有属性和拥有对象的对象,从客户端到服务器端。 ReadComponent方法。我尝试了很多次并在网站和C ++构建器帮助中阅读了很多关于它的东西,最后我发现在读取流TReader对象的内容时,数据必须在类的已发布部分中__property。无法正确恢复类数据。我将数据设置为__property,如下面的代码所示,对于像int或AnsiString或其他类型的原始数据这样的数据类型它是成功的。但我的问题在这里。类的对象如TStringList没有正确加载,程序上升异常。我的代码在这里:

客户方:

void __fastcall TMainForm::ButtonClick(TObject *Sender)
{
MySecClass *BClass=new MySecClass(this);
BClass->List->Add(Edit->Text);
BClass->Size="Huge";
BClass->Length=100;
AnsiString Str;
TStringStream *SStr=new TStringStream(Str);
SStr->WriteComponent(BClass);
SStr->Seek(0,soFromBeginning);
IdTCPClient->Connect();
IdTCPClient->WriteInteger(SStr->DataString.Length());
IdTCPClient->Write(SStr->DataString);
IdTCPClient->Disconnect();
} 

服务器端:

void __fastcall TMainForm::IdTCPServerExecute(TIdPeerThread *AThread)
{
int length=AThread->Connection->ReadInteger();
AnsiString Message=AThread->Connection->ReadString(length);
AThread->Connection->Disconnect();
TStringStream *SStr=new TStringStream(Message);
TComponent *MyObject=NULL;
MyObject=SStr->ReadComponent(NULL);
ListBox->Items->Add(((MySecClass*)MyObject)->List->Strings[0]);
}

MyClass单位:

class MyClass : public TComponent{

__published:
__property AnsiString Size ={read=GetSize , write=SetSize ,stored=true};
__property int Length={read=GetLength ,write=SetLength ,stored=true};

private:
AnsiString FSize;
int FLength;

public:
__fastcall MyClass(TComponent* AOwner);
AnsiString __fastcall GetSize();
int __fastcall GetLength();
void __fastcall SetSize(AnsiString ASize);
void __fastcall SetLength(int ALength);

};

class MySecClass : public MyClass{

__published:
__property TStringList* List={read=FList ,write=SetList ,stored=true};

private:
TStringList* FList;

public:
__fastcall MySecClass(TComponent* AOwner);
void __fastcall SetList(TStringList* AList);
};

__fastcall MyClass::MyClass(TComponent* AOwner):TComponent(AOwner){
FSize="Empty";
FLength=0;
}

AnsiString __fastcall MyClass::GetSize(){
return FSize;
}

int __fastcall MyClass::GetLength(){
return FLength;
}

void __fastcall MyClass::SetSize(AnsiString ASize){
FSize=ASize;
}

void __fastcall MyClass::SetLength(int ALength){
FLength=ALength;
}

__fastcall MySecClass::MySecClass(TComponent* AOwner):MyClass(AOwner){
FList=new TStringList;
}

void __fastcall MySecClass::SetList(TStringList* AList){
FList=AList;
}

请记住,我在项目中注册了MyClass和MySecClass类。 请帮我知道问题出在哪里??? 我真的需要你的帮助,因为这个问题与我的MS论文有关

1 个答案:

答案 0 :(得分:0)

在SetList方法中尝试

FList->CommaText = AList->CommaText;

而不是将一个指针变量分配给另一个。这将复制内容,然后应该工作。这样您也可以使用抽象的TStrings类而不是TStringList。但是在构造函数中,您必须像FList=(TStrings*)(new TStringList);一样初始化它。