Модуль данных Delphi XE2 ожидает только компоненты базы данных?
В предыдущих версиях Delphi я использовал модуль данных (TDataModule
) как место для хранения невизуальных компонентов, чтобы не загромождать основную форму. В Delphi XE2, когда я создаю новый модуль данных, он позволяет мне размещать в нем только компоненты, связанные с базой данных (например, TADOConnection
а также TDataSource
). Почему это так и как я могу добавить в него другие компоненты? Есть ли альтернатива?
2 ответа
Модули данных изменены с выпуском 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 более подробно обсуждаются позже в этой теме.)
Это (глючное) поведение в
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
Просмотр вы увидите все компоненты, как вы ожидаете.
(Delphi XE2 16.0.4504.48759)