俺动态在一个窗体中创建很金多按钮,怎么才能把这么创建的控件及它们的位置保存下来,又怎么能下次再打开呢?提提意见。

解决方案 »

  1.   

    procedure TForm1.Button3Click(Sender: TObject);
    var
      i : integer;
      btn : TButton;
    begin
      for i := 0 to self.ComponentCount - 1 do
      begin
        if self.Components[i] is TButton then
        begin
          btn := self.Components[i] as TButton;
          //在这里保存
        end;
      end;
    end;
      

  2.   

    syl79: 怎么保存,保存成什么文件呀,到时间又怎么打开呀?
      

  3.   

    不明白人们为什么总把delphi当作低级语言用
      

  4.   

    动态创建Button?你是显示你的技术呢还是特地找罪受呢?
    不明白呀……
      

  5.   

    Kevin_Lmx(繁华阅尽) 这位老兄怎么能这说呢,我在作一个能让用户画自己的工作流程的程序,想动态创建panel,画线,然后保存,还有能利用qr作一个动态报表.
      

  6.   

    保存时,可以把Component转换成Str来存。给你两个函数:
    //Component转换成Str
    function CompToStr(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;
    //Str转换成Component
    function StrToComp(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;
      

  7.   

    To:ssq237712(流亡帅哥) 
        第一个函数好用!第二个用来还原的那个会出错呀 -_-#
      

  8.   

    出错?不会吧,我原来一直用这个的。
    确定Value是转换正确的串?
      

  9.   

    我调第二个的时候总是:Class TXXX Not Found.
    喂喂,我想我还不会犯那么低级的错误吧??
    贴段调用的代码来看看^_^
      

  10.   

    哦,忘记了说了,需要注册一下类的。
    比如转换TButton,在工程开始注册一下:RegisterClass(TButton);
    调用:btn1 := StrToComp(ss) as TButton;
    ...
      

  11.   

    行了,谢先!
    看来得加强一下VCL的知识了