В предыдущих версиях Delphi я использовал модуль данных (TDataModule
) в качестве места для хранения невизуальных компонентов, чтобы избежать загромождения основной формы. В Delphi XE2, когда я создаю новый модуль данных, он позволяет мне размещать в нем компоненты, связанные с базой данных (например, TADOConnection
и TDataSource
). Почему это и как я могу поместить в него другие компоненты? Есть ли альтернатива?
Модуль данных Delphi XE2 ожидает только компонентов базы данных?
Ответ 1
Модули данных изменены с выпуском XE2. Помните, что XE2 представила новую компоненту FireMonkey в дополнение к давнему VCL. В модули данных добавлено новое псевдо-свойство с именем ClassGroup
. Это определяет, какие компоненты могут быть добавлены в модуль данных в дизайнере IDE.
По умолчанию ClassGroup
для модуля данных System.Classes.TPersistent
. Это указывает, что модуль данных нейтрален каркасом и поэтому не принимает ни компонентов VCL, ни компонентов FMX.
В вашем случае вы, вероятно, хотите принять компоненты VCL, поэтому вам нужно указать ClassGroup
Vcl.Controls.TControl
.
Читайте все о ClassGroup
в документации .
System.Classes.TDataModule и его классы-потомки, такие как Web.HTTPApp.TWebModule, имеют псевдо-свойство с именем ClassGroup, которое делает следующее:
- Определяет сродство к модулю данных. То есть ClassGroup указывает, что модуль данных является либо нейтральным, либо нейтральным или должен работать с определенной структурой (а именно VCL или FMX).
- Включает не зависящие от структуры компоненты в палитре инструментов. Вы должны установить значение, специфичное для платформы для ClassGroup, в Инспектор объектов, чтобы включить нестандартный такие компоненты, как:
- TActionList - только VCL, и поэтому для включения 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
View вы увидите все компоненты, как вы ожидаете.
(Delphi XE2 16.0.4504.48759)