Форум: "Основная";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
ВнизMDI Child форма из DLL Найти похожие ветки
← →
Omi © (2007-09-27 14:43) [0]Сразу оговорюсь, статьи читал, тема старая, но как-то все ее "любезно" обходят. Где-то на Мастерах есть даже целый пример.
А воз и ныне там...
Интересует именно DLL - BPL не интересует.
Модальная форма из DLL прекрасно создается и прекрасно работает. Тоже самое с формами Normal и StayOnTop. По советам разных статей, Application в DLL переопределяется на "головную". MDI Child форма тоже создается и, даже является MDI Child, НО...
Если не лениво, попробуйте создать на DLL форме 2 кнопки, загрузить ее и понажимать Tab, или стрелки, или Enter. Фокус исчезает в неизвестном направлении. Возвращается только мышкой.
Понятно, где это безобразие происходит, но непонятно, что с этим делать. Не переписывать же VCL. Может кто-нибудь интересовался этим вопросом и знает рецепт "дешевого" лекарства?
← →
Игорь Шевченко © (2007-09-27 15:02) [1]
> Может кто-нибудь интересовался этим вопросом и знает рецепт
> "дешевого" лекарства?
bpl
← →
Omi © (2007-09-27 15:06) [2]Я же, вроде, писал: "BPL не интересует...". Опять "любезный" обход вопроса.
Можно средство и "подороже".
← →
Сергей М. © (2007-09-27 15:10) [3]
> Я же, вроде, писал: "BPL не интересует..."
bpl - та же dll.
Или ты собрался приспособить создаваемые тобой в dll дочерние формы к mdiparent-окнам приложений заранее неизвестных сред разработки ?
← →
Omi © (2007-09-27 15:34) [4]Средство разработки одно D7. Споров на тему, "что лучше...", было уже навалом. Что сокрыл Борланд от нас такого, что только bpl может работать?
Давайте вернемся к Top...
Все таки, можно или НИЗЯ ????
Если НИЗЯ, то ПОЧЕМУ?
Или по принципу: "Положено - ешь, не положено - не ешь".
Спец. клавиши где-то перехватываются, и до KeyDown формы не доходят. Понятно, что это надо для управления, хотя бы , главным меню, но ведь работает некорректно, и в руки не дается.
← →
Сергей М. © (2007-09-27 15:41) [5]
> Средство разработки одно D7
Ну и нафига тогда затея с dll, объясни ?
В кр.случае, чем будет визуально отличаться bpl, переименованная в dll, от "истинной" dll ?)
← →
Omi © (2007-09-27 16:23) [6]И все-таки они разные :)))
Сергей! Я ж не спорить сюда пришел, с конкретным вопросом.
← →
Германн © (2007-09-27 16:28) [7]
> Я ж не спорить сюда пришел, с конкретным вопросом.
Геморрой можно заработать 1000 и одним способом. Вот формы в Dll из этого числа.
← →
Сергей М. © (2007-09-27 16:32) [8]
> И все-таки они разные
А никто и не возражает)
Но пока ты не конкретизируешь, чем же тебе "насолили" bpl, серьезного разговора, imho, не будет.
← →
Omi © (2007-09-27 17:15) [9]Note
When an application utilizes packages, the name of each packaged unit still must appear in the uses clause of any source file that references it.
Приложение, которое состоит из модулей, но состав модулей в момент выпуска в свет приложения еще неизвестен. Модули могут заменяться, допоставлятся и т.д.
Какой USE , если я еще не знаю, что там будет? Каждый модуль должен выдавать "нагора" только некий единый интерфейс для объектов предметной области.
Нужна не просто динамическая загрузка, а динамический состав.
← →
Игорь Шевченко © (2007-09-27 17:30) [10]Собери DLL с run-time packages и будет тебе счастье
← →
Игорь Шевченко © (2007-09-27 17:31) [11]Кроме того, точно также, как ты загружаешь неизвестную DLL ты можешь загружать и неизвестный BPL. Только геморроя меньше
← →
Omi © (2007-09-27 17:51) [12]При использовании bpl, даже с динамической загрузкой, пространство имен проекта единое.
Как с bpl определить соответствие <имя модуля>-<имя процедуры>, если <имя процедуры> - постоянное, а модулей много.
Это NOTE из help и есть камень преткновения.
С DLL все проще.
FLib := LoadLibrary(PChar("mdidll.dll"));
...
@CreateMDI := GetProcAddress(FLib, PChar("CreateMDI"));
Обратите внимание: все имена - это переменные.
← →
Джо © (2007-09-27 18:11) [13]> [12] Omi © (27.09.07 17:51)
> FLib := LoadLibrary(PChar("mdidll.dll"));
> ...
> @CreateMDI := GetProcAddress(FLib, PChar("CreateMDI"));
>
>
> Обратите внимание: все имена - это переменные.FLib := LoadPackage("...\Package1.bpl");
...
@CreateMDI := GetProcAddress(FLib,"...");
end;
Обратите внимание: все имена — это переменные :)
← →
DiamondShark © (2007-09-27 18:12) [14]
> С DLL все проще.
А ты ответы читаешь, или фильтруешь по ключевым словам?
> Сергей М. © (27.09.07 15:10) [3]
> bpl - та же dll.
Видел? Предложение след в сознании оставило?
Кто тебе мешает ту же "простоту" сделать в пакете?
← →
Omi © (2007-09-27 18:21) [15]Джо! Где в пакете должна быть объявлена эта Proc, чтобы ее адрес получить?
CreateMDI=nil в результате.
← →
Джо © (2007-09-27 18:25) [16]> [15] Omi © (27.09.07 18:21)
> Джо! Где в пакете должна быть объявлена эта Proc, чтобы
> ее адрес получить?
А почему бы не в exports?
← →
DiamondShark © (2007-09-27 18:26) [17]
> Где в пакете должна быть объявлена эта Proc, чтобы ее адрес
> получить?
где угодно, в любом юните:
implementation
...
procedure zzz;
begin
end;
exports
zzz name "MySuperPuperProc";
end.
← →
Omi © (2007-09-27 18:32) [18]Джо! Извини за занудство. А exports где прописывать. Я понимаю, что в пакете, но где? В самом package - ошибка компилятора. В единственном модуле - ошибка при вызове...
← →
Джо © (2007-09-27 18:38) [19]> [18] Omi © (27.09.07 18:32)
> Джо! Извини за занудство. А exports где прописывать. Я понимаю,
> что в пакете, но где? В самом package - ошибка компилятора.
> В единственном модуле - ошибка при вызове...
В любом юните, включенном в пакет (dpk):
// unit1.pas
unit1;
interface
procedure A;
implementation
procedure A;
begin
...
end;
exports
A;
end.
← →
Omi © (2007-09-27 18:49) [20]Народ! да не работает это. Попробуйте сами. Процедура запускается, а формы нет.
Спасибо за сотрудничество. Игрался на примере из этого же форума. Пример простейший. Но...
← →
Джо © (2007-09-27 19:44) [21]> [20] Omi © (27.09.07 18:49)
> Народ! да не работает это. Попробуйте сами. Процедура запускается,
> а формы нет.
> Спасибо за сотрудничество. Игрался на примере из этого же
> форума. Пример простейший. Но...
Что там не работает, я не знаю.
Вот набросал пример пакета и программы, которая его динамически подгружает.
В настройках проекта указать, чтобы билдил bpl в текущую папку.
Открывать проджект груп ProjectGroup1.bpg.
Разбирайся.
http://unclejoe.ho.com.ua/test_pkg.zip
(11 Кб).
← →
Тестов (2007-09-28 08:31) [22]> http://unclejoe.ho.com.ua/test_pkg.zip
А не могли бы перевыложить файл? А то не могу скачать :( Или выслать на test.testov@mail.ru ? Спасибо
← →
Omi © (2007-09-28 14:50) [23]Hi! Тестов!
Так тебе выслали что-нибудь на mail.ru? У меня тоже не скачивается :(
← →
Omi © (2007-09-28 15:15) [24]Уважаемый Джо!
Ты, наверно, решил поиздеваться?
Вопрос стоял про MDI Child.
Такие проекты ваять я и сам умею.
Из того, что сам накопал:
1. С точки зрения поставленного вопроса, нет никакой разницы между DLL и BPL. Поведение полностью одинаковое.
2. Собственно MDI Child форму создать из билиотеки (любой) не проблема. Проблема в том, что "системные" клавиши (Tab,стрелки,Enter) не работают.
3. Форма из библиотеки может поймать эти клавиши через OnMessage у Application. Причем Application из exe, а не библиотечный.
4. Такая же гадость происходит и с Hint. "Лекарство", возможно, то же.
5. Некрасиво это как-то. Может есть способ получше?
6. Переопределение глобальной переменной Application в библиотеке на Application из exe библиотечный объект (естественно) не прибивает. Может их можно как-то синхронизировать, что ли?
7. Средства BPL изумительно подходят, если состав (перечень) подгружаемых модулей постоянный, или в каждый данный момент может быть использован (загружен) только один из многих вариантов. Ограничение накладывает требование использовать uses на модуль из BPL.
Без uses и с динамической загрузкой оба вида библиотек ,похоже, эквивалентны.
← →
Игорь Шевченко © (2007-09-28 16:43) [25]Omi © (28.09.07 15:15) [24]
Странный ты. Собери EXEшник и DLL с run-time packages, загружай DLL как тебе удобно, не передавай никаких Application никуда.
Мы так уже несколько лет работаем и горя не знаем.
← →
OMi © (2007-09-28 18:21) [26]Спасибо, Игорь!
Такой вариант действительно работает.
Все таки интересно, в чем великая фишка?
← →
Leonid Troyanovsky © (2007-09-29 07:59) [27]
> OMi © (28.09.07 18:21) [26]
> Все таки интересно, в чем великая фишка?
http://softwarer.ru/packages.html
--
Regards, LVT.
← →
DiamondShark © (2007-09-30 22:23) [28]
> 7. Средства BPL изумительно подходят, если состав (перечень)
> подгружаемых модулей постоянный, или в каждый данный момент
> может быть использован (загружен) только один из многих
> вариантов. Ограничение накладывает требование использовать
> uses на модуль из BPL.
А Дельфи-IDE пакеты компонент, не существовавшие на момент создания Дельфи, видимо, святым духом загружает.
Редкостная способность не врубаться.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2007.12.16;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.05 c