St:TMemoStream; tt:Tcomponent; for i:=0 to componentcount-1 do st.writecomponent(components[i]); St.savetofile('interface.bin'); st.loadfromfile('interface.bin'); for i:=0 to componentcount-1 do begin st.readcomponent(tt); components[i].assign(st);//这句不一定对,因为有可能转换类型不对 事先要判断的 end;
To: 老鱼今天早上试了一下,出错了:procedure TMainFrm.FileSaveItemClick(Sender: TObject); var st: TMemoryStream; i: Integer; begin if MainFrm.MDIChildren[0].ComponentCount <> 0 then PublicTotal := MainFrm.MDIChildren[0].ComponentCount; st := TMemoryStream.Create; try for i := 0 to PublicTotal -1 do st.WriteComponent(MainFrm.MDIChildren[0].Components[i]); st.savetofile('interface.bin'); finally st.Free; end; end;procedure TMainFrm.FileOpenItemClick(Sender: TObject); var st: TMemoryStream; tt: TComponent; i :Integer; begin if PublicTotal = 0 then Exit; st := TMemoryStream.Create; try st.LoadFromFile('interface.bin'); for i := 0 to PublicTotal -1 do begin st.ReadComponent(tt); MainFrm.MDIChildren[0].Components[i].Assign(st); end; finally st.Free; end; end;一运行这个语句MainFrm.MDIChildren[0].Components[i].Assign(st); 就出错:Incompatible types:TPersistent and TMemoryStream这是不是跟我的系统有关: 我要保存的是MDIChildForm里的东西,里面的控件都是动态生成的,而且一部分是TMemo,一部分是从TGraphicControl继承的,我根据需要增加了一些东西
To: DelphiBoy2003我要保存子窗口里的所有东西,因为这个窗口是一张接线图,每个设备符号和线条都是以控件的形式存在,都是动态生成的,所以如果不把界面存下来的话,重新一运行就全没了,而且客户那里有35张图纸,等于有35个界面。
我今天试了一下另外一种方法,但是当我另外创建了一个mdiform和一个mdichildform是一切正常,能保存界面,包括我自制的控件,但是当我放到系统上时,出现了错误:procedure TMainFrm.FileSaveItemClick(Sender: TObject); var FStream: TFileStream; begin if MainFrm.MDIChildCount = 0 then Exit; SaveDialog1.InitialDir := PresentList; //if SaveDialog1.Execute then // begin FStream := TFileStream.Create('D:\MySystem\Face\test.DFM',fmCreate); try FStream.WriteComponent(MainFrm.ActiveMDIChild); finally FStream.Free; end; //end; end; procedure TMainFrm.FileOpenItemClick(Sender: TObject); var FStream: TFileStream; i: Integer; begin if MainFrm.MDIChildCount = 0 then Exit; OpenDialog1.InitialDir := PresentList; // if OpenDialog1.Execute then // begin for i := MainFrm.MDIChildren[0].ComponentCount -1 downto 0 do MDIChildFrm.Components[i].Free; FStream := TFileStream.Create('D:\MySystem\Face\test.DFM',fmOpenWrite); try FStream.ReadComponent(MainFrm.ActiveMDIChild ); finally FStream.Free; end; //end; end;当运行到 FStream.ReadComponent(MainFrm.ActiveMDIChild );是,系统提示出错:Stream Read Error. 我不知道是怎么回事,帮个忙,为什么会出错?
如是数据的就在close前保存当前的记录号
下次打开后locate
tt:Tcomponent;
for i:=0 to componentcount-1 do
st.writecomponent(components[i]);
St.savetofile('interface.bin');
st.loadfromfile('interface.bin');
for i:=0 to componentcount-1 do
begin
st.readcomponent(tt);
components[i].assign(st);//这句不一定对,因为有可能转换类型不对 事先要判断的
end;
Tform.ReadState()
我要保存的界面上的控件都是动态生成的,除了TMemo外别的都是我自制的, 都是继承自TGraphicControl,但是成为不同的类.能不能给我一个例子,我今天试了用文件流的方法.但是不行,用INI 可能写起来会很复杂的.TO:erp2 你的方法怎么实现能不能讲的具体一点?
这中方式也避免了你说的手工保存到文本文件的麻烦
To: 老鱼今天早上试了一下,出错了:procedure TMainFrm.FileSaveItemClick(Sender: TObject);
var
st: TMemoryStream;
i: Integer;
begin
if MainFrm.MDIChildren[0].ComponentCount <> 0 then
PublicTotal := MainFrm.MDIChildren[0].ComponentCount;
st := TMemoryStream.Create;
try
for i := 0 to PublicTotal -1 do
st.WriteComponent(MainFrm.MDIChildren[0].Components[i]);
st.savetofile('interface.bin');
finally
st.Free;
end;
end;procedure TMainFrm.FileOpenItemClick(Sender: TObject);
var
st: TMemoryStream;
tt: TComponent;
i :Integer;
begin
if PublicTotal = 0 then Exit;
st := TMemoryStream.Create;
try
st.LoadFromFile('interface.bin');
for i := 0 to PublicTotal -1 do
begin
st.ReadComponent(tt);
MainFrm.MDIChildren[0].Components[i].Assign(st);
end;
finally
st.Free;
end;
end;一运行这个语句MainFrm.MDIChildren[0].Components[i].Assign(st);
就出错:Incompatible types:TPersistent and TMemoryStream这是不是跟我的系统有关:
我要保存的是MDIChildForm里的东西,里面的控件都是动态生成的,而且一部分是TMemo,一部分是从TGraphicControl继承的,我根据需要增加了一些东西
components[i].assign(tt);//
老大你搞错了
我写错了一个字母
var
FStream: TFileStream;
begin
if MainFrm.MDIChildCount = 0 then Exit;
SaveDialog1.InitialDir := PresentList;
//if SaveDialog1.Execute then
// begin
FStream := TFileStream.Create('D:\MySystem\Face\test.DFM',fmCreate);
try
FStream.WriteComponent(MainFrm.ActiveMDIChild);
finally
FStream.Free;
end;
//end;
end;
procedure TMainFrm.FileOpenItemClick(Sender: TObject);
var
FStream: TFileStream;
i: Integer;
begin
if MainFrm.MDIChildCount = 0 then Exit;
OpenDialog1.InitialDir := PresentList;
// if OpenDialog1.Execute then
// begin
for i := MainFrm.MDIChildren[0].ComponentCount -1 downto 0 do
MDIChildFrm.Components[i].Free;
FStream := TFileStream.Create('D:\MySystem\Face\test.DFM',fmOpenWrite);
try
FStream.ReadComponent(MainFrm.ActiveMDIChild );
finally
FStream.Free;
end;
//end;
end;当运行到 FStream.ReadComponent(MainFrm.ActiveMDIChild );是,系统提示出错:Stream Read Error.
我不知道是怎么回事,帮个忙,为什么会出错?
我不知道是怎么回事,是不是用tMemoryStream是,要一个一个存一个一个读出来的吗?有没有办法来解决这个问题?
但还要不客气的说
你的水平真的不行阿
都提示到这种程度了
你不能释放原来的component[i]
这样当然会出错
你逐个写入后
再逐个读取后ASSIGN就行了
我注意到你的组件都是动态生成
我看你的FREE好象是把现在的组件都去掉
然后再从文件里读出显示到MDIFORM上?
如果是这样我的方法可能也会有用(没试过)
你把所有的组件free掉之后
然后再把tt.parent:=MDIform
这样要求你的界面上不能有容器控件
如果有的话恢复会不一样的
这是局限性 也没想出好办法解决
因为它的components[i]是不可能保存入低度写的文件的
以免出错
然后再用我的方法加入就行了
我现在在上海离你也不远 HEHE
左邻右舍的
你原来一直搞设计
看来是比我混得好 我一直都是个编码工 连带着设计
缺东西编译通不过
改的地方太多了
还缺个TCABLE
你就照我所说的修改程序就行了