我正在开发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 项目将关闭并打开我的包项目。
如果有人可以建议我,我做错了什么,我会非常高兴。
最佳答案
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/