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

Qua*_*sik 5 ide delphi components delphi-xe2

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

我有什么:
根据这篇文章和TOndrej的答案,以及Ba 提示的那个提示,对于XE2,我们需要更换

delphivclide := GetModuleHandle('delphivclide160.bpl');
Run Code Online (Sandbox Code Playgroud)

有了这个:

delphivclide := GetModuleHandle('vcldesigner160.bpl');
Run Code Online (Sandbox Code Playgroud)

我有新框架的代码:

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.
Run Code Online (Sandbox Code Playgroud)

注册单位的代码:

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.
Run Code Online (Sandbox Code Playgroud)

当我构建我的包时,我收到了我在这里的消息,所以我说,MyFrame已注册.

我的问题
什么:问题是,它最终无法发挥作用.
当我选择New VCL Application时,想要通过选择File - > New - > Other - > Delphi Projects - > MyFrame来创建MyFrame,然后在下面显示一个奇怪的窗口.
当我在那里选择一些目录并单击OK按钮时,将关闭新的Delphi项目并打开我的包项目.

窗户

如果有人可以告诉我,我做错了,我会很高兴的.

Mad*_*ist 2

A. 框架类注册

没有必要用“hacky way”来做这件事

uses
...
  DMForm,
  VCLFormContainer,
...

procedure Register;
begin
...
  RegisterCustomModule(TYourFrameClass, TFrameModule);   // for frames
  RegisterCustomModule(TYourModuleClass, TDataModuleCustomModule);   // for data modules
...
end;
Run Code Online (Sandbox Code Playgroud)

还有另一种方法可以添加框架

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

function TNestableWinControlCustomModule.Nestable: Boolean;
begin
  Result := True;
end;
Run Code Online (Sandbox Code Playgroud)

+

  RegisterCustomModule(TYourFrameClass, TNestableWinControlCustomModule);
Run Code Online (Sandbox Code Playgroud)

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

TCustomModule =>设计编辑器

TDataModuleCustomModule => DMForm (designide.dcp)

TWinControlCustomModule => WCtlForm (designide.dcp)

TFrameModule => VCLFormContainer (vcldesigner.dcp)

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

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

附言。在较旧的 Delphi 版本中, DMDesigner单元中存在 TDataModuleDesignerCustomModule 元类,而不是 TDataModuleCustomModule

聚苯硫醚。其他现有元类名称:

TCustomForm自定义模块

TIDESourceModule自定义模块