Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
4-1180097579
buben
2007-05-25 16:52
2007.12.16
Замена буфера обмена


2-1195841377
Neo
2007-11-23 21:09
2007.12.16
как проверить - сущ-ет ли БД, с которой связывается программа?


15-1194518134
Grom PE
2007-11-08 13:35
2007.12.16
Прошу помочь с переводом сишного кода эмулятора Adlib


2-1195713651
eugie
2007-11-22 09:40
2007.12.16
Создание компонетов по имени класса


15-1195079234
Альберт
2007-11-15 01:27
2007.12.16
при установки kol не найден exptintf.dcu





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский