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

Вниз

Дочерняя форма в Dll   Найти похожие ветки 

 
Kolyan ©   (2002-02-12 17:30) [0]

Люди, HELP ME!!!
Нужно из DLL вызывать хранящуюся там форму, которая имеет Style fsMDIChild, которая должна становиться дочерней к вызвавшему ее приложению (главная форма - MDIform)
В форумах покопался, в статьях тоже, но то что нужно не получается. :(((
HELP!


 
McSimm ©   (2002-02-12 17:40) [1]

Основная проблема в описанной ситуации заключается в переназначении Application и Screen библиотеки на значения из основной программы (сохранив их оригинальные значения). Это должно быть сделано до создания MDIChild формы. Перед выгрузкой DLL надо восстановить значения этих переменных


 
Kolyan ©   (2002-02-15 10:50) [2]

То есть мне нужно пердавать Application.Handle для создание формы Form1:=TForm1.Create(Application). Это я делаю.
А что делать со Screen ?


 
McSimm ©   (2002-02-15 10:59) [3]

Не то. Этого не достаточно.

var
OldApp: TApplication;
OldScr: TScreen;

При инициализации DLL передаем в нее из EXE переменные Appplication и Screen.

procedure InitMyDll(Hostapp: TApplication; HostScr: TScreen)
begin
OldApp := Application;
OldScr := Screen;

Application := HostApp;
Screen := HostScr;
// .....
end;

Перед выгрузкой DLL, но после закрытия MDIChild формы:
Application := OldApp;
Screen := OldScr;



 
Алексей Петров (M) ©   (2002-02-15 11:21) [4]

> McSimm © (15.02.02 10:59)
Этого тоже мало.

Спроси в IntMyDll:

if Hostapp is TApplication then
else


или даже

if Hostapp is TObject then
else


Между exe и dll можно передовать объект только в том случаи, если оба модуля собраны с использованием пакета, в котором этот объект описывается. Иначе это не корректно.


 
McSimm ©   (2002-02-15 11:30) [5]

>if Hostapp is TApplication then
>else
Это конечно нужно, но не необходимо :)

Некорректно, согласен. Однако есть программы, которые реализуют MDI окна в DLL. И при этом не используют Bpl.
Этот метод проверен. По другому вероятнее всего - не получится.
Видел еще вариант - вместо самих переменных переназначались их Handle:
Application.Handle := HoasAppHandle;

Но этот вариант я не проверял, поэтому и не предлагал.

Возможно будут проблемы с интеграцией MDI меню в меню главного окна, в остальном метод работает.


 
McSimm ©   (2002-02-15 11:41) [6]

К слову, если реализовывать exe и dll с использованием vcl.bpl, то передача Application и Screen не требуется, т.к. в этом случае эти переменные и так будут общими для обоих приложений.


 
Алексей Петров (M) ©   (2002-02-15 11:45) [7]

Есть.
Но у них много шансов доставить авторам море удовольствия при отлове самых невероятных глюков.

А если один из модулей вдруг окажется собранным с другой версией Delphi - тогда вообще жуть...

Ну нельзя же так делать!!!!


 
McSimm ©   (2002-02-15 11:53) [8]

Алексей. Полностью согласен.

Но посмотри на это с такой стороны:

1.У меня есть подобное рабочее приложение. Кроме того, есть чужие приложения нормально работающие с этим методом.
2.Человек задает вопрос.
3.А я ему отвечаю: Сделать такое можно, у меня есть рабочий вариант. Но делать так некорректно. Поэтому лучше откажитесь от этой идеи.

:)


 
Алексей Петров (M) ©   (2002-02-15 11:54) [9]

Не возражаю.
Пусть делает человек как хочет. Его предупредили.


 
Kolyan ©   (2002-02-19 18:39) [10]

Спасибо за информацию. Вроде со всем разбрался.
:)



Страницы: 1 вся ветка

Текущий архив: 2002.03.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
4-19394
Remy
2002-01-06 23:19
2002.03.07
Помогите завершить все работающие задачи без всяких уведомлений...


3-19057
Quaker
2002-02-07 13:58
2002.03.07
MIDAS


1-19121
VID
2002-02-19 21:08
2002.03.07
Доступ к объекту другого приложения


4-19389
Igor_thief
2002-01-08 16:15
2002.03.07
Как перехватывать нажатие кнопочки минимизации?


1-19186
MaXie
2002-02-18 15:46
2002.03.07
Группа элементов -> один параметр