窗体控件保存(200分)

  • 主题发起人 xtdragon
  • 开始时间
X

xtdragon

Unregistered / Unconfirmed
GUEST, unregistred user!
我有如下代码:
function ComponentToString(Component: TComponent): string;

var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;

end;
finally
BinStream.Free
end;
end;

function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);

finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;


前一段代码将窗体上的控件转换成字符串,也就是DFM文件,后一段代码将DFM文件转换成
窗体,但是我不知道怎样使用第二段代码,肯请各位能给予解答。
 
试试Assign
 
其实你存时可以只存控件类型和大小位置就可以了,然后读文件时根据文件 中的内容
再创建相应的控件就好了。应该就很简单了。懂了吧。
 
如你用DELPHI5的话, right click the form,
then select "view as text", 你就可看到相应的定义了.
 
事实上:BinStream.ReadComponent(nil);这句是要不得的,不能是nil,必须是实例。
我提供一段代码,关于readcomponent,但实际应用还要改变,你的另一个题的答案也在这里:
比如说你有一个form1,但你要生成一个一模一样的form2:
function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
tempform:TForm1;
i:integer;
begin
tempform:=TForm1.create(nil);
for i=0 to tempform.componentcount-1 do
tempform.Components.Free;
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result :=BinStream.ReadComponent(tempform);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
t:String;
c:TComponent;
ct:TClass;
Form2:TForm1;
begin
t:=ComponentToString(TComponent(form1));
Form2:=TForm1(StringToComponent(t));
Form2.show;
end;

另如果你要是想在以后的应用中用到,那么你就不能用componenttostring,
最好用到savetofile,loadtofile之类的函数。
比如说
precudre ComponentToFile(Component: TComponent,filename:String);
var
BinStream:TMemoryStream;
begin
try
BinStream := TMemoryStream.Create;
BinStream.WriteComponent(Component);
BinStream.SaveToFile(filename);
finally
BinStream.Free
end;
end;

function FileToComponent(Value: String;var Com:TComponent);
var
StrStream:TStringStream;
BinStream: TMemoryStream;
tempcom:TComponent;//这里必须定义与你应用
i:integer;
tc:TClass;
begin
tc:=tc.classtype;
tempform:=tc.create(nil);
for i=0 to tempcom.componentcount-1 do
tempform.Components.Free;
BinStream := TMemoryStream.Create;
try
binStream.loadfrom(value);
BinStream.Seek(0, soFromBeginning);
com :=BinStream.ReadComponent(tempform);
finally
BinStream.Free;
end;
end;


 
多人接受答案了。
 
顶部