我想通過WriteComponent & ReadComponent methods.I嘗試許多次,並且將其中的所有屬性和擁有對象從客戶端傳遞到服務器端。在網站和C++構建器幫助中閱讀了大量有關它的內容,最後我發現數據必須在類的已發佈部分中爲__property.otherwise在讀取流的內容時TReader Object無法正確恢復類數據。像下面的代碼一樣將數據設置爲__property,並且它對於像int或AnsiString或其他類型的原始數據這樣的數據類型是成功的。但是我的問題在於,像TStringList這樣的類的對象沒有正確加載,程序上升exception.my代碼在這裏:如何通過ReadComponent方法從TStringStream中加載對象作爲屬性
客戶端:
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。 請幫我知道問題出在哪裏? 我真的需要你的幫助,因爲這個問題關係到我的碩士論文