我在panel 上dock form1窗体.
panel docksite属性true;
Tform1= class(TForm),form1 的dragkind =dkdock,dragmode =dmautomatic;我在panel上dock了n个form1对象;想保存fom1在panel上的dock位置。在下次打开时读取位置显示。我保存了form1的top,left,right,bottom。
读取时
    form1.DockOrientation := doVertical;
    form1.HostDockSite := pnl_left; //pnl_left 为 panel对象
    form1.Dock(pnl_left,Arect); //Arect为保存的位置
    form1.Show;显示出来不是我保存之前的位置,不知道怎么处理,请求大侠给于帮助!

解决方案 »

  1.   

    用一个FileStream,WriteComponent、ReadComponent就能解决了
      

  2.   

    //save 
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i :integer;
      ms:   TMemoryStream;
    begin
      try
      ms:=TMemoryStream.Create;
      for i := 0 to  Panel_lf.ComponentCount-1 do
      begin
        //
        ms.WriteComponent(Panel_lf.Components[i]);
      end;
      ms.SaveToFile('d:\a.txt');
      finally
      ms.Free;
      end;end;//read method 怎么写啊?
      

  3.   

    给你写点代码吧,Unit2里声明TFrame2uses Unit2;{$R *.dfm}procedure TForm1.btnClearClick(Sender: TObject);
    var
      I: Integer;
    begin
      for I := Panel2.ControlCount - 1 downto 0 do
        Panel2.Controls[I].Free;
    end;procedure TForm1.btnLoadClick(Sender: TObject);
    begin
      if FileExists('Budded.txt') then
        with TFileStream.Create('Budded.txt', fmOpenRead) do
        try
          ReadComponent(Panel2);
        finally
          Free;
        end;
    end;procedure TForm1.btnNewClick(Sender: TObject);
    begin
      Panel2.DockSite := True;
      with TFrame2.Create(Panel2) do
      begin
        Name := 'Budded'+IntToStr(GetTickCount);
        ManualDock(Panel2);
      end;
    end;procedure TForm1.btnSaveClick(Sender: TObject);
    begin
      with TFileStream.Create('Budded.txt', fmCreate) do
      try
        WriteComponent(Panel2);
      finally
        Free;
      end;
    end;initialization
      RegisterClass(TFrame2); // 一定得先注册end.
      

  4.   

    呵呵,读的时候,就是把你保存的Component中有的FORM,用语句直接打开,并入坞到主FORM中去.
    你保存的时候,还得保存,该元件的大小,位置等必要信息.然后在语句入坞的时候,把这些信息在恢复到要入坞的元件上.格式如  一行为一个入坞的FORM
    如果不入坞的FORM也要打开,但不入坞的也要知道,那么再加上
    DockName=FORM1;Left=X,Y;Right=X,Y;IsDock=true;
    DockName=FORM2;Left=1,1;Right=16,30;IsDock=false;
    至此就完成了.       
      

  5.   

    DockManager 属性
    具体可参考《delphi7从入门到精通》第六章
      

  6.   

    不想自己写代码的话,可以用第三方控件...比如devpress
      

  7.   


    procedure TForm1.btnLoadClick(Sender: TObject);
    begin
      if FileExists('Budded.txt') then
        with TFileStream.Create('Budded.txt', fmOpenRead) do
        try
          ReadComponent(Panel2);
        finally
          Free;
        end;
    end;
    我在调这个的时候,没有显示出panel2 上的Tfram控件啊。
      

  8.   

    是这样的 panel2上要放置好几个Tfram对象
      

  9.   

    procedure TForm1.Button2Click(Sender: TObject);
    var
       aa :TComponent;
       vv :TFrame3;
       i :integer;
    begin
        if FileExists('c:/Budded.txt') then
        with TFileStream.Create('c:/Budded.txt', fmOpenRead) do
        try
         aa :=ReadComponent(Panel2);
         for i:=0 to aa.ComponentCount-1 do
         begin
           if aa.Components[i] is TFrame3 then
              TFrame3(aa.Components[i]).ManualDock(Panel2);
         end;
        finally
          Free;
        end;end;我用这段代码可以显示多个Tframe3 ;但我保存前的上下停靠的。读取后就变成了左右停靠了。