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

时间:2014-12-16 09:36:56

标签: delphi ide components delphi-xe2

我正在研究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 - &gt;创建MyFrame;新 - &gt;其他 - &gt;德尔福项目 - &gt; MyFrame然后在下面显示了奇怪的窗口 当我在那里选择一些目录并单击OK按钮时,将关闭新的Delphi项目并打开我的包项目。

the window

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

1 个答案:

答案 0 :(得分:2)

:一种。框架类注册

没有必要采用&#34; hacky方式&#34;

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 =&gt;的 DesignEditors

TDataModuleCustomModule =&gt; DMForm (designide.dcp)

TWinControlCustomModule =&gt; WCtlForm (designide.dcp)

TFrameModule =&gt; VCLFormContainer (vcldesigner.dcp)

我认为对于 FireMonkey ,它应该可以类似的方式(找到 fmxdesigner.dcp &amp;检查Notepad ++中的内容)

<强> B中。在内部使用它&#34;新...&#34;向导您需要注册向导类。 如果您没有时间编写向导类,只需创建新框架,然后手动替换父类名称​​ 并将适当的单位添加到&#34;使用&#34;名单。那就是

PS。在较旧的Delphi版本中,单位 DMDesigner

中有TDataModuleDesignerCustomModule元类而不是TDataModuleCustomModule

PPS。其他现有的元类名称:

TCustomFormCustomModule

TIDESourceModuleCustomModule