Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Вниз

Дочерняя форма в 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]

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.07;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.016 c
6-19294           Maximka               2001-12-19 07:37  2002.03.07  
Как узнать какие компы есть в сети


14-19299          vladislav             2002-01-20 18:22  2002.03.07  
Инсталляция Delphi


3-19056           Potemkin              2002-02-07 09:38  2002.03.07  
DBGrid


3-19077           Rub                   2002-02-08 11:54  2002.03.07  
Софтина использует BDE алиас типа для работы с корпоративной БД.....


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