AnsiString CToString(TComponent *c){ //将组件转化为text TMemoryStream* ms; TStringStream* ss; ss = new TStringStream(" "); ms = new TMemoryStream; try { ms->WriteComponent(c); ms->Position = 0; ObjectBinaryToText(ms, ss); ss->Position = 0; return ss->DataString; } __finally { delete ms; delete ss; } return ss->DataString;}//---------------------------------------------------------------------------void StringToComponent1(TComponent* Component,const AnsiString& Value){ //将text转化为组件 TStringStream* ss; TMemoryStream* ms;
ss = new TStringStream(Value); try { ms = new TMemoryStream; try { ObjectTextToBinary(ss, ms); ms->Position = 0; ms->ReadComponent(Component);
//Component = ms->ReadComponent(NULL); 转化后组件没有parent,不推荐使用 } __finally { delete ms; } } __finally { delete ss; }}//---------------------------------------------------------------------------
使用范例:
1、保存组件到文本文件
TStringList *myList = new TStringList();
//将AForm上的每一个控件转化为字符串,并加入myList
for (int j = 0; j < AForm->ControlCount; j++)
myList->Add(CToString(AForm->Controls[j]));
myList->SaveToFile(fileName);
delete myList;
2、从保存文本中读取组件信息生成组件
TStringList *OpenList = new TStringList();
TStringList *ComList = new TStringList();
OpenList->LoadFromFile(OpenDialog1->FileName);
for (int i = 0; i < OpenList->Count; i++) { str_read = OpenList->Strings[i];
if (str_read != "") OpList->Add(OpenList->Strings[i]);
else { AnsiString str_opStart; str_opStart = ComList->Strings[0]; if (str_opStart.Pos("TStaticText")>0) { TStaticText *st = new TStaticText(AForm); StringToComponent1(st, ComList->Text); AForm->InsertControl(st); //如果不是TWinControl,替换为com->Parent = AForm并添加在 StringToComponent1之前; }
// else if (str_opStart.Pos("TLabel")>0)....eg 诸如此类
OpList->Clear(); }
}
delete ComList; delete OpenList;
