Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Пакет с собственными формами (наследование + IDE)


Страницы:   1 2

alextorin ©   (2006-11-12 10:48:00) 

Не раз затрагивалась в том или ином виде тема наследования форм.... Но мой вопрос о наследовании формы из bpl с определенными условиями - форма не обычный компонент, но вот что нужно...

Создал проект с подгрузкой пакетов в рантайме. Собственно сам проект только и предназначен для инициализации и запуска приложения, а также подгрузки и выгрузки нужных пакетов (bpl) со своими формами и функционалом...
Так вот идея в следующем:
1) один пакет (bpl) с определенными формами (все наследники от TForm) - это базовые формы - смысл этого пакета - содержать в себе эти "базовые" формы, от которых потом будут наследоваться формы в других пакетах (проектах);
2) все остальные отдельно взятые bpl - цельная и законченная задача (например, справочник материалов) и формы в них наследуются от "базовых" форм;
3) наследование любой из "базовых" форм в новом пакете интересует на этапе дизайна, при этом сама "базовая" форма не должна добавляться в этот новый пакет;
4) пакет с "базовыми" формами при создании новых пакетов (проектов) не должен располагать *.pas файлами.

Если кто знает как добиться выполнения п. 3 и 4 подскажите пожалуйста.
Если идея не совсем ясна - жду вопросов.


alextorin   (2006-11-14 01:44:00) [21]

Хочу все же уточнить суть проблемы...
Если провести тест подобным образом, то можно наткнуться на мои грабли...
Сам тест (это просто тест поэтому за примитивизм прошу прощения):

1. Создал run-time пакет pTest с единственной формой TestForm и добавил ее в репозиторий. Откомпилил - все ок...
2. Создал dessign-time пакет pTestDessign, включил в него пакет pTest. Добавил модуль mTest - в нем я зарегистрировал форму как RegisterCustomModule(TTestForm, TCustomModule).
откомпилил, проинсталил - все ок.
3. Создал новый run-time пакет pPac1, включил в него пакет pTest, добавил форму из репозитория (наследовал от TestForm) TestForm1 - при этом в проект пакета добавилась и форма предок TestForm, но при компиляции она удалилась, т.к. ранее был добавлен requires pTest - вобщем все ок - как и задумано в Делфи... откомпилил, сохранил, закрыл - все ок...
4. Удалил (убрал в др. место) mTestForm.pas (это pas формы TestForm) - остались только dfm и dcu.
5. Открываю проект пакета pPac1 - все ок. TestForm1 открылась без ошибок... Закрыл проект.
6. А вот теперь заковыка - я пытаюсь в новый пакет или в открытый старый добавить из репозитория форму (наследовать от TestForm) - получается ошибка: Unable to find both a form (D:\Project\Temp\mTestForm.dfm) and source source file (D:\Project\Temp\mTestForm.pas). - это из-за того, что я скрыл mTestForm.pas

Подскажите как эту ошибку обойти.
Изначально мой вопрос был обширным - свел все к конкретной задаче...


  (2006-11-14 01:42:00) [22]

Удалено модератором


Юрий Зотов   (2006-11-14 01:07:00) [23]

> 2. Из Вашего скриншота видно, что рядом стоит предок и наследник -
> допустим...


LOL. Я их в фотошопе нарисовал? а Delphi и не запускал даже?
"Вы не в церкви, Вас не обманут".
(с) Ося Бендер.

> Вопрос - предок тоже добавляется в Project1 при создании новой
> формы, наследованной от него...


Написан базовый класс формы (в который и введено новое свойство), сидит этот класс в пакете. Еще написан эксперт IDE, позволяющий создавать наследников этого класса. Первый наследник - это тот, который на экране слева, он сидит в репозитории и несет на себе компоненты. А тот, который на экране справа - это наследник наследника. Обе эти рабочие формы добавлены в проект (иначе где же они будут компилиться?), а вот сама базовая форма в проект не входит, она так и сидит в своем пакете.

Но у Вас задача проще, и вот почему:
> 1. Меня не интересует как сделать паблишед свойства видимыми в
> инспекторе


Если так, то вообще никаких проблем.

> 3) наследование любой из "базовых" форм в новом пакете интересует
> на этапе дизайна, при этом сама "базовая" форма не должна добавляться
> в этот новый пакет;


Во-первых, совершенно очевидно, что для этого базовый пакет должен быть:
а). инсталлирован  в IDE;
б). прописан в requires рабочего пакета.

Это строго обязательно. А далее - есть два способа создания наследника.

Первый способ простой, но не очень удобный - базовые формы помещаются в репозиторий (например, на отдельную страницу). Тогда формы в рабочем пакете наследуются от базовых обычным способом, но IDE (по крайней мере, семерка) добавит базовые формы в рабочий пакет и не даcт их оттуда удалить. Нужно удалить их ручками, прямо в тексте секции contains в dpk, а потом сохранить и переоткрыть пакет. После этого все уже станет OK.

Второй способ намного сложнее, но зато удобнее для юзера - к базовому пакету добавляется еще один design-time пакет, в котором сидит эксперт IDE (должен реализовывать интерфейсы IOTAWIzard, IOTARepositoryWizard,
IOTARepositoryWizard60, IOTAFormWizard) - вот он-то все и рулит. Тогда базовые формы помещать в репозиторий не потребуется, не будут они появляться и в рабочем пакете. Как написать такой эксперт - это песня долгая и отдельная (и, честно говоря, проще его написать, чем объяснить, как это делается).

> 4) пакет с "базовыми" формами при создании новых пакетов (проектов)
> не должен располагать *.pas файлами.


Для создания рабочего пакета достаточно инсталлировать базовый пакет в IDE. То есть, надо иметь bpl, dcp и dcu базового пакета и всех его юнитов.

PS
> это немного не мой уровень - прошел года 2 назад...
Не знаю, кто, когда и куда прошел, но для дизайнтаймщика эта задачка - практически детская (если не писать эксперт). А уж сообразить про инсталляцию базового пакета, секцию required рабочих пакетов и репозиторий... это любой component writer просто обязан был сделать. А также component writer обязан знать, что нужно для работы с пакетом без его исходников. Так что подобные "апломбированные" заявления... ну, Вы поняли, да? Ни к чему они. Уровень - он и так виден, без слов.

PPS
И теперь, если проанализировать решение с репозиторием, то неожиданно выяснится... что ответ был дан в первом же посте. Том самом, который Вы обозвали флудом.
:о)


alextorin   (2006-11-13 12:15:00) [24]

Теперь по теме:
1. Меня не интересует как сделать паблишед свойства видимыми в инспекторе... У меня для некоторых "базовых" форм такая задача вообще не стоит... И как компоненты сделать видимыми в наследниках - этот вопрос тоже я не затрагивал...
2. Из Вашего скриншота видно, что рядом стоит предок и наследник - допустим... Вопрос - предок тоже добавляется в Project1 при создании новой формы, наследованной от него... Если нет, то жду ваших коментариев...
Если да, то:
1) попробуйте убрать предка из проекта;
2) сохраните и закройте проект;
3) откройте проект - разве Делфи ничего не хочет при этом и нормально открывает наследника в дизайнере (и dfm тоже)...
Вот это и есть то, что не получается у меня...


  (2006-11-13 11:41:00) [25]

Удалено модератором


  (2006-11-13 01:57:00) [26]

Удалено модератором


  (2006-11-13 01:41:00) [27]

Удалено модератором


  (2006-11-13 00:55:00) [28]

Удалено модератором


  (2006-11-13 00:47:00) [29]

Удалено модератором


  (2006-11-12 16:36:00) [30]

Удалено модератором


  (2006-11-12 16:30:00) [31]

Удалено модератором


  (2006-11-12 16:20:00) [32]

Удалено модератором


  (2006-11-12 16:18:00) [33]

Удалено модератором


  (2006-11-12 16:14:00) [34]

Удалено модератором


  (2006-11-12 16:03:00) [35]

Удалено модератором


  (2006-11-12 14:20:00) [36]

Удалено модератором


Юрий Зотов   (2006-11-12 11:16:00) [37]

Если базовые формы не имеют новых свойств или событий, то достаточно просто поместить их в репозиторий (правый клик по форме).

Если имеют, то: http://delphimaster.ru/cgi-bin/forum.pl?id=1154350531&n=12


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо