gpt4 book ai didi

delphi - 由于 '%CLASSGROUP TPersistent' ,为什么工具选项板中可用于数据模块的组件比可用于表单的组件少?

转载 作者:行者123 更新时间:2023-12-03 15:54:39 28 4
gpt4 key购买 nike

我们使用SQL Direct Delphi XE2 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和 GroupDescendentsWith 我无法理解最后一条语句的具体作用。

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

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

最佳答案

数据模块被设计为框架中立。这意味着,使用默认的 ClassGroup,它们无法托管特定于 VCL 或 FMX 框架的组件。当您查看具有事件数据模块的选项板时,删除的组件是附属于这两个框架之一的组件。在本例中为 VCL。

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

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

The streaming system allows the classes that can be loaded and saved to be registered in separate groups. This allows the IDE to distinguish between cross-platform and Windows-only classes. StartClassGroup creates a new group of classes, and adds the class specified by AClass to that group.

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

关于delphi - 由于 '%CLASSGROUP TPersistent' ,为什么工具选项板中可用于数据模块的组件比可用于表单的组件少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23270201/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com