Delphi 如何在实现过程中调用在新组件内创建的过程

Delphi 如何在实现过程中调用在新组件内创建的过程,delphi,components,tcombobox,tcomponent,Delphi,Components,Tcombobox,Tcomponent,我已经创建并实现了一个新组件,在这个创建的组件中,有一个过程InitCombo,需要在实现中调用 我该怎么做 以下是新组件内部的过程InitCombo: procedure TNewComponent.InitCombo; //TComboBox ancestor begin FStoredItems.OnChange := nil; StoredItems.Assign(Items); AutoComplete := False; FStoredItems.OnCh

我已经创建并实现了一个新组件,在这个创建的组件中,有一个过程
InitCombo
,需要在实现中调用

我该怎么做

以下是新组件内部的过程
InitCombo

procedure TNewComponent.InitCombo;       //TComboBox ancestor
begin
  FStoredItems.OnChange := nil;
  StoredItems.Assign(Items);
  AutoComplete := False;
  FStoredItems.OnChange := StoredItemsChange;
  doFilter := True;
  StoredItemIndex := -1;
end;
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
这是我尝试调用的结果,但返回一条错误消息:

procedure TNewComponent.InitCombo;       //TComboBox ancestor
begin
  FStoredItems.OnChange := nil;
  StoredItems.Assign(Items);
  AutoComplete := False;
  FStoredItems.OnChange := StoredItemsChange;
  doFilter := True;
  StoredItemIndex := -1;
end;
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

请注意,编译、构建和安装都进行得很顺利,并且正在运行。除了如何调用组件内部的过程之外?

仅基于问题第一段的以下部分

在实现中需要调用一个过程InitCombo

您似乎对编写组件的一些事情感到困惑

首先,在构造函数中初始化组件属性以进行初始化,或者在重写的
Loaded
方法中初始化组件属性,该方法在从使用组件的.dfm文件导入组件后调用。请注意,
加载的
更改不应触及用户可以在对象检查器中设置的属性或事件,因为这样做会阻止用户的设置被使用

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;

第三,除非使用
类过程
类函数
,否则不能对类本身调用方法(换句话说,不能使用
TNewComponent.DoSomething
)。可以对组件本身的实例调用方法或访问属性。在您的组件代码中,可以使用
Self
,这是指当前实现的组件,如
Self.DoSomething

,仅基于问题第一段的以下部分

在实现中需要调用一个过程InitCombo

您似乎对编写组件的一些事情感到困惑

首先,在构造函数中初始化组件属性以进行初始化,或者在重写的
Loaded
方法中初始化组件属性,该方法在从使用组件的.dfm文件导入组件后调用。请注意,
加载的
更改不应触及用户可以在对象检查器中设置的属性或事件,因为这样做会阻止用户的设置被使用

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;

第三,除非使用
类过程
类函数
,否则不能对类本身调用方法(换句话说,不能使用
TNewComponent.DoSomething
)。可以对组件本身的实例调用方法或访问属性。在组件代码中,可以使用
Self
,它引用当前实现的组件,如
Self。DoSomething

TNewComponent
是一种类型。不能对类型调用方法;你必须有一个实例。不清楚你到底想做什么,所以很难提供帮助。另外,
Procedure
在Delphi/Pascal中是一个关键字,所以不要命名Procedure
Procedure
。这是一个很好的地方,可以为您提供一个演示问题的示例,而不是编写甚至无法编译的代码。您可以在运行时分配事件@DelphiCoder Calss hack:你是指interposer类吗?interposer类与派生它的名称相同,例如TComboBox=class(StdCtrls.TComboBox)。现在,您可以访问原始TComboBox的私有和受保护字段以及方法/属性。请不要在评论中进行此讨论,而是提出您的问题,并将相关详细信息添加到问题中,以便查看。您需要清楚具体地说明您要做什么,这样我们就不必玩“20个问题”来从您那里获取信息。
TNewComponent
是一种类型。不能对类型调用方法;你必须有一个实例。不清楚你到底想做什么,所以很难提供帮助。另外,
Procedure
在Delphi/Pascal中是一个关键字,所以不要命名Procedure
Procedure
。这是一个很好的地方,可以为您提供一个演示问题的示例,而不是编写甚至无法编译的代码。您可以在运行时分配事件@DelphiCoder Calss hack:你是指interposer类吗?interposer类与派生它的名称相同,例如TComboBox=class(StdCtrls.TComboBox)。现在,您可以访问原始TComboBox的私有和受保护字段以及方法/属性。请不要在评论中讨论此问题,而是将您的问题和相关详细信息添加到