Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.005 c
1-23652
nimble
2002-06-26 08:20
2002.07.08
StringGrid


1-23642
billybons
2002-06-26 07:39
2002.07.08
описание глобальной переменной


1-23545
Дельфятник
2002-06-26 17:37
2002.07.08
Access Violation при работе с TComboBox.


7-23797
Dankin
2002-04-07 14:51
2002.07.08
Такой-вот странный вопрос, Где находится курсор !!!!


4-23826
anod
2002-05-09 00:18
2002.07.08
Сообщение от меню





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