![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание немодальных MDI окон в DLL-ке [D6, Win2k, WinXP]
Andrey-k © (2002-06-17 21:58:00)Всем привет! Есть DLL, в ней создаваться должны главная MDI форма xMainForm и дочерняя xChildForm.
xMainForm:=TMainForm.create(Application);
xMainForm.show;
xChildForm:=TChildForm.create(Application);
Почему после создания дочерней выскакивает ошибка якобы нет активной главной MDI формы? А у xMainForm внатуре Activ=false,
почему не ясно. Может надо создавать по другому?
Andrey-k (2002-06-24 21:17:00) [1]- используйте пакеты - самое легкое решение
COOL!!!! слов нет!
Andrey-k (2002-06-23 18:42:00) [2]> McSimm
1. DLLProc := @DLLUnloadProc; в D6 при DLL_PROCESS_DETACH не отработает, тока в D5, надо подправить , если я не ошибаюсь (что мало вероятно) Asm код в procedure _InitLib модуль SysInit
лучше вопрос задать на форуме еще раз может укажут точное место или ждать пока у меня D6 слетит - буду вспоминать методом Тыка
2. А хрен его знает - но оно не nil :) зато Application.mainForm=nil и fRunning=false :)))
3. А если ты напишешь CreateForm и сделаешь show и после закроешь свою форму, то закроется и все приложение боса.
McSimm (2002-06-23 10:43:00) [3]Наказал за невнимательность :)
Очень распространен несколько другой вопрос, поэтому суть этого ускользнула - надо в dll создавать и главную форму.
>> а еще в 6 Delphe on rabotat ne bydet
Можно узнать почему?
>>xMainForm:=TMainForm.create(Application);
А что здесь Application?Есть в DLL где нибудь его инициализация и, главное, - вызов RUN?
Кроме того, чтобы форма стала главной, ее надо создавать с помощью метода CreateForm
Andrey-k (2002-06-22 18:57:00) [4]мужики !
у меня нет своего приложения, нет главной формы fsMDIForm. Есть тока Dll и этот пример в моем случае не катит, а еще в 6 Delphe on rabotat ne bydet, esli perekompilit popitaetes dll :) В моем варианте осталось попробовать пакеты, что я сейчас и пытаюсь изучить....
Спасибо
Юрий Зотов (2002-06-21 12:22:00) [5]> McSimm © (21.06.02 11:59)
Так это вполне естественно. Класс в DLL и ТОТ ЖЕ САМЫЙ класс в Exe - это два совершенно РАЗНЫХ класса. Надо либо использовать сборку с run-time пакетами (BPL вместо чистой DLL), либо делать интерфейсные классы-посредники.
McSimm (2002-06-21 11:59:00) [6]>Юрий Зотов © (21.06.02 02:22)
Поддерживаю, я тоже этот прием использую в нескольких проектах.
Но. Проблемы все же есть. Возникают они при попытке сделать Assign для классов из приложения и dll. Например, эта проблема проявляется при слиянии меню - ошибка возникает при попытке сделать assign TFont -> TFont
Возможно есть способ с этим справиться - я не стал искать, так как не было нужно
Юрий Зотов (2002-06-21 02:22:00) [7]Делал это, и не раз, и все очень просто, и работало без проблем.
При инициализации DLL в ней надо переназначить Application и Screen (причем никаких муторностей, Screen переназначается ТОЧНО так же, как и Application). Если это клиент БД, то надо переназначить еще и Session - иначе появится второй диалог логина (причем тоже ТОЧНО так же просто). После этого в DLL спокойно работают ЛЮБЫЕ формы.
Соответственно, при деинициализации лучше вернуть все назад - чтобы гарантированно избежать потенциальных проблем.
Егоров Николай (2002-06-20 22:50:00) [8]Пример показывает, как загрузить окно для MDI-программы из DLL
http://sources.fitkursk.ru/detail.asp?id=955
Andrey-k (2002-06-19 23:03:00) [9]Всем большое спасибо.
Игорь Шевченко (2002-06-19 13:19:00) [10]Где прочитать про bpl:
http://www.delphikingdom.com/mastering/plugins.htm
Lmatveev (2002-06-19 12:50:00) [11]У меня тоже была подобная задача. Вот решения:
1. Самое правильное - использовать BPL. Использовать их можно точно также, как и DLL, только вместо LoadLibrary делать LoadPackage. Единственный минус (но IMHO очень большой) - это необходимость компиляции приложения с включенной опцией "Build with runtime packages". Т.е. придется таскать за собой целую кучу борландовских BPL. А если еще и сторонние компоненты используются... А если захотим сменить версию Delphi... В общем - минус.
2. Мне удалось использовать MDI формы и в обычных DLL. Для этого в DLL я передавал не Application.Handle, а весь Application, но необходимо перед выгрузкой DLL присвоить в ней все как было до изменения Application. Здесь также существует несколько проблем:
а) Во-первых, передавать объект VCL не совсем правильно, но т.к. TApplication не использует системных HWND, то это работает.
б) Во-вторых, остаются проблемы с объектом Screen, т.к. у него уже есть хэндлы (шрифты, курсоры и т.п.). Это тоже лечиться, но довольно муторно.
в) В-третьих, не работают TAction. Можно победить путем вызова соответствующих процедур из основного приложения.
г) Последнее: отваливается клавиша TAB :). Я победил путем перехвата сообщения CMDialogKey в основном приложении и посылкой его в DLL.
Andrey-k (2002-06-18 20:18:00) [12]Я сам бы так извращатся не стал !
заставили :(
Andrey-k (2002-06-18 20:14:00) [13]Я уже и хандл кидал и у Application.handle:=Xhandle; делал - не помогает. Главная форма все равно не Activ
А с bpl-kaми я не работал, может подскажите - где почитать?
Andrey-k (2002-06-18 20:11:00) [14]Вот и я так думаю!
sdn (2002-06-18 15:10:00) [15]В dll MDI _не_ запрехать... ж-( у Borland до этого пока (надеюсь) головка не допёрла... посему вариантов 2.
1. Не использоватьдля разработки VCL, а писать на _чистом_ WIN32 API(по документации от microsoft это должно работать).
2. Отказаться от использования dll и делать bpl(в принципе - разницы никакой, за исключением некоторых технических тонкостей.)
Я сам работаю по варианту 2.
Игорь Шевченко (2002-06-18 10:43:00) [16]limon © (18.06.02 10:33)
>после этого создавай в длл любую форму
Попробуйте таким образом создать MDIChild в DLL
limon (2002-06-18 10:33:00) [17]в DLL передай параметром handle from main application
------
initDLL(Application.Handle);
------
uses Forms;
procedure initDLL(h:THANDLE);
begin
Application.Handle := h;
end;
-----
после этого создавай в длл любую форму
Игорь Шевченко (2002-06-18 09:36:00) [18]А зачем так извращаться (В DLL главное окно MDIFrame делать) ?
Егоров Николай (2002-06-18 08:59:00) [19]Сорри, написал я выше полный бред... :(
Насколько я понял создаваемые MDIChild-ы пытаются получить родителя в виде главной формы приложения, если таковой нет или таковая не MDIForm-а - генирируется исключение...
Егоров Николай (2002-06-18 06:45:00) [20]Действительно создавать немножко не так нужно:
xMainForm := TMainForm.Create(Application);
xMainForm.Show;
xChildForm := TChildForm.СreateParented(xMainForm.Handle);
при условии, что
xMainForm.FormStyle := fsMDIForm;
и
xChildForm.FormStyle := fsMDIChild;
были выставлены в DesignTime-е, т.к. в Runtime-е свойство FormStyle изменить не удастся...