我是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
函数。
答案 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;