Зарегистрируйте настраиваемую форму, чтобы я мог наследовать от нее из нескольких проектов, не копируя форму в папку репозитория объектов

Я ' У меня есть настраиваемый фрейм, который мне нужно унаследовать в нескольких проектах. Этот фрейм включает в себя некоторый код и некоторые компоненты, и он находится где-то на диске в собственном каталоге проекта. Я не хочу КОПИРОВАТЬ его в папку репозитория объектов, мне это не кажется правильным: у меня будет две копии формы, одна в моем репозитории, поддерживаемом Mercurial, другая в репозитории объектов Delphi. Абсолютно не лучшая идея.

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

То, что я сделал до сих пор, проблемы, с которыми я столкнулся, решения, которые я пробовал:

  1. Я добавил свой фрейм в пакет, зарегистрировал мой фрейм, используя как RegisterClass , так и RegisterNoIcon. Проблема: Когда я захожу в какой-то другой проект и пытаюсь открыть производный фрейм для редактирования, он сообщает, что не может найти мой исходный фрейм.
  2. Чтобы решить проблему "1", я решил, что мне нужно зарегистрировать свой фрейм как пользовательский модуль. Поэтому я вызвал RegisterCustomModule (TMyFrameName, TCustomModule) . Проблема: Из «другого» проекта я открываю производный фрейм, IDE не создает компоненты в моем исходном фрейме, и IDE жалуется на отсутствие одного из «унаследованных» компонентов.
  3. Чтобы исправить "2", я подумал, что протяну IDE руку помощи, вызвав InitInheritedComponent (Self, TFrame) . Это помогло, когда я попытался открыть фрейм в ' В другом проекте все было воссоздано, и я смог увидеть кадр, как я ожидал. Проблема: , когда я сохраняю фрейм, он забывает все о унаследованных компонентах, обрабатывает каждый отдельный компонент как новый компонент, добавленный к этому конкретному фрейму. Если я загляну в сохраненный DFM, все начинается с «объекта», ничего не начинается с «унаследовано», как я ожидал.

К сожалению, я застрял на проблеме «3». Я попытался покопаться в Classes.pas, ToolsAPI, DesignIntf ​​и DesignEditors, но не нашел ничего полезного. Очевидно, атрибут «унаследованный», который я надеялся увидеть в DFM, создается TWriter, когда ему присваивается свойство «TWriter.Ancestor» перед потоковой передачей TComponent, но у меня нет возможности настроить его, среда IDE должна его установить вверх. И я могу' Спасибо!


Edit

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

Чтобы убедиться, что это работает, я решил сделать мои проекты не зависимыми от того, где они живут, и для обеспечения этого у меня есть все в нашей команде Клонировать (терминология Mercurial) или извлекать (терминология SVN) наши проекты в разных каталогах. Жестко запрограммированный путь в моей системе не подойдет для системы моего коллеги: если кто-то из нас совершит ошибку, жестко закодировав какой-либо путь в приложение, скоро он остановится у одного из нас, поэтому ошибка будет исправлена.

Это, конечно, проблема с формами и фреймами, которые являются частью некоторой библиотеки (поэтому они не находятся в каталоге нашего проекта), которые нам нужно унаследовать от! Чтобы получить поддержку IDE при работе с этими файлами, нам нужно временно добавить их в проект и не забыть удалить их после того, как мы закончим. Если мы забудем и отправим / вернем изменения, изменения будут тормозить сборку для наших коллег (потому что у них есть библиотеки, проверенные в разных местах).

Чтобы решить эту проблему, я попытался добавить эти рамки и формы в дизайн time package (пакеты загружаются в IDE с использованием полного пути, но этот путь не является частью файлов проекта, так что все в порядке). К сожалению, это не удалось, поэтому я опубликовал этот вопрос.

8
задан Cosmin Prund 18 September 2010 в 05:14
поделиться