Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.57 MB
Время: 0.046 c
15-1141191597
Ega23
2006-03-01 08:39
2006.03.26
Не високосный, но всё-таки: С Днём рождения! 29 февраля


1-1140866456
Alex_C
2006-02-25 14:20
2006.03.26
TThread тормозит основную программу при выводе в мемо


15-1141060496
I am
2006-02-27 20:14
2006.03.26
Оптимальный вариант проверки подлинности


2-1141992438
it_work
2006-03-10 15:07
2006.03.26
Как эмитировать нажатия кнопок


2-1142240964
mrAndersen
2006-03-13 12:09
2006.03.26
Как добавить *.gif файл на форму?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский