Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.08;
Скачать: CL | DM;

Вниз

Создание немодальных 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
3-23523
Tutov Roman
2002-06-18 10:43
2002.07.08
как заменить строку в таблице.


1-23531
Елена
2002-06-26 06:57
2002.07.08
Формы и горячие клавиши


6-23720
Konstantin Borodachev
2002-04-25 14:42
2002.07.08
Проблема с Indy и OpenSSL


7-23811
ray_wagner
2002-03-28 23:09
2002.07.08
Блокировка клавы


1-23662
Cosinus
2002-06-26 11:11
2002.07.08
Подскажите, как понять, какая именно клавиша нажата на мыши?