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 元类而不是 TDataModuleCustomModulePPS. 其他现有元类名称:
TCustomFormCustomModule
TIDESourceModuleCustomModule
【讨论】:
我正在 Delphi XE7 上进行测试,但它显示“找不到文件 VCLFormContainer.dcu”。 (DesignIDE
在requires
子句中)。缺少什么?
@ExDev 你是对的 - 我已经更正了我的帖子 将 vcldesigner 添加到框架所需的模块中
我已经检查了 designide.dcp / fmxdesigner.dcp / vcldesigner.dcp 仍然存在于 Delphi 10.2 Tokio ;)以上是关于delphi - 使用新事件创建自定义框架的主要内容,如果未能解决你的问题,请参考以下文章