1

我已经创建并实现了一个新组件,在这个创建的组件中,有一个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

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

4

1 回答 1

3

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

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

看来您至少对编写组件的一些事情感到困惑。

首先,您可以在其构造函数中初始化组件属性以初始化事物,或者在覆盖的Loaded方法中初始化,该方法在组件从使用组件的 .dfm 文件流式传输后调用。请注意,Loaded更改不应触及用户可以在 Object Inspector 中设置的属性或事件,因为这样做会阻止使用用户的设置。

constructor TNewComponent.Create(AOwner: TComponent);
begin
  inherited;
  // Do your stuff here
end;

procedure TNewComponent.Loaded;
begin
  // Do your stuff here
end;

其次,发布的事件(可以在 Object Inspector 的 Events 选项卡中看到)属于使用组件的程序员,而不是组件作者。永远不要对那些事件处理程序做任何事情。如果最终用户分配了处理程序,您的组件不应该接触这些事件,除非调用它们。所以下面的代码是绝对不正确的,因为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 procedureor ,否则您class function不能调用类本身的方法(换句话说,您不能使用TNewComponent.DoSomething)。您在组件本身的实例上调用方法或访问属性。在您的组件代码中,这将通过 using 来完成Self,它引用当前实现的组件,如Self.DoSomething.

于 2021-02-10T02:07:12.153 回答