Delphi XE2 数据模块只需要数据库组件?

Posted

技术标签:

【中文标题】Delphi XE2 数据模块只需要数据库组件?【英文标题】:Delphi XE2 Data Module expects only database components? 【发布时间】:2012-12-15 08:32:42 【问题描述】:

在以前的 Delphi 版本中,我使用数据模块 (TDataModule) 作为保留非可视组件的地方,以避免使主窗体混乱。在Delphi XE2中,当我创建一个新的数据模块时,它只允许我在其中放置数据库相关的组件(例如TADOConnectionTDataSource)。为什么会这样,我怎样才能将其他组件放入其中?有其他选择吗?

【问题讨论】:

你能举一个它不允许的非可视组件(最好是 Delphi 提供的组件)的例子吗?我从来没有见过这个问题。 TImageListTMainMenuTActionManager - 当我尝试粘贴一个时,它说找不到组件类,并且调色板只显示与数据库相关的组件。 会不会是我的 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 设计器中的数据模块。

数据模块的默认ClassGroupSystem.Classes.TPersistent。这指定数据模块是框架中立的,因此既不接受 VCL 组件也不接受 FMX 组件。

在您的情况下,您可能希望接受 VCL 组件,因此您需要指定 ClassGroupVcl.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覆盖WSDL中的服务名称?

Delphi - 需要 XE2 代码到 Delphi7。使用wininet下载文件

Delphi 中要避免的组件

Delphi XE2 使用dbExpress连接MySQL数据库

看看 Delphi XE2 为 VCL 提供的 14 种样式

XSD 包含导入的 xsd 时的 Delphi XE2 XML 数据绑定向导错误