Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.29;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.01 c
1-93876
BALU1111
2004-02-16 11:18
2004.02.29
Вывод длинной строки.


14-94143
heady
2004-02-02 20:40
2004.02.29
Delphi 7 Help


1-93966
Aleksandr
2004-02-17 14:33
2004.02.29
Скажите, а есть компоненты для показа Флэш-баннеров?


6-94086
Alex21
2003-12-25 15:13
2004.02.29
Помогите с айпишником


11-93830
BaRToV
2003-06-12 03:03
2004.02.29
XHelpGen & xHelpGenCm





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