如何在实施过程中调用在新组件内部创建的过程
How to invoke a procedure created inside the New Component during the implementation
我创建并实现了一个新组件,在这个创建的组件中,有一个过程InitCombo
需要在实现中调用。
我该怎么做?
这是新组件中的过程InitCombo
:
procedure TNewComponent.InitCombo; //TComboBox ancestor
begin
FStoredItems.OnChange := nil;
StoredItems.Assign(Items);
AutoComplete := False;
FStoredItems.OnChange := StoredItemsChange;
doFilter := True;
StoredItemIndex := -1;
end;
这是我尝试调用但 returns 一条错误消息:
procedure TfrmMain.FormActivate(Sender: TObject);
begin
TNewComponent.InitCombo;
end;
Error Messages
[dcc32 Error] makeasale_u_v1.pas(84): E2076 This form of method call only allowed for class methods or constructor
请注意,编译、构建和安装都很顺利,并且正在运行。除了仅关于如何调用组件内部的过程?
仅基于您问题第一段的以下部分
there is a procedure InitCombo that needs to be invoked in the implementation.
看来您至少对编写组件的一些事情感到困惑。
首先,您可以在其构造函数中初始化组件属性以初始化事物,或者在覆盖的 Loaded
方法中初始化组件属性,该方法在组件从使用该组件的 .dfm 文件中流入后调用.请注意,Loaded
更改不应触及用户可以在对象检查器中设置的属性或事件,因为这样做会阻止使用用户的设置。
constructor TNewComponent.Create(AOwner: TComponent);
begin
inherited;
// Do your stuff here
end;
procedure TNewComponent.Loaded;
begin
// Do your stuff here
end;
其次,发布的事件(可以在对象检查器的“事件”选项卡中看到)属于使用组件的程序员,而不是组件作者。永远不要对这些事件处理程序做任何事情。您的组件不应该接触这些事件,除非在最终用户分配了处理程序时调用它们。所以下面的代码是绝对不正确的,因为 OnChange
事件属于你组件的用户,而不是你的组件代码:
procedure TNewComponent.InitCombo; //TComboBox ancestor
begin
FStoredItems.OnChange := nil;
...
FStoredItems.OnChange := StoredItemsChange;
end;
如果您绝对必须这样做,您需要通过保存最终用户分配的任何事件处理程序并在之后恢复它来正确地完成它:
procedure TNewComponent.InitCombo;
var
OldOnChange: TNotifyEvent;
begin
OldOnChange := Self.OnChange;
// Do your stuff here
Self.OnChange := OldOnChange;
end;
第三,除非你使用 class procedure
或 class function
,否则你不能调用 class 本身的方法(换句话说,你不能使用 TNewComponent.DoSomething
).您在组件本身的实例上调用方法或访问属性。在您的组件代码中,这将通过使用 Self
来完成,它引用当前实现的组件,如 Self.DoSomething
.
我创建并实现了一个新组件,在这个创建的组件中,有一个过程InitCombo
需要在实现中调用。
我该怎么做?
这是新组件中的过程InitCombo
:
procedure TNewComponent.InitCombo; //TComboBox ancestor
begin
FStoredItems.OnChange := nil;
StoredItems.Assign(Items);
AutoComplete := False;
FStoredItems.OnChange := StoredItemsChange;
doFilter := True;
StoredItemIndex := -1;
end;
这是我尝试调用但 returns 一条错误消息:
procedure TfrmMain.FormActivate(Sender: TObject);
begin
TNewComponent.InitCombo;
end;
Error Messages
[dcc32 Error] makeasale_u_v1.pas(84): E2076 This form of method call only allowed for class methods or constructor
请注意,编译、构建和安装都很顺利,并且正在运行。除了仅关于如何调用组件内部的过程?
仅基于您问题第一段的以下部分
there is a procedure InitCombo that needs to be invoked in the implementation.
看来您至少对编写组件的一些事情感到困惑。
首先,您可以在其构造函数中初始化组件属性以初始化事物,或者在覆盖的 Loaded
方法中初始化组件属性,该方法在组件从使用该组件的 .dfm 文件中流入后调用.请注意,Loaded
更改不应触及用户可以在对象检查器中设置的属性或事件,因为这样做会阻止使用用户的设置。
constructor TNewComponent.Create(AOwner: TComponent);
begin
inherited;
// Do your stuff here
end;
procedure TNewComponent.Loaded;
begin
// Do your stuff here
end;
其次,发布的事件(可以在对象检查器的“事件”选项卡中看到)属于使用组件的程序员,而不是组件作者。永远不要对这些事件处理程序做任何事情。您的组件不应该接触这些事件,除非在最终用户分配了处理程序时调用它们。所以下面的代码是绝对不正确的,因为 OnChange
事件属于你组件的用户,而不是你的组件代码:
procedure TNewComponent.InitCombo; //TComboBox ancestor
begin
FStoredItems.OnChange := nil;
...
FStoredItems.OnChange := StoredItemsChange;
end;
如果您绝对必须这样做,您需要通过保存最终用户分配的任何事件处理程序并在之后恢复它来正确地完成它:
procedure TNewComponent.InitCombo;
var
OldOnChange: TNotifyEvent;
begin
OldOnChange := Self.OnChange;
// Do your stuff here
Self.OnChange := OldOnChange;
end;
第三,除非你使用 class procedure
或 class function
,否则你不能调用 class 本身的方法(换句话说,你不能使用 TNewComponent.DoSomething
).您在组件本身的实例上调用方法或访问属性。在您的组件代码中,这将通过使用 Self
来完成,它引用当前实现的组件,如 Self.DoSomething
.