为什么工具调色板中的组件可用于数据模块而不是表单,因为%CLASSGROUP TPersistent'?

时间:2014-04-24 13:22:02

标签: delphi components delphi-xe2

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

我正在制作一个新的测试应用程序并找到以下内容:

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

enter image description here

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

enter image description here

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

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

我尝试放置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和GroupDescendents,我仍然无法理解最后一个语句的具体内容。

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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

  

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

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