自定义一个类,继承自TComponent:  TCustomComServer = class(TComponent)
   private
     fSvrSocket:TServerSocket;
     ... 
   public     ...
     constructor Create(AOwner: TComponent) ;overload;
     destructor  Destroy; override;
   end;constructor TCustomComServer.Create(AOwner: TComponent;Port : integer);
begin
  inherited Create(AOwner);
  fSvrSocket := TServerSocket.Create(Aowner);
     ...
end;destructor TCustomComServer.Destroy;
begin
  fSvrSocket.Close;
  fSvrSocket.Free;
  inherited;
end;
该类在单元中引入后,用代码创建,所有功能工作正常。封装为组件,安装后,放置到窗体上时,窗体打开正常,但在关闭是提示地址访问错误,跟踪后发现,释放方法中    fSvrSocket.Close; 时 fSvrSocket 为nil ,再跟踪发现,窗体创建时组件的create没有执行。
为什么组件的 create 在窗体创建时没有运行,而Destroy在窗体释放时运行??
高分求教!!!! 在线等待。

解决方案 »

  1.   

    你的constructor根声明的不一样
      

  2.   

    constructor Create(AOwner: TComponent) ;override;
      

  3.   

    Port : integer//把这个作为一个属性来访问,呵呵
      

  4.   

    constructor TCustomComServer.Create(AOwner: TComponent;Port : integer);
    begin
      fSvrSocket := TServerSocket.Create(Aowner);
      //把这一行写到前面
      inherited Create(AOwner);
      //fSvrSocket := TServerSocket.Create(Aowner);
         ...
    end;
      

  5.   

    这里错了:
    constructor TCustomComServer.Create(AOwner: TComponent;Port : integer);
    begin
      inherited Create(AOwner);
      //fSvrSocket := TServerSocket.Create(Aowner);
      fSvrSocket := TServerSocket.Create(Self);
         ...
    end;
      

  6.   

    constructor Create(AOwner: TComponent) ;overload;
    destructor  Destroy; override;constructor TCustomComServer.Create(AOwner: TComponent);
      

  7.   

    sorry,贴错了,create 应该是:constructor TCustomComServer.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
      fSvrSocket := TServerSocket.Create(Aowner);
         ...
    end;
      

  8.   

    在create 中  fSvrSocket := TServerSocket.Create(Aowner);
      fSvrSocket := TServerSocket.Create(Self);
     有什么差别??
    而且,跟踪发现,create 在窗体创建时,没有被执行。用代码创建该类,运行正常阿。可见,create 方法的代码本身没问题,可就是没有被运行。为什么会没有运行??在窗体释放时,Destroy 会被运行,为什么??
      

  9.   

    TCustomComServer = class(TComponent)
       private
         fSvrSocket:TServerSocket;
         ... 
       public     ...
         constructor Create(AOwner: TComponent) ;override;
         destructor  Destroy; override;
       end;constructor TCustomComServer.Create(AOwner: TComponent;Port : integer);
    begin
      inherited Create(AOwner);
      fSvrSocket := TServerSocket.Create(Self);
         ...
    end;destructor TCustomComServer.Destroy;
    begin
      fSvrSocket.Close;
      fSvrSocket.Free;
      inherited;
    end;
      

  10.   

    constructor Create(AOwner: TComponent);overload;
    改为constructor Create(AOwner: TComponent);override;
      

  11.   

    谢谢各位,问题解决了。心得如下:1。create的方法只能定义为 override,否则窗体设计器将无法调用create方法。
    2。在create中创建私有组件的方法参数应该为self。如果使用Awoner,会在其容器中生成该组件,而自定义的组件内却无法访问。尤其谢谢 largewang(老王) 。