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

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

Форма и ДЛЛ [D7, WinXP]


Страницы:   1 2

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;


Ну то есть зная имя пакета и имя класса формы динамически ее создаем и делаем что хотим - показываем и так далее


Страницы:   1 2

Наверх

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