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

标签 delphi ide components delphi-xe2

我正在开发delphi XE2。
我需要什么:
我需要 MyFrame 类,其框架没有任何可见组件,但新事件在对象检查器中可见。此事件将通知我的表单(将在其上放置 MyFrame 对象),例如框架上的所有数据都已填满。

我拥有的:
基于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 已注册。

我的问题是什么:
问题是,它无法持续到最后。
当我选择“新建 VCL 应用程序”,并想通过选择"file"->“新建”->“其他”->“Delphi 项目”->“MyFrame”来创建 MyFrame 时,会出现如下所示的奇怪窗口。
当我选择其中的某个目录并单击“确定”按钮时,新的 Delphi 项目将关闭并打开我的包项目。

the window

如果有人可以建议我,我做错了什么,我会非常高兴。

最佳答案

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

TIDESourceModule自定义模块

关于delphi - 使用新事件创建自定义框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501481/

相关文章:

python - 如何使用 IDLE shell 打开 python 源文件?

c++ - 使用 IDE 进行开发和测试时,存储源代码的 SVN 最佳实践是什么?

javascript - 从组件数组中删除组件

javascript - Angular 如何将数据从子组件传递到父组件

c++ - 如何使我的组件实体系统线程安全?

delphi - 我应该用什么? UTF8 还是 UTF16?

multithreading - 我在哪里可以找到调试多线程 Delphi 应用程序的良好指南或教程?

Delphi 包构建/安装调试

Delphi 记录中的字符串列表

delphi - 计算文件夹内的文件夹数量