在以前的 Delphi 版本中,我使用数据模块 ( TDataModule
) 作为保存非可视组件的地方,以避免使主窗体混乱。在 Delphi XE2 中,当我创建一个新的数据模块时,它只允许我在其中放置与数据库相关的组件(例如TADOConnection
和TDataSource
)。为什么会这样,我怎样才能将其他组件放入其中?有替代方案吗?
问问题
3336 次
2 回答
21
XE2 版本更改了数据模块。请记住,除了长期存在的 VCL 之外,XE2 还引入了一个新的组件框架 FireMonkey。一个名为的新伪属性ClassGroup
已添加到数据模块中。这控制了可以将哪些组件添加到 IDE 设计器中的数据模块。
数据模块的默认ClassGroup
值为System.Classes.TPersistent
. 这指定数据模块是框架中立的,因此既不接受 VCL 组件也不接受 FMX 组件。
在您的情况下,您可能希望接受 VCL 组件,因此您需要指定一个ClassGroup
.Vcl.Controls.TControl
阅读文档ClassGroup
中的所有内容。
System.Classes.TDataModule 及其后代类,例如 Web.HTTPApp.TWebModule,有一个名为 ClassGroup 的伪属性,它执行以下操作:
- 确定数据模块的框架亲和性。也就是说,ClassGroup 指定数据模块要么是框架中立的,要么与特定框架(即 VCL 或 FMX)一起工作。
- 在工具面板中启用特定于框架的非可视组件。您需要在 Object Inspector 中为 ClassGroup 设置特定于框架的值,以启用特定于框架的非可视组件,例如:
- TActionList 仅适用于 VCL,因此要在 Tool Palette 中启用 TActionList,您必须将 ClassGroup 设置为 VCL 设置。
- TTimer 存在于 FMX 和 VCL 中。要为正确的框架启用 TTimer,您必须将 ClassGroup 设置为 FMX 或 VCL,以匹配父应用程序的框架。(本主题后面将进一步讨论 TTimer 和 TActionList。)
于 2012-12-31T10:16:18.097 回答
11
这种(越野车)行为
unit Unit2;
interface
uses
System.SysUtils, System.Classes;
type
TDataModule2 = class(TDataModule)
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
DataModule2: TDataModule2;
implementation
{%CLASSGROUP 'System.Classes.TPersistent'}
{$R *.dfm}
end.
是线路造成的
{%CLASSGROUP 'System.Classes.TPersistent'}
要摆脱只是删除或修改该行
{.%CLASSGROUP 'System.Classes.TPersistent'}
切换到Design
View 后,您将看到所有组件,如您所愿。
(德尔福 XE2 16.0.4504.48759)
于 2012-12-31T07:52:48.420 回答