![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
MDI Child форма из DLL [D7, Win2k]
Omi © (2007-09-27 14:43:00)Сразу оговорюсь, статьи читал, тема старая, но как-то все ее "любезно" обходят. Где-то на Мастерах есть даже целый пример.
А воз и ныне там...
Интересует именно DLL - BPL не интересует.
Модальная форма из DLL прекрасно создается и прекрасно работает. Тоже самое с формами Normal и StayOnTop. По советам разных статей, Application в DLL переопределяется на "головную". MDI Child форма тоже создается и, даже является MDI Child, НО...
Если не лениво, попробуйте создать на DLL форме 2 кнопки, загрузить ее и понажимать Tab, или стрелки, или Enter. Фокус исчезает в неизвестном направлении. Возвращается только мышкой.
Понятно, где это безобразие происходит, но непонятно, что с этим делать. Не переписывать же VCL. Может кто-нибудь интересовался этим вопросом и знает рецепт "дешевого" лекарства?
DiamondShark (2007-09-30 22:23:00) [1]
> 7. Средства BPL изумительно подходят, если состав (перечень)
> подгружаемых модулей постоянный, или в каждый данный момент
> может быть использован (загружен) только один из многих
> вариантов. Ограничение накладывает требование использовать
> uses на модуль из BPL.
А Дельфи-IDE пакеты компонент, не существовавшие на момент создания Дельфи, видимо, святым духом загружает.
Редкостная способность не врубаться.
Leonid Troyanovsky (2007-09-29 07:59:00) [2]
> OMi © (28.09.07 18:21) [26]
> Все таки интересно, в чем великая фишка?
http://softwarer.ru/packages.html
--
Regards, LVT.
OMi (2007-09-28 18:21:00) [3]Спасибо, Игорь!
Такой вариант действительно работает.
Все таки интересно, в чем великая фишка?
Игорь Шевченко (2007-09-28 16:43:00) [4]Omi © (28.09.07 15:15) [24]
Странный ты. Собери EXEшник и DLL с run-time packages, загружай DLL как тебе удобно, не передавай никаких Application никуда.
Мы так уже несколько лет работаем и горя не знаем.
Omi (2007-09-28 15:15:00) [5]Уважаемый Джо!
Ты, наверно, решил поиздеваться?
Вопрос стоял про 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и с динамической загрузкой оба вида библиотек ,похоже, эквивалентны.
Omi (2007-09-28 14:50:00) [6]Hi! Тестов!
Так тебе выслали что-нибудь на mail.ru? У меня тоже не скачивается :(
Тестов (2007-09-28 08:31:00) [7]> http://unclejoe.ho.com.ua/test_pkg.zip
А не могли бы перевыложить файл? А то не могу скачать :( Или выслать на test.testov@mail.ru ? Спасибо
Джо (2007-09-27 19:44:00) [8]> [20] Omi © (27.09.07 18:49)
> Народ! да не работает это. Попробуйте сами. Процедура запускается,
> а формы нет.
> Спасибо за сотрудничество. Игрался на примере из этого же
> форума. Пример простейший. Но...
Что там не работает, я не знаю.
Вот набросал пример пакета и программы, которая его динамически подгружает.
В настройках проекта указать, чтобы билдил bpl в текущую папку.
Открывать проджект груп ProjectGroup1.bpg.
Разбирайся.
http://unclejoe.ho.com.ua/test_pkg.zip
(11 Кб).
Omi (2007-09-27 18:49:00) [9]Народ! да не работает это. Попробуйте сами. Процедура запускается, а формы нет.
Спасибо за сотрудничество. Игрался на примере из этого же форума. Пример простейший. Но...
Джо (2007-09-27 18:38:00) [10]> [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:32:00) [11]Джо! Извини за занудство. А exportsгде прописывать. Я понимаю, что в пакете, но где? В самом package- ошибка компилятора. В единственном модуле - ошибка при вызове...
DiamondShark (2007-09-27 18:26:00) [12]
> Где в пакете должна быть объявлена эта Proc, чтобы ее адрес
> получить?
где угодно, в любом юните:
implementation
...
procedure zzz;
begin
end;
exports
zzz name 'MySuperPuperProc';
end.
Джо (2007-09-27 18:25:00) [13]> [15] Omi © (27.09.07 18:21)
> Джо! Где в пакете должна быть объявлена эта Proc, чтобы
> ее адрес получить?
А почему бы не в exports?
Omi (2007-09-27 18:21:00) [14]Джо! Где в пакете должна быть объявлена эта Proc, чтобы ее адрес получить?
CreateMDI=nil в результате.
DiamondShark (2007-09-27 18:12:00) [15]
> С DLL все проще.
А ты ответы читаешь, или фильтруешь по ключевым словам?
> Сергей М. © (27.09.07 15:10) [3]
> bpl - та же dll.
Видел? Предложение след в сознании оставило?
Кто тебе мешает ту же "простоту" сделать в пакете?
Джо (2007-09-27 18:11:00) [16]> [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;
Обратите внимание: все имена — это переменные :)
Omi (2007-09-27 17:51:00) [17]При использовании bpl, даже с динамической загрузкой, пространство имен проекта единое.
Как с bpl определить соответствие <имя модуля>-<имя процедуры>, если <имя процедуры> - постоянное, а модулей много.
Это NOTEиз help и есть камень преткновения.
С DLL все проще.
FLib := LoadLibrary(PChar('mdidll.dll'));
...
@CreateMDI := GetProcAddress(FLib, PChar('CreateMDI'));
Обратите внимание: все имена - это переменные.
Игорь Шевченко (2007-09-27 17:31:00) [18]Кроме того, точно также, как ты загружаешь неизвестную DLL ты можешь загружать и неизвестный BPL. Только геморроя меньше
Игорь Шевченко (2007-09-27 17:30:00) [19]Собери DLL с run-time packages и будет тебе счастье
Omi (2007-09-27 17:15:00) [20]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 , если я еще не знаю, что там будет? Каждый модуль должен выдавать "нагора" только некий единый интерфейс для объектов предметной области.
Нужна не просто динамическая загрузка, а динамический состав.