在主窗体中初始化对象,只能在窗体创建事件中初始化吗?
TMyForm = class(TForm)这是工程主窗体
MyClass : TMyClass;自己定义的类,不是VCL组件类。var
  MyForm: TMyForm;先是想在initialization中MyForm.MyClass := TMyClass.Create;结果访问出错然后想在TMyForm的构造函数中创建MyClass,结果自己做的构造函数,Application压根不理最后想只能在TMyForm.FormCreate(Sender: TObject);中创建MyClass了不知道是不是这样?另,能不能在dfm中写入MyClass?让Delphi自动创建它?

解决方案 »

  1.   

    一般的,除非你写成控件,拖到窗体(或datamodel)上,才会被窗体自动创建,其它的,好像比较难
      

  2.   

    然后想在TMyForm的构造函数中创建MyClass,结果自己做的构造函数,Application压根不理
    这应该是有问题的,不可能不理的
      

  3.   

    可以的, 你需要覆盖TForm的Create和Destroy两种方法。
    如:
    TMyForm = class(TForm)
    private
      MyClass : TMyClass;自己定义的类,不是VCL组件类。
    public
      constructor Create(AOwner: TComponent); override;
      destructor Destroy; override;
    end;...constructor TMyForm.Create(AOwner: TComponent); 
    begin
      inherited Create(AOwner);
      MyClass := TMyClass.Create;
    end;destructor TMyForm.Destroy;
    begin
      MyClass.Free;
      inherited;
    end;
      

  4.   

    我习惯在form的active事件的第一次触发里 创建、初始化对象、设置
    因为form的create事件发生的太早,有时候 那些对象、设置的生成条件还未具备
      

  5.   

    首先楼主打开dpr文件,你会看到begin下面有你的创建窗体代码。程序执行的顺序,首先是进行初始化(执行dpr中引用到的单元,以及传递引用到的单元的initialization段的代码),然后才是执行dpr中begin的代码。因此在initialization的时候,你的那个全局变量还没被创建,这样访问自然就地址错了。正确的方法:
    覆盖FORM的构造函数,或者在OnCreate中进行初始化。
      

  6.   

    //楼主没错,初始化类放到constructor中type
      TForm2 = class(TForm)
        T1: TButton;
      private
        { Private declarations }
        MyClass:TStrings;
      public
        { Public declarations }
        constructor Create(AOwner:TComponent);override;
        destructor  Destroy;override;
      end;var
      Form2: TForm2;implementation{$R *.dfm}{ TForm2 }constructor TForm2.Create(AOwner: TComponent);
    begin
      inherited;
      MyClass:=TStringList.Create;end;destructor TForm2.Destroy;
    begin
      if Assigned(MyClass) then
      FreeAndNil(MyClass);
      inherited;
    end;