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