为啥由于“%CLASSGROUP TPersistent”,工具面板中可用于数据模块的组件比用于表单的组件少?

Posted

技术标签:

【中文标题】为啥由于“%CLASSGROUP TPersistent”,工具面板中可用于数据模块的组件比用于表单的组件少?【英文标题】:Why less components in tool palette available for datamodule than for form because of '%CLASSGROUP TPersistent'?为什么由于“%CLASSGROUP TPersistent”,工具面板中可用于数据模块的组件比用于表单的组件少? 【发布时间】:2014-06-09 19:33:53 【问题描述】:

我们在 Delphi XE2 中使用SQL Direct 6.4 版本(Win7,64 位,但我们只做 32 位开发)。

我正在制作一个新的测试应用,发现以下内容:

在工具面板中,当我在表单上时,有 10 个组件可用:

在工具面板中,当我在一个数据模块上时,其中只有 3 个可用

这是在一个新项目中。当我尝试将 TSDDatabase 从另一个项目复制到新项目中的数据模块时,我发现了这一点。 这告诉您我们有(几个)其他项目包含 TSDDatabase(以及其他 10 减 3 中的其他)组件在数据模块上,它们仍然可以正常构建和运行。

当我注意到以下内容时,我实际上已经在 SO 中写了另一个问题:

我尝试放置 TSDDatabase 的数据模块包含新的

%CLASSGROUP 'System.Classes.TPersistent'

而负责组件注册的源文件是这样开头的:

procedure Register;
begin
$IFDEF EVAL
  ShowReminderBox;
$ENDIF

$IFDEF SD_VCL10
    // Restrict these components to only be used with VCL components.
  GroupDescendentsWith(TSDDatabase, Controls.TControl);
  GroupDescendentsWith(TSDDataSet, Controls.TControl);
  GroupDescendentsWith(TSDSession, Controls.TControl);
  GroupDescendentsWith(TSDUpdateSQL, Controls.TControl);
$ENDIF

  RegisterComponents(srSQLDirect, [TSDSession, TSDDatabase, TSDQuery, TSDMacroQuery, TSDStoredProc, TSDTable, TSDUpdateSQL, TSDScript, TSDMonitor, TSDSQLBaseServer]);

  RegisterPropertyEditor(TypeInfo(Boolean), TSDDatabase, 'Connected', TSDDatabaseConnectedProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDDatabase, 'RemoteDatabase', TSDDatabaseProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDDatabase, 'SessionName', TSDSessionNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDDatabase, 'ParamsFileName', TSDFileNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDDataSet, 'DatabaseName', TSDDatabaseNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDDataSet, 'SessionName', TSDSessionNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDScript, 'DatabaseName', TSDDatabaseNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDScript, 'SessionName', TSDSessionNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDStoredProc, 'StoredProcName', TSDStoredProcNameProperty);
  RegisterPropertyEditor(TypeInfo(string),  TSDTable, 'TableName', TSDTableNameProperty);

当我删除 %CLASSGROUP 语句后,问题就消失了。

显然,“将后代与 Controls.TControl 与 CLASSGROUP 一起分组”是原因。

但是,尽管查看了 %CLASSGROUP pseudo-property 和 GroupDescendentsWith,我还是无法理解最后一条语句具体做了什么。

谁能更详细地解释这里发生了什么?具体来说,应该如何更改注册码(因为我们有带源的 Pro 版本,我们可以修补这个)以防止其他同事像我一样浪费时间? ;-)

(并且:10 减去 4 GroupDescendentsWith 语句得到 6,而不是 3)??

【问题讨论】:

【参考方案1】:

数据模块被设计成框架中立。这意味着,使用默认的ClassGroup,它们不能托管特定于 VCL 或 FMX 框架的组件。当您查看具有活动数据模块的调色板时删除的组件是附属于这两个框架之一的组件。在这种情况下是 VCL。

Embarcadero 文档非常清楚地解释了这一点:http://docwiki.embarcadero.com/RADStudio/en/ClassGroup_pseudo-property_of_TDataModule

GroupDescendentsWith 的用途是告诉 IDE 特定控件是特定框架的一部分。 StartClassGroup 的文档说:

流式传输系统允许将可以加载和保存的类注册到不同的组中。这允许 IDE 区分跨平台和仅限 Windows 的类。 StartClassGroup 创建一个新的类组,并将 AClass 指定的类添加到该组中。

解决此问题的最简单方法是更改​​数据模块上的 ClassGroup 伪属性。

【讨论】:

这是我参考并理解的文档的一部分。另一半,GroupDescendents 用的东西,没有。我只能在 Delphi 帮助中找到有限的描述。这也不能回答我的最后一个问题。 你为什么不准备按预期使用ClassGroup 我已经一起删除了 ClassGroup,因为我们只做 Win32。现在“解决”了它。但是我仍然写了这个问题,因为我想了解发生了什么。 我真的不明白你不明白什么。此外,FMX 在 Win32 上运行。你的意思是你只做VCL。应该在哪个类中设置类组为 VCL。 你的 10-4 算法似乎有缺陷。您需要出示所有 10 人的注册信息,以便我们检查您的计数。谁说其他3个组件注册方式类似。

以上是关于为啥由于“%CLASSGROUP TPersistent”,工具面板中可用于数据模块的组件比用于表单的组件少?的主要内容,如果未能解决你的问题,请参考以下文章

为啥控件由于其保护级别而无法访问?

为啥我的 truffle 部署由于资金不足而失败?

为啥TDengine由于Invalid table ID无法插入数据

由于调试符号,巨大的可执行文件,为啥?

由于数组下有巨大的对象,android json出错了为啥

Cassandra 错误消息:由于本地暂停,未将节点标记为关闭。为啥?