|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
21.12.2009, 08:49 | #1 |
Форумчанин
Регистрация: 01.09.2009
Сообщений: 151
|
Перенос формы из dll-ки в программу
Здравствуйте.
Есть задача: разработать и реализовать программу, таким образом, что бы была возможность её расширения и модернизации без перекомпилирования основного каркаса. Так же должна присутствовать возможность постоянного (возможно автоматического) обновления данного приложения. Это то, чего хочется добиться в итоге. Решение: Создаём единственную форму с базовым компонентом, поддерживающим вкладки (напр. TPageControl и TTabSheet-ы). На вкладки загружаем формы из dll-библиотек по имени класса требуемой формы (напр. main.dll содержит классы форм TfrmDataView, TfrmDataManagment, TfrmUsers, TfrmClients и т.д.). Далее грузим из указанной dll-ки нужные классы на отдельные вкладки. Получается программа, которая выглядит как любой современный браузер, только вместо веб-страниц на вкладках отображены формы. Проблема: проблема состоит в том, что при добавлении новой формы в dll-ку её необходимо заменить у конечного пользователя (коих может быть несколько десятков), при этом ВЕСЬМА ЖЕЛАТЕЛЬНО (читай: ЖИЗНЕННО НЕОБХОДИМО что бы эти обновления не требовали прерывания рабочего процесса (не надо было бы перезагружать программу или закрывать все вкладки). Итак - суть проблемы в том, что до тех пор пока активна хотя бы одна форма созданная из библиотеки, эту библиотеку нельзя обновить. То есть, я делаю следующее: 1. загружаю dll (LoadLibrary) 2. Инициализирую её, передавая туда ссылку на Application 3. Создаю нужный мне класс по имени и помещаю его на вкладку 4. ... работа пользователя с формой на вкладке ... 5. Закрываю вкладку и освобождаю класс формы. 6. Деинициализирую библиотеку. 7. Выгружаю библиотеку (FreeLibrary) И при всём при этом, я не могу полностью скопировать нужную мне форму в программу, т.к. класс этой формы зарегистрирован внури библиотеки, и после её деинициализации информация об этом классе теряется. Если у кого-нибудь будут мысли, как полностью извлечь класс формы из библиотеки и следать его независимым от этой самой библиотеки; или каким образом спроектировать расширяемую систему с заданными условиями - поделитесь пожалуйста. P.S. извините за "многобуков", но этого требует нетривиальность проблеммы. |
21.12.2009, 21:34 | #2 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,527
|
registerclass(TformDll); в exports LoadMyDll
unregisterclass(Tformdll); в exports FreeMyDll и вызов этих функций при загрузке/выгрузке DLL
программа — запись алгоритма на языке понятном транслятору
|
22.12.2009, 06:38 | #3 |
Форумчанин
Регистрация: 01.09.2009
Сообщений: 151
|
Уважаемый evg_m, если я всё правильно понял, то Вы советуете вынести регистрацию классов в отдельные функции. Это не поможет решить указанную проблему. Сейчас регистрация классов происходит на шаге №2 (см. "Проблема:"), а разрегистрация на шаге №7.
Итак, ещё раз суть проблемы: мне необходимо выгрузить библиотеку (что бы её можно было бы заменить/обновить), но при выгрузке приходится отменять регистрацию классов форм, соответственно, прекращается возможность работы с загруженной из dll-ки формы. То есть, как правильно (или хотя бы как-нибудь) сделать так, что бы после выгрузки библиотеки была возможность работы с загруженной оттуда формой? На всякий случай приведу кусок кода, где вызывается форма: Код:
Последний раз редактировалось Greek9000; 22.12.2009 в 07:09. |
22.12.2009, 13:49 | #4 | |
Регистрация: 22.12.2009
Сообщений: 4
|
Цитата:
Все вышеприведенное является злостным ИМХО. |
|
22.12.2009, 18:19 | #5 |
Форумчанин
Регистрация: 01.09.2009
Сообщений: 151
|
Тут больше вопрос в постановке задачи.
После усиленного поиска решения возникшей проблемы решено смягчить требования. Теперь пользователю, что бы обновить части приложения необходимо "перелогиниться". Тут проблем никаких. Деинициализируем, выгружаем, загружаем, инициализируем. Но это доставило мне, как разработчику, массу дополнительной головной боли - решаемой но очень нудной. Т.о. проблема обновления dll в то время, пока загруженные из неё формы активны остаётся актуальной. В то же время эта проблема является центральной в деле разработки расширяемых приложенй (один раз написанный каркас с возможностью добавления новых компонентов "на лету" и изменения существующих). Так что если у кого-то есть мысли, как этого добиться не выходя за рамки Delphi, поделитесь - будтье добры! |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Обращение из формы в dll к элементу главной формы (delphi) | a_n_n_a | Помощь студентам | 3 | 10.05.2009 04:00 |
Перенос данных с формы на лист | Lyubov1990 | Microsoft Office Excel | 2 | 07.04.2009 15:08 |
DLL b свойства формы ??? | spamer | Общие вопросы Delphi | 10 | 09.02.2009 21:01 |
DLL и формы | Andrei Isaev | Компоненты Delphi | 1 | 18.11.2008 18:25 |
Работа из dll формы | mauar | Общие вопросы Delphi | 3 | 05.05.2008 11:40 |