2014-10-01 18 views
0

我想通過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。 請幫我知道問題出在哪裏? 我真的需要你的幫助,因爲這個問題關係到我的碩士論文

回答

0

在SETLIST方法嘗試,而不是分配一個指針變量到另一個

FList->CommaText = AList->CommaText; 

。這複製的內容,應該工作。這樣你也可以使用抽象的TStrings類而不是TStringList。但在構造函數中,您必須將其初始化爲FList=(TStrings*)(new TStringList);

相關問題