Добавление форм и фреймов в пакеты

Я разрабатываю пакет компонентов, зарегистрированных в IDE, большинство из которых являются производными от базового класса TFrame. Существуют также различные настраиваемые диалоговые формы, которые вызываются этими компонентами, включенными в пакет. Я работаю в Delphi 2007.

Я заметил, что иногда блоки кадра и формы, которые обычно имеют связанный файл DFM, не всегда показывают файл DFM «внизу» (доступный через небольшой расширитель узла [+] treeview) под ними. Если я добавлю существующий файл PAS на основе формы, например, щелкнув правой кнопкой мыши проект BPL (в Диспетчере проектов) -> Добавить, он не отобразит файл DFM в списке.

Однако, если я добавляю новый и создаю новую форму или фрейм в проекте, он отображается как типичный вложенный двухфайловый элемент в Диспетчере проектов. Это также показывает, что я перетаскиваю существующую форму из другого проекта в группе проектов в этот рассматриваемый проект BPL.

Похоже, это должно быть согласовано, и я предпочитаю, чтобы оба файла показывали, когда единицей является рамка или форма.

Это указывает на то, что в файле проекта что-то не так? Я неправильно добавляю существующие формы / фреймы в этот пакет? Если да, как мне добавить существующие блоки формы / фрейма, чтобы оба файла отображались в списке Project Manager?

* ОБНОВИТЬ *

Из предложения Ален ниже:

Я попытался добавить директиву {$ R * .dfm} в модуль формы, и это не заставило DFM-файл отображаться при добавлении его в мой пакет / проект BPL. Добавление {$ R * .dfm} в сам файл проекта (я не думаю, что вы имели в виду, но я подумал, что попробую) тоже не сработало. Этот метод работает только с EXE-проектами?

Возможно (вероятно) связано, попытка построить с этой директивой местами дает мне следующее:

[Ошибка DCC] E2161 Предупреждение. Повторяющийся ресурс: тип 10 (RCDATA), ID TTESTTREEVIEW; Сохранен ресурс файла E: \ Projects \ MyApp \ Components \ TTestTreeViewFrame.dfm; Файл E: \ Projects \ MyApp \ Components \ TTestTreeViewFrame.dfm удален.

"Хранить" и "отбрасывать" один и тот же файл ??


Позже: Похоже, проблема с "дублированием ресурса" МОЖЕТ быть связана с этим . Не уверен, но по крайней мере в одном случае оба произошли одновременно.

Ответов (3)

Решение

Vegar на правильном пути. Чтобы менеджер проекта отображал узел .dfm, он должен знать, что модуль form / frame / datamodule связан с файлом pas. Для получения этой информации он просматривает комментарий {Form1} в файле .dpk или .dpr. Если при добавлении файла в проект среда IDE не распознает, что с ним связан .dfm, убедитесь, что в файле .pas есть директива {$ R * .dfm} в открытом виде. Таким образом, я не должен быть похоронен в IFDEF или иным образом закрыт потенциальными синтаксическими ошибками в файле. IDE использует наличие этой директивы, чтобы решить, следует ли пытаться открыть .dfm в дизайнере.

IDE не просто считает само собой разумеющимся, что если есть Unit1.pas и Unit1.dfm, то они действительно должны быть вместе. Учтите, что вы создали новую единицу формы и назвали ее Unit1. Теперь вы удалили только Unit1.pas, а затем просто создали новый модуль, которому будет присвоено имя Unit1.pas. На диске нет ссылки на старый, устаревший Unit1.dfm из этого нового, с таким же базовым именем, Unit1.pas. Было бы странно и запутанно, если бы IDE просто слепо открывала этот .dfm.

Если вы посмотрите на исходный код проекта для пакета, вы найдете разницу в разделе Contains:

contains
  Unit2 in 'unit2.pas',
  Unit1 in 'Unit1.pas' {Form1};

Unit2 будет отображаться как единый блок, а unit1 - как блок с формой. Как видите, у unit1 есть комментарий {Form1}, которого нет у unit2.

Я не знаю, можно ли добавить существующий модуль, чтобы этот комментарий создавался автоматически.

Еще одна причина для всех, кто ищет другое решение, - это когда вы переименовываете файл pas, закройте все файлы и снова откройте. Предыдущая версия откроется снова и должна быть удалена с ранее названным добавленным в проект.