Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание немодальных MDI окон в DLL-ке [D6, Win2k, WinXP]


Страницы:   1 2

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 изменить не удастся...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо