将指针传递给构造函数作为参数时出现问题
|
我有以下超类:
unit DlgDefaultForm;
type
TDefaultFormDlg = class(TForm)
published
constructor Create(AOwner: TComponent); reintroduce; virtual;
end;
FormCreateFunc=function(AOwner: TComponent):TDefaultFormDlg;
它由一堆形式如下所示:
unit Form1
type
TForm1 = class(TDefaultFormDlg)
published
constructor Create(AOwner: TComponent); override;
end;
并创建如下:
unit MainForm;
procedure ShowForm(FormCreate:FormCreateFunc);
begin
(do some stuff)
FormCreate(ScrollBox1);
end;
当我跑步
ShowForm(@TForm1.Create);
发生两件事:
当我进入TForm1.Create时,即使它不在ShowForm中,AOwner = nil。
我在以下行收到EAbstractError:
unit Forms;
(...)
constructor TCustomForm.Create(AOwner: TComponent);
begin
(...)
InitializeNewForm; //EAbstractError
(...)
end;
我究竟做错了什么?
编辑:这当然不是我的确切代码。
没有找到相关结果
已邀请:
3 个回复
筷啸够对铅
顺便说一句,我认为您不需要在列出的代码中重新引入构造函数。
悍蕾驮苇袜
以及隐式第一个参数的类型(
)。当您从类或类引用中调用构造函数时,您实际上要构造一个新对象,并且
参数的类型将是实际的类类型。当您从另一个构造函数调用一个构造函数时,或者当您调用继承的构造函数时,则该对象实例已经创建并作为as7ѭ参数传递。隐藏的额外参数用作
标志,即分配新实例时为
,而对于构造函数的方法样式调用为
。 因此,您不能简单地将构造函数存储在方法指针[1]的位置中并期望它起作用。调用方法指针将不会为隐藏的多余参数传递正确的值,并且它将中断。您可以通过显式声明参数并进行一些类型转换来解决它。但是通常直接使用元类(类引用)更可取,并且不易出错。 [1]这是您的代码的另一个问题。您正在尝试将方法指针存储在函数指针位置。您可以这样做,但仍然可以使它工作,但是您需要然后显式地输入
的声明,并且还需要在分配时将元类作为第一个参数传递(以及为隐式标志)。方法指针烘烤第一个参数并自动将其传递。为了明确起见,等效于
的函数指针类似于:
在这里是一个指针,因为它可以是
类型或
类型,具体取决于
是对还是错。
闲窍