Delphi XE2 数据模块只需要数据库组件?
Posted
技术标签:
【中文标题】Delphi XE2 数据模块只需要数据库组件?【英文标题】:Delphi XE2 Data Module expects only database components? 【发布时间】:2012-12-15 08:32:42 【问题描述】:在以前的 Delphi 版本中,我使用数据模块 (TDataModule
) 作为保留非可视组件的地方,以避免使主窗体混乱。在Delphi XE2中,当我创建一个新的数据模块时,它只允许我在其中放置数据库相关的组件(例如TADOConnection
和TDataSource
)。为什么会这样,我怎样才能将其他组件放入其中?有其他选择吗?
【问题讨论】:
你能举一个它不允许的非可视组件(最好是 Delphi 提供的组件)的例子吗?我从来没有见过这个问题。 像TImageList
或TMainMenu
或TActionManager
- 当我尝试粘贴一个时,它说找不到组件类,并且调色板只显示与数据库相关的组件。
会不会是我的 RAD Studio 特定版本?但后来我有了 Enterprise,应该什么都有。
我可以用File->New->VCL Forms Application
确认这一点,然后用File->New->Other->Delphi Files->Datamodule
确认,这样组件面板中只剩下数据库、Intraweb、FastReports 和 Indy 组件可用。 (TImageList 和 TActionList 不存在。)使用 Pro SKU,所以这不是导致问题的原因。
@Ken 实际上它在 XE2 中并没有被破坏。 XE3 没有解决任何问题。 XE3 所做的是将操作从 VCL 移到较低级别,以便对所有框架都可用。
【参考方案1】:
XE2 版本更改了数据模块。请记住,除了长期存在的 VCL 之外,XE2 还引入了一个新的组件框架 FireMonkey。一个名为ClassGroup
的新伪属性已添加到数据模块中。这控制了可以将哪些组件添加到 IDE 设计器中的数据模块。
数据模块的默认ClassGroup
是System.Classes.TPersistent
。这指定数据模块是框架中立的,因此既不接受 VCL 组件也不接受 FMX 组件。
在您的情况下,您可能希望接受 VCL 组件,因此您需要指定 ClassGroup
或 Vcl.Controls.TControl
。
在documentation 中阅读有关ClassGroup
的所有信息。
System.Classes.TDataModule 及其后代类,例如 Web.HTTPApp.TWebModule,有一个名为 ClassGroup 的伪属性 执行以下操作:
确定数据模块的框架亲和性。也就是说,ClassGroup 指定数据模块是框架中立的 或使用特定框架(即 VCL 或 FMX)。 在工具面板中启用特定于框架的非可视组件。您需要在中为 ClassGroup 设置一个特定于框架的值 对象检查器以启用特定于框架的非可视化 组件,例如: TActionList 仅适用于 VCL,因此要在 Tool Palette 中启用 TActionList,您必须将 ClassGroup 设置为 VCL 设置。 TTimer 存在于 FMX 和 VCL 中。要为正确的框架启用 TTimer,您必须将 ClassGroup 设置为 FMX 或 VCL,以 匹配父应用程序的框架。 (TTimer 和 TActionList 本主题稍后将进一步讨论。)
【讨论】:
【参考方案2】:这种(错误的)行为在
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
查看后,你会看到所有组件如你所愿。
(德尔福 XE2 16.0.4504.48759)
【讨论】:
完美!我知道它必须像往常一样简单。 PS - 困难的部分是弄清楚如何创建数据模块,使其可以在整个应用程序中使用通用组件 - 我最终尝试创建/销毁它..最后项目主文件dpr
中的块,包装表单创建和Run
。
另见***.com/questions/11250019/…
我们在从 D2007 迁移到 XE2(TImageList、TcxSchedulerStorage 等)的应用程序中没有问题,但是当我们添加另一个数据模块时很高兴知道这一点。
您可以在 Object Inspector 中执行此操作:选择数据模块并相应地设置其 ClassGroup 属性。然后关闭并重新打开 damodule 单元。以上是关于Delphi XE2 数据模块只需要数据库组件?的主要内容,如果未能解决你的问题,请参考以下文章
Delphi - 需要 XE2 代码到 Delphi7。使用wininet下载文件
Delphi XE2 使用dbExpress连接MySQL数据库