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

Вниз

MDI Child из DLL   Найти похожие ветки 

 
GarryFV   (2004-02-13 19:27) [0]

А вот такой интересный вопрос:

Занимаюсь написанием плагинов. Главное приложение - MDI.
Плагин при инициализации добавляет свой пункт меню в главное окно программы.
Соответствующая ему процедура находится в DLL и должна создать MDIChild окно.
Обычное окно проблем не вызывает, а вот

PluginMDIForm:=TPluginMDIForm.Create(Application);

вызывает исключение: Невозможно создать форму - нет активных MDI форм
(Cannot create form ...).

Т.е. DLL "не видит" главного MDI окна.

Синхронизацию объектов Application производил.

В общем сейчас в полных непонятках как это можно сделать.
Мастера, есть идеи?!

Заранее благодарен.


 
DarkUser ©   (2004-02-13 20:16) [1]

эта..., если-б в меня не начали тут-же кидатся чем-нть тяжелым, предложил-бы заменять Dll-шный Application exe-шниковским(т.е передавать в какую-нть процедуру инициализации dll-ки Application из exe и делать Application := AAplication, где AAplication и есть передаваемый в dll-ку из exe екземпляр), после ентого всё начинает прекрасно видеть(правда сама главная MDI-форма в exe-шнике дочерних в dll так и не увидит :( )

сами так делаем... и нам это нравится :)

да, и ещё, при закрытии dll-ки нужно указателю на Application присваивать старое значение, а-то неудобно может получится... :)

в любом случае удачи...


 
GarryFV   (2004-02-16 11:46) [2]

> ... предложил-бы заменять Dll-шный Application exe-шниковским(т.е передавать в какую-нть процедуру инициализации dll-ки Application из exe и делать Application := AAplication, где AAplication и есть передаваемый в dll-ку из exe екземпляр), после ентого всё начинает прекрасно видеть(правда сама главная MDI-форма в exe-шнике дочерних в dll так и не увидит :( )

Я же написал, что подобную синхронизацию производил :)
А вот что при закрытии старое значени восстанавливать нужно не слышал... Но до этого пока ещё и не дошло :). Форму бы создать.

Ну хоть успокоил, что это в принципе возможно. Буду дальше пробовать.

P.S. Наверное, не лучший момент задавать подобный вопрос в пятницу перед праздником :)) Поэтому вопрос остается в силе.


 
GarryFV   (2004-02-16 11:49) [3]

Забыл указать - всё на D7, WinXP. Хотя по-моему это особого значения не имеет. DLL она и в Африке DLL.


 
DarkUser ©   (2004-02-16 12:49) [4]


> Я же написал, что подобную синхронизацию производил :)

ой, не заметил сразу... попробуй создавать не от Application, а от Application.MainForm...

а вообще на http://www.delphikingdom.com, если задать поиск в ответах по TApplication, много что можна найти по проблеме связывания Exe-шников и Dll-ок...

единственное шо могу добавить, мы сейчас реализуем класс формы в Dll-ке, экспортируем его как TFormClass в exe-шник, и там и создаем и разрушаем...
проблема только одна - главное MDI окно - не видит экспортируемых из dll - дочерних... хотя именно для нашего проекта это и не нужно...

удачи...


 
Юрий Зотов ©   (2004-02-16 12:59) [5]

> GarryFV

Используйте BPL вместо DLL и не будет никаких проблем. Пример здесь:
http://www.delphimaster.ru/download/other9.html


 
Skier ©   (2004-02-16 13:03) [6]

>GarryFV (13.02.04 19:27)
создавай главную форму через Application.CreateForm(...) чтобы
проинициализировать Application.MainForm


 
GarryFV   (2004-02-16 13:03) [7]

Ой, я тоже немного не то делал... :).

Точнее я делал как по учебнику: {DLL}Application.Handle:={Exe}Apllication.Handle;

А сейчас скопировал сам объект Application. Вроде работает, только бы глюки не повылазили. Все-таки объект Application содержит String-и. А тягать String-и туда сюда чревато.

По поводу того, что Main не видит своих Children мне это тоже на надо. Плагин на то и плагин, чтобы сбоку стоять :).
Если Main будет знать, что делать с конкретной формой плагина, то это уже не плагин будет, а часть самого проекта.

Ну... Большой тебе Тханкс :).


 
GarryFV   (2004-02-16 13:08) [8]

Точнее, всем!

Насчет BPL - подразумевается, что плагины не только на Delphi могут писАться, хотя нечего далеко так заглядывать. Как на CPP состыковать CHild форму и главное приложение вообще не ясно...


 
Юрий Зотов ©   (2004-02-16 13:13) [9]

> GarryFV (16.02.04 13:08) [8]
> Как на CPP состыковать CHild форму и главное приложение
> вообще не ясно...

Особенно, если учесть, что в Windows нет никаких Form и Application...


 
Skier ©   (2004-02-16 13:18) [10]

Oops. А главное-то окно не в DLL создаётся. Мои извинения. Был не прав.


 
GarryFV   (2004-02-16 15:54) [11]

> Особенно, если учесть, что в Windows нет никаких Form и Application...

Это да. Ну да ведь VCL только wrapper для API, так что всё возможно. Нужно только знать кое-что или по крайней мере хотеть узнать :).


 
KSergey ©   (2004-02-16 16:46) [12]

Не, нифига
Ради интереса посмотрел можно ли переделать так, чтобы внутри DLL определять на портирование MDI окон - замучаешься...
Там все крепко повязано на Application и Screen.

Вот лишь несколько примеров:

function TCustomForm.GetMDIChildCount: Integer;
var
I: Integer;
begin
Result := 0;
if (FormStyle = fsMDIForm) and (FClientHandle <> 0) then
for I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I].FormStyle = fsMDIChild then Inc(Result);
end;


Даже при определении числа дочерних MDI-окон уже используется экземпляр Screen, а он свой для DLL и хост-приложения.

procedure TCustomForm.CreateWindowHandle(const Params: TCreateParams);
var
CreateStruct: TMDICreateStruct;
begin
if (FormStyle = fsMDIChild) and not (csDesigning in ComponentState) then
begin
if (Application.MainForm = nil) or
( Application.MainForm.ClientHandle = 0) then
raise EInvalidOperation.Create(SNoMDIForm);
......
WindowHandle := SendMessage( Application.MainForm.ClientHandle,
WM_MDICREATE, 0, Longint(@CreateStruct));
......

Хендл MDI-клиент окна опять же берется из объекта Application.

В общем сделать это может и можно, но переписать придется весьма внушительный кусок, таково мое понимание... Во всяком случае перепахать придется прилично, для поиска удачных точек вклинивания.

PS
Хотя за филки я бы этой задачкой занялся (просто оказалось, что объем велик) - в принципе весьма увлекательно ;)


 
DarkUser ©   (2004-02-16 16:56) [13]

2 KSergey
вот и я грю, MDI-главная, MDIСhild-у в Dll-ках не увидит!! :(
и одним TScreen-ом здесь ни как не обойдешся :(

и опять-же, наскока я видел удачные реализации именно такого метода(MDI - плагинов) именно на Deliphi, все ограничивается Application-ом.


 
Юрий Зотов ©   (2004-02-16 17:00) [14]

> GarryFV (16.02.04 15:54) [11]
> Нужно только знать кое-что или по крайней мере хотеть
> узнать.

Что означает эта фраза, мне понять так и не удалось. Тем не менее, могу Вам сказать, что пока Вы в DLL не избавитесь от Screen и Application, о разработке DLL средствами, отличными от Delphi можете даже и не мечтать. А для того, чтобы избавиться, попахать потребуется изрядно. И даже ОЧЕНЬ изрядно.

Поэтому о прикрутке к дельфишному Exe с главной формой НЕдельфишных DLL с дочерними окнами, скорее всего, придется просто забыть. А в этом случае самое простое и надежное решение - BPL, а не DLL.

Так что думайте.


 
GarryFV ©   (2004-02-16 18:55) [15]

Ю > Что означает эта фраза, мне понять так и не удалось...

Да это было просто лирическое отступление на тему, что без особого желания нечего лезть в дебри, если к тому же существует более легкий и надежный способ :)

За примерчик спасибо, буду помотреть. Вот ещё по док-ам пошарюсь насчёт BPL в плагинах...


 
Amoeba ©   (2004-02-16 18:59) [16]


> насчёт BPL в плагинах

На Королевстве Дельфи на эту тему есть большая статья


 
Defunct ©   (2004-02-16 21:02) [17]

Юрий Зотов © (16.02.04 17:00) [14]
> Тем не менее, могу Вам сказать, что пока Вы в DLL не избавитесь от Screen и Application, о разработке DLL средствами, отличными от Delphi можете даже и не мечтать.

Borland C++ Builder
Все тот же TApplication, и TScreen


 
Юрий Зотов ©   (2004-02-16 21:07) [18]

> Defunct © (16.02.04 21:02) [17]

Не может быть!


 
Marser ©   (2004-02-16 23:55) [19]


> Borland C++ Builder
> Все тот же TApplication, и TScreen

Ага! Там и хелп с делфийными примерами :-))

> Юрий Зотов © (16.02.04 21:07) [18]
> > Defunct © (16.02.04 21:02) [17]
>
> Не может быть!

:-))


 
Defunct ©   (2004-02-17 00:08) [20]

> Ага! Там и хелп с делфийными примерами :-))
Так и есть, сам удивлялся вначале.


 
Marser ©   (2004-02-17 00:11) [21]


> > Ага! Там и хелп с делфийными примерами :-))
> Так и есть, сам удивлялся вначале.

Я даже не удивлялся...


 
KSergey ©   (2004-02-17 09:04) [22]

Ну и что, что хелп с дельфийскими примерами??? Ну и что, что текст VCL возможно одинаков? Да даже если описание класса TApplication совпадает - неужели вы уверены, что после компиляции это будет одно и тоже? Включая формат таблиц виртуальных функций, динамический функций, методов-обработчиков сообщений?
Ребяты, ну нельзя же быть такими наивными? Да я и на VC++, например, могу запузырить класс и сменем TScreen - и что с того?



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

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

Наверх




Память: 0.53 MB
Время: 0.018 c
1-93979
Sear
2004-02-13 15:53
2004.02.29
Проблема копирования строк/столбцов в StringGrid и DBGrid


1-93969
siriusP
2004-02-17 14:35
2004.02.29
Помогите написать callback функцию


1-93999
zamkom
2004-02-16 16:02
2004.02.29
Оптимизация.


8-94041
Urvin
2003-10-25 10:39
2004.02.29
Multimedia API


6-94087
S@shka
2003-12-25 13:21
2004.02.29
Как правильно??? TClientSocket