Форум: "Основная";
Текущий архив: 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.011 c