我想把MDICHILDFORM里的东西保存下来,并可以再次调入,有什么好的办法?

解决方案 »

  1.   

    是什么东东
    如是数据的就在close前保存当前的记录号
    下次打开后locate
      

  2.   

    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;
      

  3.   

    在ini文件中保存状态,打开窗口的时候读取ini文件
      

  4.   

    Tform.WriteState()
    Tform.ReadState()
      

  5.   

    不好意思,我还是第一次做这方面的项目,以前从来都没有做过,而且手边真的没有什么资料了今天到新华书店呆了半天,也没有找到这方面的书.
     
    我要保存的界面上的控件都是动态生成的,除了TMemo外别的都是我自制的, 都是继承自TGraphicControl,但是成为不同的类.能不能给我一个例子,我今天试了用文件流的方法.但是不行,用INI 可能写起来会很复杂的.TO:erp2   你的方法怎么实现能不能讲的具体一点?
      

  6.   

    Focus(老鱼)的方案应该可行,因为我们在Delphi设计的时候进行复制也是一样的,你可以复制到文本编辑器中,都是写文本。
    这中方式也避免了你说的手工保存到文本文件的麻烦
      

  7.   


    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继承的,我根据需要增加了一些东西
      

  8.   

    To: DelphiBoy2003我要保存子窗口里的所有东西,因为这个窗口是一张接线图,每个设备符号和线条都是以控件的形式存在,都是动态生成的,所以如果不把界面存下来的话,重新一运行就全没了,而且客户那里有35张图纸,等于有35个界面。
      

  9.   

    st.readcomponent(tt);
      components[i].assign(tt);//
    老大你搞错了
    我写错了一个字母
      

  10.   

    我今天试了一下另外一种方法,但是当我另外创建了一个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.
    我不知道是怎么回事,帮个忙,为什么会出错?
      

  11.   

    To:老鱼   我把st改为tt后,程序不再出错了,但是读不出来,我设了断点,发现PublicTotal总是为0,
    我不知道是怎么回事,是不是用tMemoryStream是,要一个一个存一个一个读出来的吗?有没有办法来解决这个问题?
      

  12.   

    虽然是个MM
    但还要不客气的说
    你的水平真的不行阿
    都提示到这种程度了
    你不能释放原来的component[i]
    这样当然会出错
    你逐个写入后 
    再逐个读取后ASSIGN就行了
      

  13.   

    Focus,thank you very much.
      

  14.   

    还有一点
    我注意到你的组件都是动态生成
    我看你的FREE好象是把现在的组件都去掉
    然后再从文件里读出显示到MDIFORM上?
    如果是这样我的方法可能也会有用(没试过)
    你把所有的组件free掉之后
    然后再把tt.parent:=MDIform
    这样要求你的界面上不能有容器控件
    如果有的话恢复会不一样的
    这是局限性 也没想出好办法解决
    因为它的components[i]是不可能保存入低度写的文件的
      

  15.   

    你去掉原来FORM上的COMPONENT之前应该把它和parent断开
    以免出错
    然后再用我的方法加入就行了
    我现在在上海离你也不远 HEHE
    左邻右舍的
    你原来一直搞设计 
    看来是比我混得好 我一直都是个编码工 连带着设计
      

  16.   

    不行
    缺东西编译通不过
    改的地方太多了
    还缺个TCABLE
    你就照我所说的修改程序就行了
      

  17.   

    其实这几个你只要把UNIT删了,而且调试的时候只要点同步电机的第一第二项就行.不过问题我今天已经解决了,谢谢你!