![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Пакет с собственными формами (наследование + IDE)
alextorin © (2006-11-12 10:48:00)Не раз затрагивалась в том или ином виде тема наследования форм.... Но мой вопрос о наследовании формы из bpl с определенными условиями - форма не обычный компонент, но вот что нужно...
Создал проект с подгрузкой пакетов в рантайме. Собственно сам проект только и предназначен для инициализации и запуска приложения, а также подгрузки и выгрузки нужных пакетов (bpl) со своими формами и функционалом...
Так вот идея в следующем:
1) один пакет (bpl) с определенными формами (все наследники от TForm) - это базовые формы - смысл этого пакета - содержать в себе эти "базовые" формы, от которых потом будут наследоваться формы в других пакетах (проектах);
2) все остальные отдельно взятые bpl - цельная и законченная задача (например, справочник материалов) и формы в них наследуются от "базовых" форм;
3) наследование любой из "базовых" форм в новом пакете интересует на этапе дизайна, при этом сама "базовая" форма не должна добавляться в этот новый пакет;
4) пакет с "базовыми" формами при создании новых пакетов (проектов) не должен располагать *.pas файлами.
Если кто знает как добиться выполнения п. 3 и 4 подскажите пожалуйста.
Если идея не совсем ясна - жду вопросов.
Юрий Зотов (2006-11-22 11:42:00) [1]> DrPass © (22.11.06 10:18) [36]
В этом вся и фишка. Без компонентов и с формой проблем не было.
DrPass (2006-11-22 10:18:00) [2]Нет, компонент на нем не было. Только несколько новых свойств и методов. Впрочем, будет время - попробую. Действительно интересно
Юрий Зотов (2006-11-22 01:09:00) [3]С формой - было, с DataModule - не знаю, не пробовал.
А базовый DataModule нес компоненты?
DrPass (2006-11-21 23:51:00) [4]
> не жил этот зксперт вместе
> с RegisterCustomModule. Либо-либо, а вместе - никак, на
> унаследованной форме исчезали компоненты. Более того - не
> получалось даже и само наследование: несмотря на то, что
> эксперт создавал DFM где черным по белому было прописано
> inherited, среда упрямо его игнорировала и писала собственный
> DFM, без компонентов и с object вместо inherited (естественно,
> поэтому и поднималась пустая форма).
Кстати, Юрий, а эта проблема наблюдалась именно с формой? Потому как у меня на Delphi6 в принципе нормально работает эксперт, создающий модуль с потомком хм... потомка TDataModule (каламбурчик получился). При этом базовый класс содержал новые свойства и таки да, для него я вызывал RegisterCustomModule
Юрий Зотов (2006-11-21 01:38:00) [5]> alextorin © (20.11.06 23:37) [32]
> В рантайм пакет запихиваем базовую форму... В дизайн пакете
> регистрируем ее через RegisterCustomModule...
Если в нее добавлены свойства/события. Если нет - регистрация не требуется. Но в любом случае пакет с базовой формой должен быть загружен в IDE - либо сам по себе (как пакет двойного назначения), либо через другой design-time пакет.
> Затем создаем от нее наследника ,помещаем на него компоненты (если
> таковые необходимы) и пихаем его в репозиторий, а затем наследуем от
> последнего "рабочие" формы...
Так было сделано в моем варианте (почему - скажу ниже), но он не единственный. Компоненты могут лежать и не на промежуточном наследнике, а непосредственно на базовой форме (если я правильно понял, это и есть то, что Вам нужно, поэтому подробнее - тоже ниже).
> При этом и "промежуточный наследник" и наследники от него будут
> добавляться в новый проект...
Если промежуточный наследник не лежит в пакете, то ведь должен он где-то компилироваться? Должен. Поэтому он должен быть (и будет) добавлен в проект (как оно и было в моем варианте). Но если он лежит в пакете, то его машинный код уже и так имеется, поэтому в проекте он не нужен. И в репозитории он тоже не будет нужен - но тогда, очевидно, для его создания в design-time придется писать эксперт.
Теперь - почему в качестве иллюстрации я привел вариант с промежуточным наследником? Просто потому, что он был под рукой, когда-то давно уже написанный. И для иллюстрации совместной работы RegisterCustomModule и репозитория этот пример вполне подходит.
Теперь о главном - как бы я решал Вашу задачу.
1. В run-time пакете создал базовую форму со всеми нужными компонентами и кодом.
2. Создал design-time пакет, в который входят RegisterCustomModule (если требуется) и (самое главное!) эксперт IDE, позволяющий создавать в новом проекте потомка этой базовой формы.
Вот с этой самой задачей (написание такого эксперта) года три назад я и бился насмерть, аж пару месяцев - потому что не жил этот зксперт вместе с RegisterCustomModule. Либо-либо, а вместе - никак, на унаследованной форме исчезали компоненты. Более того - не получалось даже и само наследование: несмотря на то, что эксперт создавал DFM где черным по белому было прописано inherited, среда упрямо его игнорировала и писала собственный DFM, без компонентов и с object вместо inherited (естественно, поэтому и поднималась пустая форма).
Как уже говорилось, тогда проблема эта так и не была решена - и даже корифеи BDN во главе с Эриком Берри ничего реального посоветовать не смогли. По всей видимости, это был баг (или фича?) самой IDE, потому что позднее (в семерке с UpdatePack 2) эту задачу решить все же удалось (и даже без особых усилий, потому что тот же самый когда-то написанный эксперт вдруг нормально заработал).
Отсюда выводы:
а). нужна версия не ниже семерки с UpdatePack 2.
б). действуем по вышеизложенным п.п. 1 и 2.
alextorin (2006-11-20 23:37:00) [6]Так как модератор многое вырезал (было много лишнего сказано) - повторюсь немного...
Может я и не правильно понял Юрия, но понял я примерно следующее...
В рантайм пакет запихиваем базовую форму... В дизайн пакете регистрируем ее через RegisterCustomModule... Затем создаем от нее наследника ,помещаем на него компоненты (если таковые необходимы) и пихаем его в репозиторий, а затем наследуем от последнего "рабочие" формы... При этом и "промежуточный наследник" и наследники от него будут добавляться в новый проект...
Если я не правильно понял - поправте меня...
А если все так, то:
Мне не нужно создавать "промежуточного наследника" и пихать в него компоненты - компоненты затрагиваются в реализации функционала в "базовой" форме - потому в ней и должны находиться... Тем более, что "промежуточный наследник" в самом проекте - тот еще вариант...
Уважаемый Юрий - если я не правильно понял, что-то из Вашего совета - прошу меня поправить, а если правильно, то такой вариант мне не подходит - спасибо.
(2006-11-20 08:14:00) [7]Удалено модератором
(2006-11-18 17:45:00) [8]Удалено модератором
(2006-11-15 10:40:00) [9]Удалено модератором
(2006-11-15 01:00:00) [10]Удалено модератором
(2006-11-15 00:58:00) [11]Удалено модератором
(2006-11-15 00:56:00) [12]Удалено модератором
(2006-11-15 00:46:00) [13]Удалено модератором
(2006-11-14 23:32:00) [14]Удалено модератором
(2006-11-14 20:41:00) [15]Удалено модератором
Юрий Зотов (2006-11-14 07:39:00) [16]F1: Object Repository dialog box.
Add Page button
To add a new blank page, click the Add Page button. The Add Page dialog box appears. Type the name of the page you want to add and click OK.
atruhin (2006-11-14 06:00:00) [17]> базовые формы помещаются в репозиторий (например, на отдельную
> страницу).
Тоже заинтересовался вашей дискуссией, как поместить форму на отдельную страницу?
Намекните.
(2006-11-14 03:59:00) [18]Удалено модератором
(2006-11-14 03:09:00) [19]Удалено модератором
alextorin (2006-11-14 01:45:00) [20]Вобщем свел все к п.4 изначально поставленного вопроса.
п.3 пока не важен
- он важен только если я добавляю форму (наследую от "базовой") в проект без подгрузки пакетов в рантайме.