在做一个程序,
需要将工作区的内容保存下来
就象工程文件本来想的是直接写ini,
将窗体中的控件的属性都记录下来,下次打开的时候动态生成
可现在工作区的内容还包括图片,图片也保存下来?
这样行是行,但是感觉很笨,而且将来的图片会很多
有没有什么方法,能直接保存成一个文件,将来载入这个文件就行了?难道是将所有的东东写到file中?然后再读?欢迎大家讨论

解决方案 »

  1.   

    _weiKun_(Virus):序列流进行,类,属性得保存。
    那么图片呢?
      

  2.   

    ReadComponentResFile
    writeComponentResFile
    感觉是不是可以用上面两个函数解决阿
      

  3.   

    只需要button1:=Tbutton.create(scrollbox);
    必须全部创建的都是这样的,保证隶属于这个scrollbox就肯定没有问题的,至于他的parent无所谓,还有一个问题 全部的对象必须直接隶属于scrollbox,不要变成objects[i].objects[i],这种形式 她不支持传递的关系 
    祝你好运!
      

  4.   

    很方便的,可以把内容写成流文件,需要的时候在读出来。文件里边包含了
    空间的位置,颜色,大小等一切属性。动态建立的时候很麻烦的
    ReadComponent
    WriteComponent
    你可以找一下上边两个函数的资料
      

  5.   

    我试验了一下,代码如下:(一个窗体Form1上有一个Panel1,上面放一个Button1,一个Edit1和一个Image1,然后在Panel1外放一个Button2)....
    procedure TForm1.Button2Click(Sender: TObject);
    var
      I:Integer;
    begin
      for I:=0 to Panel1.ControlCount-1 do
        Panel1.Controls [I].Parent :=Panel1;
      WriteComponentResFile('C:\MyPersistent.Txt',Panel1);
      FreeAndNil(Panel1);
      Self.Refresh ;
      (ReadComponentResFile('C:\MyPersistent.Res',Nil) As TPanel).Parent :=Self;
      for I:=0 to Panel1.ControlCount-1 do
        Panel1.Controls [I].Parent :=Panel1;
    end;initialization
      RegisterClasses([TPanel]);
    ....我运行后报错!
      

  6.   

    Call ReadComponentResFile to create a component and its children from their representation in a Windows resource file. The FileName parameter is the name of the compiled resource file that contains the component resource. The Instance parameter is an instance of the type of component that should be read. Create an instance of the appropriate type of object, and then call ReadComponentResFile to read in its property settings. If Instance is nil (Delphi) or NULL (C++), the object class is read from the resource. Before passing an Instance parameter of nil (Delphi) or NULL (C++), all classes being read must have been registered using the RegisterClass or RegisterClasses routine.ReadComponentResFile returns an instance of the component that was read from the resource file.
      

  7.   

    WriteComponentResFile这个过程是否会将Panel1上三个控件的Published属性也流化?
      

  8.   

    winamp采用的就是用注册表纪录的方法。
      

  9.   

    FrameSniper:你保存的文件MyPersistent.Res是不是没有保存image1和button1控件信息我只保存image1单个控件,试验成功procedure TForm1.Button2Click(Sender: TObject);
    begin
      WriteComponentResFile('MyPersistent.res',Image1);
      FreeAndNil(Image1);
      Self.Refresh ;
    end;
      

  10.   

    FrameSniper(§绕瀑游龙§);是不是保存的时候没有把1Image1和Button1控件的信息也保存进去我只保存Image1控件,试验成功procedure TForm1.Button2Click(Sender: TObject);
    begin
      WriteComponentResFile('MyPersistent.res',Image1);
      FreeAndNil(Image1);
      Self.Refresh ;
    end;procedure TForm1.Button3Click(Sender: TObject);
    begin
      (ReadComponentResFile('MyPersistent.res',Nil) As TImage).Parent :=Panel1;
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      RegisterClasses([TImage]);
    end;
      

  11.   

    一个空白窗体单元文件中全部代码如下,运行后:unit Unit7;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls;type
      TWAPanel = class(TPanel)
        private
          FEdit: TEdit;
          FButton: TButton;
          FImage: TImage;
        published
          property Edit: TEdit read FEdit write FEdit;
          property Button: TButton read FButton write FButton;
          property Image: TImage read FImage write FImage;
        public
          constructor Create(AOwner: TComponent); override;
          destructor Destroy;override;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      MyWAPanel:TWAPanel;implementation{$R *.dfm}{ TWAPanel }constructor TWAPanel.Create(AOwner: TComponent);
    var
      I:Integer;
    begin
      inherited;
      Align:=alLeft;
      Width:=400;
      FEdit:=TEdit.Create(Self);
      with FEdit do
      begin
        Top:=20;
        Left:=20;
        Height:=20;
        Width:=120;
        Text:='Work Area'
      end;
      FButton:=TButton.Create(Self);
      with FButton do
      begin
        Top:=FEdit.Top ;
        Left:=FEdit.Left +FEdit.Width +20;
        Height:=FEdit.Height ;
        Width:=FEdit.Width ;
      end;
      FImage:=TImage.Create(Self);
      with FImage do
      begin
        Top:=FEdit.Top +FEdit.Height +20;
        Left:=FEdit.Left ;
        Height :=Self.Height -Top-20;
        Width :=Self.Width -Left-20
      end;
      for I:=0 to Self.ControlCount -1 do
        Self.Controls [I].Parent:=Application.MainForm ;
    end;destructor TWAPanel.Destroy;
    begin
      //FEdit.Free;
      //FButton.Free;
      //FImage.Free;
      inherited;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyWAPanel:=TWAPanel.Create(Self);
      WriteComponentResFile('C:\WorkArea.Res',MyWAPanel);
      FreeAndNil(MyWAPanel);
      (ReadComponentResFile('C:\WorkArea.Res',MyWAPanel) as TWAPanel).Parent :=Self;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      FreeAndNil(MyWAPanel);
    end;initialization
      RegisterClasses([TWAPanel]);end.怎么里面定义的三个控件不显示,邪门了!
      

  12.   

    一个空白窗体单元文件中全部代码如下,运行后:unit Unit7;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls;type
      TWAPanel = class(TPanel)
        private
          FEdit: TEdit;
          FButton: TButton;
          FImage: TImage;
        published
          property Edit: TEdit read FEdit write FEdit;
          property Button: TButton read FButton write FButton;
          property Image: TImage read FImage write FImage;
        public
          constructor Create(AOwner: TComponent); override;
          destructor Destroy;override;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      MyWAPanel:TWAPanel;implementation{$R *.dfm}{ TWAPanel }constructor TWAPanel.Create(AOwner: TComponent);
    var
      I:Integer;
    begin
      inherited;
      Align:=alLeft;
      Width:=400;
      FEdit:=TEdit.Create(Self);
      with FEdit do
      begin
        Top:=20;
        Left:=20;
        Height:=20;
        Width:=120;
        Text:='Work Area'
      end;
      FButton:=TButton.Create(Self);
      with FButton do
      begin
        Top:=FEdit.Top ;
        Left:=FEdit.Left +FEdit.Width +20;
        Height:=FEdit.Height ;
        Width:=FEdit.Width ;
      end;
      FImage:=TImage.Create(Self);
      with FImage do
      begin
        Top:=FEdit.Top +FEdit.Height +20;
        Left:=FEdit.Left ;
        Height :=Self.Height -Top-20;
        Width :=Self.Width -Left-20
      end;
      for I:=0 to Self.ControlCount -1 do
        Self.Controls [I].Parent:=Application.MainForm ;
    end;destructor TWAPanel.Destroy;
    begin
      //FEdit.Free;
      //FButton.Free;
      //FImage.Free;
      inherited;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyWAPanel:=TWAPanel.Create(Self);
      WriteComponentResFile('C:\WorkArea.Res',MyWAPanel);
      FreeAndNil(MyWAPanel);
      (ReadComponentResFile('C:\WorkArea.Res',MyWAPanel) as TWAPanel).Parent :=Self;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      FreeAndNil(MyWAPanel);
    end;initialization
      RegisterClasses([TWAPanel]);end.怎么里面定义的三个控件不显示,邪门了!
      

  13.   

    一个空白窗体单元文件中全部代码如下,运行后:unit Unit7;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Buttons, ExtCtrls, StdCtrls;type
      TWAPanel = class(TPanel)
        private
          FEdit: TEdit;
          FButton: TButton;
          FImage: TImage;
        published
          property Edit: TEdit read FEdit write FEdit;
          property Button: TButton read FButton write FButton;
          property Image: TImage read FImage write FImage;
        public
          constructor Create(AOwner: TComponent); override;
          destructor Destroy;override;
      end;  TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      MyWAPanel:TWAPanel;implementation{$R *.dfm}{ TWAPanel }constructor TWAPanel.Create(AOwner: TComponent);
    var
      I:Integer;
    begin
      inherited;
      Align:=alLeft;
      Width:=400;
      FEdit:=TEdit.Create(Self);
      with FEdit do
      begin
        Top:=20;
        Left:=20;
        Height:=20;
        Width:=120;
        Text:='Work Area'
      end;
      FButton:=TButton.Create(Self);
      with FButton do
      begin
        Top:=FEdit.Top ;
        Left:=FEdit.Left +FEdit.Width +20;
        Height:=FEdit.Height ;
        Width:=FEdit.Width ;
      end;
      FImage:=TImage.Create(Self);
      with FImage do
      begin
        Top:=FEdit.Top +FEdit.Height +20;
        Left:=FEdit.Left ;
        Height :=Self.Height -Top-20;
        Width :=Self.Width -Left-20
      end;
      for I:=0 to Self.ControlCount -1 do
        Self.Controls [I].Parent:=Application.MainForm ;
    end;destructor TWAPanel.Destroy;
    begin
      //FEdit.Free;
      //FButton.Free;
      //FImage.Free;
      inherited;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      MyWAPanel:=TWAPanel.Create(Self);
      WriteComponentResFile('C:\WorkArea.Res',MyWAPanel);
      FreeAndNil(MyWAPanel);
      (ReadComponentResFile('C:\WorkArea.Res',MyWAPanel) as TWAPanel).Parent :=Self;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      FreeAndNil(MyWAPanel);
    end;initialization
      RegisterClasses([TWAPanel]);end.怎么里面定义的三个控件不显示,邪门了!
      

  14.   

    这个吗,就用DELPHI 本身的 DFM 文件格式不就行了吗?
      

  15.   

    SHIT,怎么发了两次?To  楼上的  那具体如何做呢?
      

  16.   

    delphi用了这个dfm的,不过咱老百姓如何使用呢?
      

  17.   

    typinfo单元的那些函数可以对公布属性进行遍历!但我不清楚楼上所说的WriteComponentResFile这个过程是将什么信息进行流化?
      

  18.   

    这个东东我试了一下午,好像不行呀
    的确,能保存窗体的位置什么的了但是我对控件写的事件呢?重新加载就没了
    其实delphi也一样,
    也需要*.pas来保存类呀、过程呀什么的
    只有资源是不行的
      

  19.   

    他进行的只是 view as form  和 view as Text 之间的转换
      

  20.   

    SHIT,CSDN上的高人一到双休就都TMD钻到洗头房去了?!
      

  21.   

    什么叫View as Form/Text?
      

  22.   

    是窗体和窗体代码的切换,alt+f12键
      

  23.   

    实在不行我就用两个文件解决一个是ini,记录变量
    另一个用数据库,存图像 然后动态生成控件,用图像的话就从库里取这样可能是比较简单的方法了
      

  24.   

    搞错了,原来是delphi论坛,我以为C#
      

  25.   

    大家不要互相谩骂,保持些风度嘛!OK?觉得楼主的第一种方法也不是不可行,Delphi 的 DFM 文件也是这样存储的,RES 中只是存储应用程序的资源,当然也可以分开文件保存,象 VB6 就是将资源和属性分开存储的。另外个人愚见:我觉得没有必要弄的象 DELPHI 那么的复杂吧!简单一些好啊。如果能简单处理,还是好的,只是需要注意以后的扩展升级而已。
      

  26.   

    呵呵,我们在群里这么胡闹惯了到是叫 CloneCenter(复制中心)老兄见笑了
    第一种方法,最大的缺点是,我的图片很多,这样岂不是很难管理?
      

  27.   


    8个小时过去了,我还是没有看到什么地方说过WriteComponentResFile这个函数到底是对对象的什么信息进行流化处理的!
      

  28.   

    很简单啦,用TStream类的WriteComponent和ReadComponent就可以了,不知合不合你的要求
    Example:
    //保存
    procedure SaveComponent(Con: TWinControl; Path: string);var
      BinStream:TMemoryStream;
      StrStream: TStringStream;
      s: string;
    begin
      BinStream := TMemoryStream.Create;
      try
        BinStream.WriteComponent(Con);
        BinStream.Seek(0, soFromBeginning);
        BinStream.SaveToFile(Path);
      finally
        BinStream.Free
      end;
    end;
    //写回
    procedure ReadComponent(Path: string; Con: TWinControl);
    var
      BinStream: TMemoryStream;
      lp: integer;
      Com: TComponent;
    begin
      //注意删除你不要的就可以了,自己做过滤
      for lp := Con.ComponentCount - 1 downto 0 do
      begin
        Com := Con.Components[lp];
        Con.RemoveComponent(Com);
        Com.Free;
      end;
      BinStream := TMemoryStream.Create;
      try
        BinStream.LoadFromFile(Path);
        BinStream.ReadComponent(Con);
      finally
        BinStream.Free;
      end;
    end;
      

  29.   

    以上方法,只要是publish属性都可以保存,Image1中的图片也可以,试试看
      

  30.   

    还要注意所有保存的类在FormCreate时都要RegisterClasses
      

  31.   

    huojiehai(海天子)的方法非常棒!
    不过我连续按几次后,就出现内存错误了。
    //////////////////////////////////////////////
    var
      Form1: TForm1;
      procedure SaveComponent(Con: TWinControl; Path: string);
      procedure ReadComponent(Path: string; Con: TWinControl);
    implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
    //
      SaveComponent(form1,'d:\form1.ini');
    end;
    procedure SaveComponent(Con: TWinControl; Path: string);var
      BinStream:TMemoryStream;
      StrStream: TStringStream;
      s: string;
    begin
      BinStream := TMemoryStream.Create;
      try
        BinStream.WriteComponent(Con);
        BinStream.Seek(0, soFromBeginning);
        BinStream.SaveToFile(Path);
      finally
        BinStream.Free
      end;
    end;
    procedure ReadComponent(Path: string; Con: TWinControl);
    var
      BinStream: TMemoryStream;
      lp: integer;
      Com: TComponent;
    begin
      //注意删除你不要的就可以了,自己做过滤
      for lp := Con.ComponentCount - 1 downto 0 do
      begin
        Com := Con.Components[lp];
        Con.RemoveComponent(Com);
        Com.Free;
      end;
      BinStream := TMemoryStream.Create;
      try
        BinStream.LoadFromFile(Path);
        BinStream.ReadComponent(Con);
      finally
        BinStream.Free;
      end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      ReadComponent('d:\form1.ini',form1);
    end;end.
      

  32.   

    可以执行下面的过程两次,第三次出现
    ---------------------------
    Project1
    ---------------------------
    Access violation at address 00403676 in module 'Project1.exe'. Read of address FFFFFFD8.
    ---------------------------
    确定   
    ---------------------------procedure TForm1.Button2Click(Sender: TObject);
    begin
      ReadComponent('d:\form1.ini',form1);
    end;
      

  33.   

    出错可能是在删除组件处出错,建议大家改进一下,我以前做的时候,每次读入前都是动态创建Form
      

  34.   

    FrameSniper(§绕瀑游龙§) 在使用这两个函数的时候不能传递owner,我也不知道为什么,但是我用了这么长时间发现就是传递后你的控件会消失,解决的办法就是吧所有的控件都owner设置成为scrollbox(你需要保存的),至于她的parent就随便了。
    阿德,这个方法我们一直在用,尤其是在动态报表上非常好用,不明白你为什么总是不成功,需不需要我给你发一段代码过来?不过是动态报表的,而且很小,很久以前我测试这个方法的时候写的,你可以看看!
      

  35.   

    海天子说得很队,必须注意registerclass,否则有些类是不能用的,例如qrlabel就在你创建之后不能用