Форум: "Начинающим";
Текущий архив: 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