我希望使用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论文有关
答案 0 :(得分:0)
在SetList方法中尝试
FList->CommaText = AList->CommaText;
而不是将一个指针变量分配给另一个。这将复制内容,然后应该工作。这样您也可以使用抽象的TStrings类而不是TStringList。但是在构造函数中,您必须像FList=(TStrings*)(new TStringList);
一样初始化它。