type
  TForm1 = class(TForm)
    DatDao1: TDatDao;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
问题
1 为什么加到Form1上的控件,例如TButton,不用调用create方法都能初始化并分配内存?
2 TDatDao是我自定义的对象,其构造器是 create(path:String)这样的,但是,我把它做成控件后,它好像是自动终始化了,我应该怎么输入path这个参数呢? 我试过 DatDao1.create('C:\aaa');这样就出错了,报错说“stack overflow”分数不多了,请大家帮帮忙,谢谢。

解决方案 »

  1.   

    重载的构造函数一般是这样的吧Constructor Create(AOwner:TComponent);override;
    lz的Path可以做成一个属性,然后在这个构造函数里使用这个属性就可以了。
    这个属性Publish之后,在属性窗中可以看到,设置它就行了,运行时它会在构造时加载。
    我一般是这样用的。
      

  2.   

    //Classes.pas
    function InternalReadComponentRes(const ResName: string; HInst: THandle; var Instance: TComponent): Boolean;
    var
      HRsrc: THandle;
    begin                   { avoid possible EResNotFound exception }
      if HInst = 0 then HInst := HInstance;
      HRsrc := FindResource(HInst, PChar(ResName), RT_RCDATA);
      Result := HRsrc <> 0;
      if not Result then Exit;
      with TResourceStream.Create(HInst, ResName, RT_RCDATA) do
      try
        Instance := ReadComponent(Instance);
      finally
        Free;
      end;
      Result := True;
    end;到Form1上的控件信息会保存到窗体文件中---Unit1.dfm
    代码编译后就保存在程序的资源中,
    窗体创建的时候则通过上面的代码载入资源并创建这些控件。这种创建方式只会调用TDatDao.Create(Form1);而不会调用TDatDao.Create(Form1, 'xxxxxx')
    所以要实现你的功能还需要将Path作为属性
    property Path: string read FPath write FPath;注意:DatDao1.Create()是错误的TDatDao.Create()才可以
    因为Create就是构建实例,而DatDao1本身已经被构建过了