Модальная форма из DLL
WBTablePropertysForm->ShowModal();
Owner это указатель на класс TMainForm из вызывающего exe-шника.
WBTablePropertysForm появляется почему то не модально и в панели задач торчит отдельной задачей...
как ее сделать модальной, по отношению к TMainForm и убрать из панели задач?
WBTablePropertysForm->ShowModal();
Owner это указатель на класс TMainForm из вызывающего exe-шника.
WBTablePropertysForm появляется почему то не модально и в панели задач торчит отдельной задачей...
как ее сделать модальной, по отношению к TMainForm и убрать из панели задач?
Если вы объясните мне в чем преимущество вашего кода над примерно вот таким:
WBTablePropertysForm->ShowModal();
if(WBTablePropertysForm->ModalResalt == mrOk)
//Обработка формы и удаление
__finally{
delete WBTablePropertysForm;
}
то возможно мы и найдем ошибку. использование шаблона auto_ptr здесь абсолютно излишне и не понятно.
т.е не надо самому следить за удалением объекта, соотетсвенно при исключении не будет "утечки"памяти
принципиальной разницы вобщем то нет...
ЗЫ: вопрос в другом был...
ЗЫЗЫ: ошибка была в передаче TForm (надо TApplication)
т.е не надо самому следить за удалением объекта, соотетсвенно при исключении не будет "утечки"памяти
принципиальной разницы вобщем то нет...
ЗЫ: вопрос в другом был...
ЗЫЗЫ: ошибка была в передаче TForm (надо TApplication)
в форму вполне можно (и правильно) передавать NULL. Это говорит о том что вы сами - или шаблон будет отвечать за удаление объекта.
З.Ы. Если не вызывается более чем одна форма (а она не может вызываться более чем одна по условию) - то более правильным является явный вызов и явное удаление формы. Использование шаблона в данном случае - да и еще с владельцем TApplication - как раз прямой путь к появлению утечек.
З.Ы. А по вопросу исключений - так их надо обрабатывать. тем более в билдере есть конструкция __finally
2. Каким образом будут утечки, если auto_ptr cледит за удалением объекта, и при чет тут вообще TApplication?
3. Про __finally догадывался, но не пользовал ни разу
Вобще то владелец - это не относительно чего она будет модальной - это кто отвечает за ее разрушение. Модальная форма предполагает блокирование потока ввода до тех пор пока пользователь ее не закроет.
2. Каким образом будут утечки, если auto_ptr cледит за удалением объекта, и при чет тут вообще TApplication?
если владелец формы - приложение то форма будет разрушена тогда когда приложение завершится. Т.е. вызов нескольких форм приведет к появлению объектов которые очистят память только по завершению владельца.
3. Про __finally догадывался, но не пользовал ни разу
используй. по крайней мере это достаточно неплохое расширение языка (ИМХО), которое позволяет гибко обрабатывать исключения.
возвращаясь к началу темы: как ее сделать модальной, если она в DLL?
auto_ptr разрушает объект при выходе из ф-ции в которой с его помощью этот объект создается...
http://forum.codenet.ru/showthread.php?t=42871 (последний ответ)
Модальные формы, которые вызываются из длл - вызываются как модальные формы. Я для этого использую тот код который привел выше. Формы вызываются как модальные в контексте данного приложения.
auto_ptr разрушает объект при выходе из ф-ции в которой с его помощью этот объект создается...
http://forum.codenet.ru/showthread.php?t=42871 (последний ответ)
да. но формой управляет другой объект. возможно она будет разрушена. возможно нет. никаких гарантий на этот счет ты не имеешь. ИМХО - могу ошибаться. но мое мнение - для таких задач использование шаблона auto_ptr не верно и не оправданно. но это ИМХО.
При передаче в Owner TApplication вроде все нормально, с одним минусом: работает корректно только *.bpl-ками
При передаче в Owner TApplication вроде все нормально, с одним минусом: работает корректно только *.bpl-ками
мммм. ДЛЛ в которой форма - она аттачится в процесс? Или запускается как отдельный? Я по крайней мере не сталкивался с подобным - если форма вызывается и запускается как модальная - она так же и работает. Поэтому сложно сказать в чем проблема.
к стати если Owner = NULL тогда будет ошибка "...has no parent window"
не совсем понятен вопрос:
LoadLibrary(...) в exe
в dll:
как я описал... т.е. кроме *.cpp самой длл есть dfm и cpp формы в проекте dll
к стати если Owner = NULL тогда будет ошибка "...has no parent window"
тогда давай по порядку. Какого типа окно? Мой код работает с классом унаследованным от TForm и никаких ошибок не вызывает. Вот конкретный работающий пример:
#ifndef loadmoduleH
#define loadmoduleH
#include <SysUtils.hpp>
//---------------------------------------------------------------------------
extern "C" __declspec(dllexport) AnsiString ReturnProperty();
extern "C" __declspec(dllexport) HWND LoadForm(HWND Handler,const char *connect);
extern "C" __declspec(dllexport) HWND NewDoc(HWND Handler,const char *connect,const int &clienttype);
#endif
//loadmodule.cpp
#pragma hdrstop
#include "loadmodule.h"
#include "main.h"
//---------------------------------------------------------------------------
HWND LoadForm(HWND Handler,const char *connect){
TfmMain *fmMain = new TfmMain(NULL);
fmMain->SetConnect(Handler,connect);
fmMain->ShowModal();
delete fmMain;
return 0;
}
#pragma package(smart_init)
Вызывается так:
pLoadForm fLoadForm;
HINSTANCE hDll = LoadLibrary("categorywork.dll");
fLoadForm = (pLoadForm)GetProcAddress(hDll,"_LoadForm");
String temp = WideCharToString(dmMain->adoConnect->ConnectionString);
fLoadForm(this->Handle,temp.c_str());
FreeLibrary(hDll);
В функцию SetConnect передается хендлер вызывающего окна - что бы можно было уведомлять его о происходящих событиях, и строка подключения к базе. Окно отображается модально и работает в потоке приложения.
void __stdcall(*ShowModalForm)(void);
if (dllp) {
ShowModalForm = (void __stdcall (*)(void)) GetProcAddress(dllp, "ShowModalForm");
if (ShowModalForm)
ShowModalForm();
}
FreeLibrary(dllp);
в dll:
{
TForm2 *Form2 = new TForm2 (NULL);
Form2->ShowModal();
delete Form2;
}
форма показывается модально, однако в панели задач торчит отдельным окном