![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Форма и ДЛЛ [D7, WinXP]
Fenix © (2006-03-08 15:14:00)Доброго времени суток.
Меня интересует такой вопрос, можно ли запихнуть форму, с всеми ее компонентами и процедурами в *.DLL. И потом уже в программу по мере надобности подгружать длл, а не форму ?
У меня просто будет очень много форм, и загружать их все статически не очень хочеться...
Sergey Masloff (2006-03-09 22:47:00) [1]Я когда-то делал так:
Проект был большой (форм намно-о-го больше сотни, все они были универсальными если бы все сделаны как отдельные - ну несколько тысяч было бы).
Работало это все так:
1) При запуске пользователь запускал не программу а микрозагрузчик который соединялся с сервером и проверял не обновилась ли версия главного модуля. Если да то скачивал новую версию и запускал ее если нет то запускал имеющуюся.
2) Основной модуль коннектился к БД и идентифицировав пользователя на основе его личности и ролей строил динамически главное меню и тулбар. При этом также строился список bpl которые нужны для соответствующего функционала.
3) bpl по списку проверялись на серваке не обновилась ли версия и закачивались если нужно.
4) Пользователь получал отмашку на начало работы (или сообщение о проблемах если что-то вышеприведенное не срабатывало).
А смысл был в том чтобы разнести по модулям разный функционал - понятно что рабочее место бухгалтера отличается даже от места главбуха не говоря о администраторе защиты или операторе на складе или ответственного за БСО или сотрудника юр. отдела.
Так как модули достаточно автономны ими могли заниматься разные люди но все это функционировало в единой настраиваемой на каждого пользователя среде.
Eraser (2006-03-09 22:42:00) [2]
> Fenix © (09.03.06 16:05) [28]
>
>
> > Eras
>
> А что ты тогда мне посоветуешь использовать???
или фреймы... или вообще ничего, т.е. стандартные формы с динамическим их созданием/удалением. В этом случае размер всего проекта (exe + потенциальные DLL/bpl) будет минимальным. И работать скорее всего быстрее будет. Да и проще проектировать.
Вообще придерживаюсь мнения, что в ДЛЛ это хранилище для функций, а не для объектов.
tesseract (2006-03-09 22:33:00) [3]
> Да, но тогда это все будет в самом EXE'шнике...а я хочу
> что бы были вне,и можно было легко дороботать, обновить,
> добавить, или вовсе удалить форму... Но для этого тогад
> мне прийдеться перекомпилировать весь проект...
А ТАК ЧТО НЕ ПРИДЁТЬСЯ ?????? У тебя проект, что больше 30 сек уже компилируется ?????
Пример как работать, я уже 4 раз даю. Используй универсальную форму и обработчики событий.
Fenix (2006-03-09 22:22:00) [4]
> Создай одну, но меняй обрабочик кнопки "ОК" и событие oncreate
> - создавай там сввои компонеты.
Да, но тогда это все будет в самом EXE'шнике...а я хочу что бы были вне,и можно было легко дороботать, обновить, добавить, или вовсе удалить форму... Но для этого тогад мне прийдеться перекомпилировать весь проект...
tesseract (2006-03-09 22:14:00) [5]
> нет... у меня несколько форм.... они загружаються в зависимости
> от того, какой пункт меню вызван. В одно и тоже время может
> быть запущена только одна дополнительная форма...
У тебя явно меньше 100 форм.
Форм может быть запущено сколко угодно, exe от этого не располнеет.
А вот по поводу унификации форм сильно подумай. Они навряд-ли так сильно различается.
Динамически создавать меню/подменю не проблема, формы тоже.
Создай одну, но меняй обрабочик кнопки "ОК" и событие oncreate - создавай там сввои компонеты.
Fenix (2006-03-09 22:07:00) [6]нет... у меня несколько форм.... они загружаються в зависимости от того, какой пункт меню вызван. В одно и тоже время может быть запущена только одна дополнительная форма...
> Переменные/ общие функции выносятся в отдельный файл.
Нет но у меня на формах разные компоненты... Поэтому нужно описывать отдельно каждую форму...
tesseract (2006-03-09 22:00:00) [7]
> Как я понял, они были все в программе описаны... Но я хочю
> сдалеть так, что бы потом можно было изменить одну форму,
> изменив один файл.. а не переделывая весь проект.... так
> будет легче доробатывать (если я потом захочу добавить еще
> формы, что скорее всего будет.)
Вот тут не вкатил - теперь формы уже от друг друга зависят ?????
Форма формой, она представление интерфейса. Переменные/ общие функции выносятся в отдельный файл. У тебя, что все формы в одном файле?
Fenix (2006-03-09 21:57:00) [8]
> tesseract ©
У тебя есть аська??? проще будет обсудить.
> Я понимаю много форм. Я понимаю бывает гемор. У меня был
> проект с на 24 формы. Их приграмтоном проектировании, удалось
> вложить в 5.
Как я понял, они были все в программе описаны... Но я хочю сдалеть так, что бы потом можно было изменить одну форму, изменив один файл.. а не переделывая весь проект.... так будет легче доробатывать (если я потом захочу добавить еще формы, что скорее всего будет.). Поэтому я сразу хочу работать с ними как с внешними объектами, вот и пытаюсь выяснить как это лучше реализовать!!!
tesseract (2006-03-09 21:52:00) [9]Читай Коран до конца!!!!!
Я понимаю много форм. Я понимаю бывает гемор. У меня был проект с на 24 формы. Их приграмтоном проектировании, удалось вложить в 5. Посмотри на 1С Сколько ТАМ форм ?
Fenix (2006-03-09 21:31:00) [10]Ну подскажите тогда как ЛУЧШЕ сделать!!!! просто я пока нашел по ДЛЛ статьи.... Скажите другие способы, и если есть ссылки, как их реализовать!!! я не против, просто для меня пока знаком ДЛЛ способ :( а никто не дает ссылки на другие :(
tesseract (2006-03-09 21:27:00) [11]
> В длл не поддерживается String. Я делаю так:
Ой поддерживается. Просто из секции uses ничего не удаляй :-).
> Но возиникает проблема... form1.Edit1.Text имеет тип Tcaption,
О да вечно кто-нибудь возникает :-)
type TCaption = type string;
т.е. В последнее время завершающего ноля не имел.
> Лучше послушай что люди говорят и откажись от dll и bpl
> пока не поздно...
fenix тут действительно тебя не со зла от твоей идеи отговаривают. Здесь люди не первый год, и не один раз подобную идею воплощали.
Fenix (2006-03-09 20:32:00) [12]В длл не поддерживается String. Я делаю так:
Var TextTag:Pchar;
....
TextTag:=PChar(form1.Edit1.Text+form1.Edit2.Text);
....
Но возиникает проблема... form1.Edit1.Text имеет тип Tcaption, и в конце вставляет символ конца строки.... и когда я сталю сложение 2 строк, то выскакивает ошибка.... Как можно это обойти???
Fenix (2006-03-09 16:05:00) [13]
> Eras
А что ты тогда мне посоветуешь использовать???
Eraser (2006-03-09 15:26:00) [14]
> Fenix ©
Лучше послушай что люди говорят и откажись от dll и bpl пока не поздно...
а то только и будешь в своём проекте делать, как модульность приложения организовывать )
теб более что:
1. если мне не изменяет память, bpl должен быть скомпилирован той же версей компилятора, что и программа.
2. запихивать формы в DLL стОит только в очень редких случаях... и перед этим желательно представлять механихм распределения памяти в приложениях/DLL хотя бы в общих чертах.
Fenix (2006-03-09 15:18:00) [15]
> Sergey Masloff
А где можно почитать про создание пакетов? просто я еще пока не сталкивался с ними...
Sergey Masloff (2006-03-09 11:10:00) [16]GrayFace © (09.03.06 10:24) [24]
>Интересное решение. Dfm грузить из ресурсов Dll, события потом кодом из >Dll присваивать.
Неинтересное. Просто формы сразу с обработчиками в DLL - это те же самые ресурсы. Получаем те же траблы с отсутствием sharing global data плюс лишние проблемы с ручной загрузкой ресурсов - прекрасный ИМХО пример удаления гландов автогеном через ректальное отверстие.
GrayFace (2006-03-09 10:24:00) [17]> tesseract © (08.03.06 20:25) [16]
> В журнале "Программист", кто его ещё помнит, была статья
> так там Dfm вообще из базы данных грузили :-)
Интересное решение. Dfm грузить из ресурсов Dll, события потом кодом из Dll присваивать.
Sergey Masloff (2006-03-09 08:36:00) [18]Германн © (09.03.06 01:21) [22]
Ну а в чем проблема? Программу свою поставляешь со своими пакетами (в том числе стандартными). Наличие на целевой машине более свежих библиотек никак не влияет.
Если сменишь компилятор перекомпилируешь и разошлешь новую версию - не так часто это происходит.
Если же хочиться от этого абстрагироваться тогда COM надо пользовать. Но будет сложнее так что в каждом случае нужно смотреть что выгоднее.
Германн (2006-03-09 01:21:00) [19]2 Sergey Masloff (08.03.06 22:49) [21]
Может я отстал от жизни, а наверняка это так. Но как обстоит дело с "зависимостью от версии Дельфи"? Если программа собрана в одной версии, а пакет в другой?
Sergey Masloff (2006-03-08 22:49:00) [20]Подробнее долго.
Вкратце:
1) В пакете описываешь свою форму
2) В секции инициализации модуля регистрируешь ее (формы) класс
3) В "главной" программе вызываешь LoadPackage('ИМЯ Пакета');
4) Если на этапе 3 все хорошо то можно вызвать GetClass('Имя класса формы') - не забудь галочку build with runtime packages
5) Если ссылка на класс по имени получена - создать экземпляр этого класса дело техники. Типа (пишу не проверяя но смысл тот)
function BaseFormCreate(F: TComponentClass; AOwner: TComponent) : TForm;
var
Instance: TComponent;
begin
Instance := TComponent(F.NewInstance);
try
Result := TForm(Instance).Create(AOwner);
except
Instance.Free();
raise;
end;
end;
Ну то есть зная имя пакета и имя класса формы динамически ее создаем и делаем что хотим - показываем и так далее