0

我是 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只要将类分配给句柄,就会自动调用该函数。

4

3 回答 3

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;
于 2013-06-03T05:25:57.500 回答
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;
于 2013-06-03T05:14:38.247 回答
2

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

MyComm := TMyComms.MyConstructor;

但是您的代码中也有错误。因为没有派生构造函数,您可以使用 simple 继承inherited

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

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

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

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;
于 2013-06-03T05:28:00.633 回答