我写了一个组件,继承自TComponent,重载了构造函数(实际上是另外定义了一个构造函数),因为参数不同,不是
    constructor create(Owner:TComponent);override; 
的形式,而是
    constructor create(Owner:TComponent;a:TMyType);//该函数实现部分有这么一句话:inherited create(owner);这种形式在一般的类对象创建时候只要参数传对了就没问题了。现在,我把这个类注册为组件,在运行的时候,它却不进入构造函数体内执行,何故?

解决方案 »

  1.   

    在构造函数里做了些什么工作?我看看
    一般来做要用到的对像都在构造函数里先CREATE
      

  2.   


      不错,我就是在构造函数里面create几个成员的实例,这个具体的内容也没什么特别的,关键是它根本就不到这个构造函数体内执行,至于什么内容倒在其次了。稍等,我贴上来。
      

  3.   

    *************定义部分****************************************************
    public
      Constructor Create(PADOConnect:TADOConnection;PAppName:String);
    //这里不能override,因为这个函数结构不同于其祖先类TComponent的构造函数*************实现部分****************************************************
    constructor TUser.Create(PADOConnect: TADOConnection;PAppName:String);
    begin
      AppName:=PAppName;
      ADOC:= PADOConnect;
      Qry_User:=TADOQuery.Create(nil);
      Qry_User.Connection:= ADOC;
        .......
    end;
      

  4.   

    搞掉了,实现部分还有一句:inherited create(nil);
      

  5.   

    你是这样写的吗:
    constructor Create(Owner:TComponent;a:TMyType); reintroduce; overload;
      

  6.   


        reintroduce; overload; 都没有加,因为都没有效果。
        
      

  7.   

    试试这样:
    constructor Create(Owner:TComponent;a:TMyType); reintroduce;
      

  8.   

    我尝试了,如果跟祖先类的参数一致,加上override,是可以进入函数体的。
      

  9.   

    reintroduce; overload;是一起加到构造函数后的,你这样做没有?
      

  10.   

    只能用
    constructor Create(Owner: TComponent); override;
    因为跟踪一下源码
    当窗体创建时,
    建立每一个组件时会调用
    function TReader.ReadComponent(Component: TComponent): TComponent;
    它会调用
    CreateComponent procedure CreateComponent;
      var
        ComponentClass: TComponentClass;
      begin
        try
          ComponentClass := FindComponentClass(CompClass);
          Result := nil;
          if Assigned(FOnCreateComponent) then
            FOnCreateComponent(Self, ComponentClass, Result);
          if Result = nil then
          begin
            Result := TComponent(ComponentClass.NewInstance);
            if ffInline in Flags then
            begin
              Include(Result.FComponentState, csLoading);
              Include(Result.FComponentState, csInline);
            end;
            try
              Result.Create(Owner);
            except
              Result := nil;
              raise;
            end;
          end;
          Include(Result.FComponentState, csLoading);
        except
          if not Recover(Result) then raise;
        end;
      end;都在classes.pas内
    也就是说在这块
     Result.Create(Owner);
    如果不用override,
    则只能进TComponent.Create里
    为什么必须传一个a: TMyType呢
      

  11.   

    当然不会进入静态方法“constructor create(Owner:TComponent;a:TMyType)”了。
      

  12.   

    cg1120:
    reintroduce; overload 我联合用了也无效。 xzgyb(老达摩) :现在我不能调试。不过,我曾经改过一个窗口(TForm也是TComponent的派生类)的constructor函数,这样用也没有问题;使用一般类(不注册为组件)的时候,也没问题。largewang(老王) :提提建议。谢!
      

  13.   

    bigysw:
    那是因为你在程序里自己调用的
    TForm1.Create(Self, 3)这类的
    而注册为组件
    是由
    delphi在创建组件时调用的
    Result.Create(Owner);
    就是这种形式
    a:TMyType
    完全可以作为一个组件的属性,
    不一定非得这样
    constructor create(Owner:TComponent;a:TMyType)
      

  14.   

    xzgyb(老达摩) 说得很好,我可能真的应该转换一下思路,刚才zou5655(周围) 也跟我这样交流了。多谢!