在TComponent中Delphi定制的构造函数永远不会运行

时间:2013-06-03 05:10:24

标签: delphi

我是delphi的新手,我在delphi 6中创建了一个组件但是我无法运行构造函数:

unit MyComms1;
...
type
  TMyComms = class(TComponent)
    public
      constructor MyConstructor;
    end;
implementation

constructor TMyComms.MyConstructor;
begin
  inherited;
  ShowMessage('got here');
end;

调用构造函数并不重要,但是这段代码根本不运行构造函数。

修改

按要求,这里是TMyComms类的初始化方式(此代码位于名为TestComms.pas的不同文件中):

unit TestComms;

interface

uses MyComms1, ...

type 
  TForm1 = class(TForm)
    MyCommsHandle = TMyComms;
    ...
    procedure BtnClick(Sender: TObject);
  private
  public
  end;
var
  Form1: TForm1;

implementation

procedure TForm1.BtnClick(Sender: TObject);
begin
  MyCommsHandle.AnotherMyCommsProcedure;
end;

编辑2

阅读一些看起来像构造函数的答案必须在delphi中手动调用。它是否正确?如果是这样那么这肯定是我的主要错误 - 我习惯于php,只要将类分配给句柄,就会自动调用__construct函数。

3 个答案:

答案 0 :(得分:3)

很可能你没有调用TMyComms.MyConstructor来测试你不寻常的被叫和使用过的构造函数。标有// **的方式最常见。

type
  TMyComms = class(TComponent)
    public
      constructor MyConstructor;
     // the usual override;
     // constructor Create(Owner:TComponent);override; // **    
      constructor Create(AOwner:TComponent);overload; override;
      constructor Create(AOwner:TComponent;AnOtherParameter:Integer);overload;    
    end;

constructor TMyComms.Create(AOwner: TComponent);
begin
  inherited ;
  ShowMessage('got here Create');
end;

constructor TMyComms.Create(AOwner: TComponent; AnOtherParameter: Integer);
begin
  inherited Create(AOwner);
  ShowMessage(Format('got here Create with new parametere %d',[AnOtherParameter]));
end;

constructor TMyComms.MyConstructor;
begin
  inherited Create(nil);
  ShowMessage('got here MyConstructor');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
    TMyComms.MyConstructor.Free;
    TMyComms.Create(self).Free;
    TMyComms.Create(self,1234).Free;

end;

答案 1 :(得分:2)

您的代码不遵循Delphi命名准则 - 构造函数应命名为Create

由于你没有发布实际调用ctor的代码,我想,你可能根本没有调用它。尝试在表单中添加一个按钮,双击它并添加以下代码:

procedure TForm1.Button1Click(Sender : TObject)

var comms : TMyComms;

begin
  comms := TMyComms.MyConstructor;
  comms.Free;
end;

顺便说一句,如果你从TComponent派生,你应该用参数覆盖构造函数 - 否则继承的方法可能无法正常工作。

interface

type TMyComms = class(TComponent)
  private
  protected
  public
    constructor Create(AOwner : TComponent); override;
  end;

implementation

constructor TMyComms.Create(AOwner : TComponent)
begin
  inherited Create(AOwner);
  // Your stuff
end;

// Somewhere in code
var comms : TMyComms;

begin
comms := TMyComms.Create(nil);
end;

答案 2 :(得分:2)

您的自定义构造函数未被调用,因为您没有调用它。

MyComm := TMyComms.MyConstructor;

但是你的代码也有错误。因为没有派生的构造函数,所以可以使用简单的inherited继承。

type
  TMyComms = class(TComponent)
    public
      constructor MyConstructor;
    end;
implementation

constructor TMyComms.MyConstructor;
begin
  inherited Create( nil ); // !
  ShowMessage('got here');
end;

如果您的自定义构造函数使用现有构造函数中的相同名称和参数,则可以使用简单inherited

type
  TMyComms = class(TComponent)
    public
      constructor Create( AOwner : TComponent ); override;
    end;
implementation

constructor TMyComms.Create( AOwner : TComponent );
begin
  inherited; // <- everything is fine
  ShowMessage('got here');
end;