Модуль данных 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)

Другие вопросы по тегам