delphi - 使用新事件创建自定义框架

Posted

技术标签:

【中文标题】delphi - 使用新事件创建自定义框架【英文标题】:delphi - Creating custom frame with new event 【发布时间】:2015-02-14 13:52:41 【问题描述】:

我正在开发 delphi XE2。我需要什么: 我需要带有没有任何可见组件的框架的 MyFrame 类,但在 Object Inspector 中可以看到新事件。此事件将通知我的表单(将在其上放置 MyFrame 对象),即 f.e.框架上的所有数据都已满。

我有什么: 基于this post 和 TOndrej 的回答,以及 that hint,其中 Ba 显示,对于 XE2,我们需要替换

delphivclide := GetModuleHandle('delphivclide160.bpl');

用这个:

delphivclide := GetModuleHandle('vcldesigner160.bpl');

我有新框架的代码:

unit MyFrame;
interface
uses
  System.Classes, Vcl.Forms;
type
  TMyFrame = class(TFrame)
  private
  protected
    FOnFilledData : TNotifyEvent;
  public
  published
    property OnFilledData : TNotifyEvent read FOnFilledData write FOnFilledData;
  end;
implementation
end.

还有注册单位的代码:

unit MyFrameReg;
interface
procedure Register;

implementation
uses Windows, DesignIntf, Dialogs, wFrame;

procedure Register;
var
  delphivclide: THandle;
  TFrameModule: TCustomModuleClass;
begin
  delphivclide := GetModuleHandle('vcldesigner160.bpl');
  if delphivclide <> 0 then
  begin
    TFrameModule := GetProcAddress(delphivclide, '@Vclformcontainer@TFrameModule@');
    if Assigned(TFrameModule) then
    begin
      ShowMessage('I''m here');
      RegisterCustomModule(TMyFrame, TFrameModule);
    end;
  end;
end;
end.

当我构建我的包时,我收到消息我在这里,所以我猜想 MyFrame 已注册。

我的问题是什么: 问题是,它不能工作到最后。 当我选择 New VCL Application,并想通过选择 File -> New -> Other -> Delphi Projects -> MyFrame 来创建 MyFrame 时,出现如下所示的奇怪窗口。 当我在那里选择某个目录并单击 OK 按钮时,新的 Delphi 项目关闭,我的包项目打开。

如果有人可以告诉我我做错了什么,我会很高兴。

【问题讨论】:

您正在使用不受支持的无证破解。也许实施发生了变化。毕竟,IDE 现在有了新的 FMX 设计器。事情可能会有所不同也就不足为奇了。 @DavidHeffernan 当你需要做这样的事情时,官方文档很糟糕...... 【参考方案1】:

A.框架类注册

没有必要以“hacky方式”来做

uses
...
  DMForm,
  VCLFormContainer,
...

procedure Register;
begin
...
  RegisterCustomModule(TYourFrameClass, TFrameModule);   // for frames
  RegisterCustomModule(TYourModuleClass, TDataModuleCustomModule);   // for data modules
...
end;

还有另一种添加框架的方法

type
  TNestableWinControlCustomModule = class (TWinControlCustomModule)
  public
    function Nestable: Boolean; override;
  end;

function TNestableWinControlCustomModule.Nestable: Boolean;
begin
  Result := True;
end;

+

  RegisterCustomModule(TYourFrameClass, TNestableWinControlCustomModule);

单位名称(在 XE7 中测试):

TCustomModule => 设计编辑器

TDataModuleCustomModule => DMForm (designide.dcp)

TWinControlCustomModule => WCtlForm (designide.dcp)

TFrameModule => VCLFormContainer (vcldesigner.dcp)

我认为对于 FireMonkey 应该可以采用类似的方式(查找 fmxdesigner.dcp 并检查 Notepad++ 中的内容)

B.要在“新建...”向导中使用它,您需要注册向导类。 如果您没有时间编写向导类,只需创建新框架,然后手动替换父类名称并将适当的单元添加到“使用”列表中。就是这样

PS. 在较旧的 Delphi 版本中,单元 DMDesigner

中有 TDataModuleDesignerCustomModule 元类而不是 TDataModuleCustomModule

PPS. 其他现有元类名称:

TCustomFormCustomModule

TIDESourceModuleCustomModule

【讨论】:

我正在 Delphi XE7 上进行测试,但它显示“找不到文件 VCLFormContainer.dcu”。 (DesignIDErequires 子句中)。缺少什么? @ExDev 你是对的 - 我已经更正了我的帖子 vcldesigner 添加到框架所需的模块中 我已经检查了 designide.dcp / fmxdesigner.dcp / vcldesigner.dcp 仍然存在于 Delphi 10.2 Tokio ;)

以上是关于delphi - 使用新事件创建自定义框架的主要内容,如果未能解决你的问题,请参考以下文章

使用 ajax 调用处理新对象创建的自定义事件?

Delphi 如何创建自定义的文件类型关联

Delphi - 如何自定义 IDE 布局

如何在 TWebBrowser IDispatchEvent 中获取自定义事件参数

如何在 Delphi 2009 中对自定义组件进行鼠标平移

自定义事件