如何在将 Delphi VCL 设计时包放入表单时自动包含文件

How to auto include files when Delphi VCL design time package is put onto the form

我在 Delphi 中围绕 TWebBrowser 构建了一个包装器。包装器旨在将多个 Web 浏览器(edge chromium,chrome 等)实现到一个自动检测要使用哪个浏览器的包装器中。

完成 class 后,我将 class 转换为 VCL 组件并将其加载到设计时包中。我的组件只包含两个文件,包装器本身和实用程序 class。当我将我的组件从工具选项板拖到 VCL 窗体上时,包装器和实用程序 class 不会自动添加到项目中。这意味着我必须手动将包装器和实用程序都包含到项目中。

我希望有一种方法可以在将包装器添加到表单时自动将这两个文件包含到项目中。我想我以前在我使用过的其他第三方组件中看到过这个,但我的记忆力可能让我失望了。

如果这是可以做到的,我的假设是它会在 VCL 组件的寄存器部分。

procedure Register;
begin
   RegisterComponents('My Wrappers', [TWebBrowserWrapper]);
end;

因为这是我认为在设计时 运行 的代码。

让您的 design-time 包实现继承自 TSelectionEditor and overrides its virtual RequiresUnits() method, and then register that class for your component using RegisterSelectionEditor() 的 class。这样,每当您将组件放置到位于 design-time 的 Form/Frame/DataModule Designer 上时,您从 RequiresUnits() 报告的任何其他单元都将自动添加到该单元的 uses 子句中,当单元已保存。

例如:

uses
  ..., DesignIntf;

type
  TWebBrowserWrapperSelectionEditor = class(TSelectionEditor)
  public
    procedure RequiresUnits(Proc: TGetStrProc); override;
  end;

procedure TWebBrowserWrapperSelectionEditor.RequiresUnits(Proc: TGetStrProc);
begin
  inherited RequiresUnits(Proc);
  // call Proc() for each additional unit you want added...
  Proc('MyWrapperUnit');
  Proc('MyUtilityUnit');
end;

procedure Register;
begin
  RegisterComponents('My Wrappers', [TWebBrowserWrapper]);
  RegisterSelectionEditor(TWebBrowserWrapper, TWebBrowserWrapperSelectionEditor);
end;