загрузка формы из Dll
bool PluginExec()
{
bool res;
TForm1 *Form1=new TForm1(Application);
res=Form1->ShowModal();
Form1->Free();
return res;
}
Но мне нужно вызвать не Form1->ShowModal(), а
Form1->Show().Как лучше переписать фун-ию?
Нужно из приложения вызывать форму из DLL.Написал такое:
bool PluginExec()
{
bool res;
TForm1 *Form1=new TForm1(Application);
res=Form1->ShowModal();
Form1->Free();
return res;
}
Но мне нужно вызвать не Form1->ShowModal(), а
Form1->Show().Как лучше переписать фун-ию?
ДЛЛ грузится в адресное пространство вызывающего процесса и находится там, покуда не будет выгружена. Создавай глобальную TForm* и две эксп. функции загрузить и освободить.
ДЛЛ грузится в адресное пространство вызывающего процесса и находится там, покуда не будет выгружена. Создавай глобальную TForm* и две эксп. функции загрузить и освободить.
Только учти глобальная будет "помнить" только последнюю созданную форму, соответственно и убить сможешь только посленюю.
Чтобы иметь возможность убивать каждую из созданных нужно запоминать все указатели формочек в некий контейнер.
Либо позаботиться о том, чтобы пользователь мог сгенерить только одну формочку.
Но в любом случае нужно как-то следить за тем, что пользователь закрыл форму...
Можно еще предложить создавать "плугинную" формочку в отдельном потоке - тогда и главная форма не будет блокироваться и всегда при закрытии каждая из формочек будет удаляться, но это придумал на вскидку - не проверял.
Кстати, все, что создано с помощью оператора new должно убиваться с помощью delete, если не ошибаюсь...
В методе ДЛЛ, создающем форму пишем:
FormX->Show();
!!! Метод свою работу завершает не дожидаясь закрытия формы.
А в классе формы на метод ОнКлоуз повесить:
И все дела. И окошек сколько хочешь, и по закрытии каждое самоудаляется.
Все оказалось гораздо проще:
В методе ДЛЛ, создающем форму пишем:
FormX->Show();
!!! Метод свою работу завершает не дожидаясь закрытия формы.
А в классе формы на метод ОнКлоуз повесить:
И все дела. И окошек сколько хочешь, и по закрытии каждое самоудаляется.
В функцию передавать хедер главной а возвращать хедер формы длл, и хранить их. При закрытии посылай сообщение главной форме о том что форма закрылась, а перед закрытием приложения посылать закрывающие сообщения всем не закрытым формам.
... а перед закрытием приложения посылать закрывающие сообщения всем не закрытым формам.
Даже этого делать даже не нужно:). Формочки, при попытке закрытия главной, сами без проблем поочереди закрываются, и главная в конце...
----------------------------------------------
У меня вопрос почти в тему:
Обратил внимание, что при вызове формы из ДЛЛ (отображаю через ШоуМодал) на панели задач появляется дополнительная кнопка. Если кликнуть по изначальной кнопке, то активной становится полностью "мертвая" главная форма. Как попростому сделать, так чтобы новая кнопка не появлялась, а при клике по исходной, активной становилась вызванная формочка?