Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Форма и ДЛЛ   Найти похожие ветки 

 
Fenix ©   (2006-03-08 15:14) [0]

Доброго времени суток.
Меня интересует такой вопрос, можно ли запихнуть форму, с всеми ее компонентами и процедурами в *.DLL. И потом уже в программу по мере надобности подгружать длл, а не форму ?
У меня просто будет очень много форм, и загружать их все статически не очень хочеться...


 
Anatoly Podgoretsky ©   (2006-03-08 15:19) [1]

Загружай динамически.


 
anton773 ©   (2006-03-08 15:50) [2]


> Меня интересует такой вопрос, можно ли запихнуть форму,
> с всеми ее компонентами и процедурами в *.DLL

Запросто.Только при вызове дочерних форм из dll не забудь их создать(create). Сам долго мучался с этим пока не разобрался. :))


 
Fenix ©   (2006-03-08 15:56) [3]


Запросто.Только при вызове дочерних форм из dll не забудь  их создать(create). Сам долго мучался с этим пока не разобрался. :))


Можешь привести маленький примерчик.... и как потом взаимодействовать с формой загруженной из длл...


 
Sergey Masloff   (2006-03-08 17:39) [4]

Чтобы избежать немалого числа проблем явных и неявных лучше использовать не .dll а .bpl которые хотя и те же dll только "заточеные" для работы с дельфи.


 
tesseract ©   (2006-03-08 17:48) [5]


> У меня просто будет очень много форм, и загружать их все
> статически не очень хочеться...

А почему не создавать их динамически?
Никто не заставляет тебя создавать форму при старте приложения.
Памяти ты в DLL больше кода внесешь чем памяти сэкономишь.
Хочешь реально поэкономить - используй фреймы.


 
Fenix ©   (2006-03-08 17:57) [6]

Просто при использовании Dll можно будет легко модернезировать мой програмный продукт различными патчами... Вот и хочу попробовать через ДЛЛ сделать... Посоветуйте если есть хорошие статьи на тему форм и ДЛЛ


 
tesseract ©   (2006-03-08 18:12) [7]


> Просто при использовании Dll можно будет легко модернезировать
> мой програмный продукт различными патчами... Вот и хочу
> попробовать через ДЛЛ сделать... Посоветуйте если есть хорошие
> статьи на тему форм и ДЛЛ

Думаешь легче будет? Лучше используй СOM - его по любому Tobject использует.

DLL таки не умеет данных хранить. Не его прерогатива.


 
Fenix ©   (2006-03-08 18:19) [8]


> tesseract

Можешь дать ссылки на толковые статьи по COM технологии? Желательно приближенные к мойе теме...


 
tesseract ©   (2006-03-08 18:35) [9]


> Можешь дать ссылки на толковые статьи по COM технологии?
>  Желательно приближенные к мойе теме...

msdn.microsoft.com - но по моему это не по твоей теме.
мой совет - фреймы+репозитарий - намного эффективней чем код разбросанный по DLL.


 
Fenix ©   (2006-03-08 18:37) [10]


> фреймы+репозитарий

Я с этим еще пока не салкивался... Дай плз статейки какиенить полезные, что бы хоть основы их поизучать...


 
Fenix ©   (2006-03-08 19:27) [11]

Только что прочитал статью
http://www.delphimaster.ru/articles/usedll/index.html

Как раз мне бы было удобно запихнуть мои формы в ДЛЛ, и потом уже динамически подключать, нужные мне ДЛЛ. Щас попробую сделать так...
Если  фреймы+репозитарий более альтернативный и простой способ, то дай плз по нему статейки...


 
tesseract ©   (2006-03-08 19:28) [12]


> Я с этим еще пока не салкивался... Дай плз статейки какиенить
> полезные, что бы хоть основы их поизучать...

ммммм.. Нет лучше книг. Эффективнее. Это же базовая функциональность Delphi!!!!!!!!


 
Fenix ©   (2006-03-08 19:53) [13]

Просто я ими не пользовался... все мои проекты содержали небольшое количество форм... и все создавались статически... вот щас решаю как лучше реализовать динамические формы... (желательно подгрузка из отдельных файлов...).


 
tesseract ©   (2006-03-08 20:01) [14]


> динамические формы...

Можешь создавать их полностью динамически (не DFM).
А можешь как обыные объекты. Убери их из AutoCreateForms в свойствах проекта. Или просто удали строчку
Application.CreateForm(TMyForm, Myform); из dpr файла.
при первом вызове - MyForm:=TmyForm.Create(self) и тд.

На самом деле добавление форм ест достаточно мало памяти (в любом случае TForm - предок всех твоих форм)  и все используемые VCL там находятся.

Если просто путаешься - примсотрись к TactionManager. Он для того и создан чтобы снизить кол-во геммороя.


 
Fenix ©   (2006-03-08 20:09) [15]

не... ты малость не понял... я говорил что я раньше создавал прилжения с малым количеством форм... а теперь у меня должно приложение быть с относительно неограниченным количеством форм, но подгружаемыми по очереди (они должны быть модальные, и после использования освобождать память). Плюс еще мне надо сделать возможность их изменять уже при откомпилированной программе, следовательно они должны быть внешними. Вот поэтому я и хочу использовать ДЛЛ.... Т.к. заменив одну ДЛЛ замениться и сама форма и ее все недочеты....


 
tesseract ©   (2006-03-08 20:25) [16]


> не... ты малость не понял... я говорил что я раньше создавал
> прилжения с малым количеством форм... а теперь у меня должно
> приложение быть с относительно неограниченным количеством
> форм, но подгружаемыми по очереди (они должны быть модальные,
>  и после использования освобождать память). Плюс еще мне
> надо сделать возможность их изменять уже при откомпилированной
> программе, следовательно они должны быть внешними. Вот поэтому
> я и хочу использовать ДЛЛ.... Т.к. заменив одну ДЛЛ замениться
> и сама форма и ее все недочеты....

А так -то проще напиши функцию динамического создания компонет по заранее описанному шаблону.
У тебя будут постоянные компоненты - кнопки OK CANCEL и тд. И непостоянные - там всякие Edit/combobox.

Ну и всё. В  журнале "Программист", кто его ещё помнит,  была статья так там Dfm вообще из базы данных грузили :-)


 
Sergey Masloff   (2006-03-08 20:32) [17]

Я не понимаю почему версия с рантайм-пакетами была так отброшена.
Конечно строить формы на лету тоже вполне допустимая идея тогда уже идти дальше - код для обработчиков писать в виде скриптов потому что иначе получаются полумеры - можно фактически только морду менять, сильно функционал не заменишь.
 Но применение пакетов намного проще а по сравнению с dll и вообще сравнивать нечего - цитирую

Note

Packages share their global data with other modules in an application.

Добиваться этого в случае с DLL это такой напряг что...


 
Fenix ©   (2006-03-08 20:35) [18]


> А так -то проще напиши функцию динамического создания компонет
> по заранее описанному шаблону.
> У тебя будут постоянные компоненты - кнопки OK CANCEL и
> тд. И непостоянные - там всякие Edit/combobox.

Так получаеться мне прийдеться хранить сами шаблоны в текстовых документах, и у каждого шаблона будут свой обработчик события при нажатие на кнопку OK.
Можешь поподробнее рассказать, как это реализуеться, или если не сложно приведи маленький примерчик, т.к. на примере легче разобраться :)


 
tesseract ©   (2006-03-08 20:37) [19]

ну в принципе согласен, если мне не изменяет память, то примерно так в той статье и поступали.
Да и сайт этого журнала к несчатью помер :-( А статья там была


 
Fenix ©   (2006-03-08 20:37) [20]

Sergey Masloff  

>  рантайм-пакетами была так отброшена.

Можешь поподробнее про этот способ?


 
Sergey Masloff   (2006-03-08 22:49) [21]

Подробнее долго.

Вкратце:
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;


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


 
Германн ©   (2006-03-09 01:21) [22]

2 Sergey Masloff   (08.03.06 22:49) [21]

Может я отстал от жизни, а наверняка это так. Но как обстоит дело с "зависимостью от версии Дельфи"? Если программа собрана в одной версии, а пакет в другой?


 
Sergey Masloff   (2006-03-09 08:36) [23]

Германн ©   (09.03.06 01:21) [22]
 Ну а в чем проблема? Программу свою поставляешь со своими пакетами (в том числе стандартными). Наличие на целевой машине более свежих библиотек никак не влияет.
 Если сменишь компилятор перекомпилируешь и разошлешь новую версию - не так часто это происходит.

 Если же хочиться от этого абстрагироваться тогда COM надо пользовать. Но будет сложнее так что в каждом случае нужно смотреть что выгоднее.


 
GrayFace ©   (2006-03-09 10:24) [24]

> tesseract ©   (08.03.06 20:25) [16]
> В  журнале "Программист", кто его ещё помнит,  была статья
> так там Dfm вообще из базы данных грузили :-)

Интересное решение. Dfm грузить из ресурсов Dll, события потом кодом из Dll присваивать.


 
Sergey Masloff   (2006-03-09 11:10) [25]

GrayFace ©   (09.03.06 10:24) [24]
>Интересное решение. Dfm грузить из ресурсов Dll, события потом кодом из >Dll присваивать.
Неинтересное. Просто формы сразу с обработчиками в DLL - это те же самые ресурсы. Получаем те же траблы с отсутствием sharing global data плюс лишние проблемы с ручной загрузкой ресурсов - прекрасный ИМХО пример удаления гландов автогеном через ректальное отверстие.


 
Fenix ©   (2006-03-09 15:18) [26]


> Sergey Masloff

А где можно почитать про создание пакетов? просто я еще пока не сталкивался с ними...


 
Eraser ©   (2006-03-09 15:26) [27]


> Fenix ©

Лучше послушай что люди говорят и откажись от dll и bpl пока не поздно...
а то только и будешь в своём проекте делать, как модульность приложения организовывать )
теб более что:
1. если мне не изменяет память, bpl должен быть скомпилирован той же версей компилятора, что и программа.
2. запихивать формы в DLL стОит только в очень редких случаях... и перед этим желательно представлять механихм распределения памяти в приложениях/DLL хотя бы в общих чертах.


 
Fenix ©   (2006-03-09 16:05) [28]


> Eras

А что ты тогда мне посоветуешь использовать???


 
Fenix ©   (2006-03-09 20:32) [29]

В длл не поддерживается String. Я делаю так:
Var TextTag:Pchar;
....
TextTag:=PChar(form1.Edit1.Text+form1.Edit2.Text);
....

Но возиникает проблема... form1.Edit1.Text имеет тип Tcaption, и в конце вставляет символ конца строки.... и когда я сталю сложение 2 строк, то выскакивает ошибка.... Как можно это обойти???


 
tesseract ©   (2006-03-09 21:27) [30]


> В длл не поддерживается String. Я делаю так:

Ой поддерживается. Просто из секции uses ничего не удаляй :-).


> Но возиникает проблема... form1.Edit1.Text имеет тип Tcaption,

О да вечно кто-нибудь возникает :-)  

type TCaption = type string;
т.е. В последнее время завершающего ноля не имел.


> Лучше послушай что люди говорят и откажись от dll и bpl
> пока не поздно...


fenix тут действительно тебя не со зла от твоей идеи отговаривают. Здесь люди не первый год, и не один раз подобную идею воплощали.


 
Fenix ©   (2006-03-09 21:31) [31]

Ну подскажите тогда как ЛУЧШЕ сделать!!!! просто я пока нашел по ДЛЛ статьи.... Скажите другие способы, и если есть ссылки, как их реализовать!!! я не против, просто для меня пока знаком ДЛЛ способ :( а никто не дает ссылки на другие :(


 
tesseract ©   (2006-03-09 21:52) [32]

Читай Коран до конца!!!!!
Я понимаю много форм. Я понимаю бывает гемор. У меня был проект с на 24 формы. Их приграмтоном проектировании, удалось вложить в 5. Посмотри на 1С Сколько ТАМ форм ?


 
Fenix ©   (2006-03-09 21:57) [33]


> tesseract ©

У тебя есть аська??? проще будет обсудить.

> Я понимаю много форм. Я понимаю бывает гемор. У меня был
> проект с на 24 формы. Их приграмтоном проектировании, удалось
> вложить в 5.

Как я понял, они были все в программе описаны... Но я хочю сдалеть так, что бы потом можно было изменить одну форму, изменив один файл.. а не переделывая весь проект.... так будет легче доробатывать (если я потом захочу добавить еще формы, что скорее всего будет.). Поэтому я сразу хочу работать с ними как с внешними объектами, вот и пытаюсь выяснить как это лучше реализовать!!!


 
tesseract ©   (2006-03-09 22:00) [34]


> Как я понял, они были все в программе описаны... Но я хочю
> сдалеть так, что бы потом можно было изменить одну форму,
>  изменив один файл.. а не переделывая весь проект.... так
> будет легче доробатывать (если я потом захочу добавить еще
> формы, что скорее всего будет.)

Вот тут не вкатил - теперь формы уже от друг друга зависят ?????
Форма формой, она представление интерфейса. Переменные/ общие функции выносятся  в отдельный файл. У тебя, что все формы в одном файле?


 
Fenix ©   (2006-03-09 22:07) [35]

нет... у меня несколько форм.... они загружаються в зависимости от того, какой пункт меню вызван. В одно и тоже время может быть запущена только одна дополнительная форма...

>  Переменные/ общие функции выносятся  в отдельный файл.

Нет но у меня на формах разные компоненты... Поэтому нужно описывать отдельно каждую форму...


 
tesseract ©   (2006-03-09 22:14) [36]


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

У тебя явно меньше 100 форм.
Форм может быть запущено сколко угодно, exe от этого не располнеет.
А вот по поводу унификации форм сильно подумай. Они навряд-ли так сильно различается.
Динамически создавать меню/подменю не  проблема, формы тоже.

Создай одну, но меняй обрабочик кнопки "ОК" и событие oncreate - создавай там сввои компонеты.


 
Fenix ©   (2006-03-09 22:22) [37]


> Создай одну, но меняй обрабочик кнопки "ОК" и событие oncreate
> - создавай там сввои компонеты.

Да, но тогда это все будет в самом EXE"шнике...а я хочу что бы были вне,и можно было легко дороботать, обновить, добавить, или вовсе удалить форму... Но для этого тогад мне прийдеться перекомпилировать весь проект...


 
tesseract ©   (2006-03-09 22:33) [38]


> Да, но тогда это все будет в самом EXE"шнике...а я хочу
> что бы были вне,и можно было легко дороботать, обновить,
>  добавить, или вовсе удалить форму... Но для этого тогад
> мне прийдеться перекомпилировать весь проект...

А ТАК ЧТО НЕ ПРИДЁТЬСЯ ?????? У тебя проект, что больше 30 сек уже компилируется ?????

Пример как работать, я уже  4 раз даю. Используй универсальную форму и обработчики событий.


 
Eraser ©   (2006-03-09 22:42) [39]


> Fenix ©   (09.03.06 16:05) [28]
>
>
> > Eras
>
> А что ты тогда мне посоветуешь использовать???

или фреймы... или вообще ничего, т.е. стандартные формы с динамическим их созданием/удалением. В этом случае размер всего проекта (exe + потенциальные DLL/bpl) будет минимальным. И работать скорее всего быстрее будет. Да и проще проектировать.
Вообще придерживаюсь мнения, что в ДЛЛ это хранилище для функций, а не для объектов.


 
Sergey Masloff   (2006-03-09 22:47) [40]

Я когда-то делал так:
Проект был большой (форм намно-о-го больше сотни, все они были универсальными если бы все сделаны как отдельные - ну несколько тысяч было бы).
 Работало это все так:
1)  При запуске пользователь запускал не программу а микрозагрузчик который соединялся с сервером и проверял не обновилась ли версия главного модуля. Если да то скачивал новую версию и запускал ее если нет то запускал имеющуюся.
2) Основной модуль коннектился к БД и идентифицировав пользователя на основе его личности и ролей строил динамически главное меню и тулбар. При этом также строился список bpl которые нужны для соответствующего функционала.
3) bpl по списку проверялись на серваке не обновилась ли версия и закачивались если нужно.
4) Пользователь получал отмашку на начало работы (или сообщение о проблемах если что-то вышеприведенное не срабатывало).

А смысл был в том чтобы разнести по модулям разный функционал - понятно что рабочее место бухгалтера отличается даже от места главбуха не говоря о администраторе защиты или операторе на складе или ответственного за БСО или сотрудника юр. отдела.
 Так как модули достаточно автономны ими могли заниматься разные люди но все это функционировало в единой настраиваемой на каждого пользователя среде.



Страницы: 1 2 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.59 MB
Время: 0.045 c
2-1141893206
nsk3d
2006-03-09 11:33
2006.03.26
Экспорт в DLL


2-1141169056
spogi
2006-03-01 02:24
2006.03.26
Kak v QReport pokazat dannie iz raznix tablic, ili summirovat ix


2-1141896299
Der Nechk@ssoff
2006-03-09 12:24
2006.03.26
рисование кнопки


15-1140281080
Kerk
2006-02-18 19:44
2006.03.26
[firebird] Оптимизация запроса


2-1142155503
Ega23
2006-03-12 12:25
2006.03.26
Сохранить файл в Unicode