Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Модальная форма из DLL

11
09 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
В длл динамически создается форма:

 
Код:
auto_ptr<TWBTablePropertysForm>WBTablePropertysForm(new TWBTablePropertysForm (Owner));
WBTablePropertysForm->ShowModal();


Owner это указатель на класс TMainForm из вызывающего exe-шника.
WBTablePropertysForm появляется почему то не модально и в панели задач торчит отдельной задачей...
как ее сделать модальной, по отношению к TMainForm и убрать из панели задач?
1
10 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
В длл динамически создается форма:

 
Код:
auto_ptr<TWBTablePropertysForm>WBTablePropertysForm(new TWBTablePropertysForm (Owner));
WBTablePropertysForm->ShowModal();


Owner это указатель на класс TMainForm из вызывающего exe-шника.
WBTablePropertysForm появляется почему то не модально и в панели задач торчит отдельной задачей...
как ее сделать модальной, по отношению к TMainForm и убрать из панели задач?


Если вы объясните мне в чем преимущество вашего кода над примерно вот таким:

 
Код:
WBTablePropertysForm = TWBTablePropertysForm(NULL/*или зис*/);
WBTablePropertysForm->ShowModal();
if(WBTablePropertysForm->ModalResalt == mrOk)
//Обработка формы и удаление
__finally{
delete WBTablePropertysForm;
}

то возможно мы и найдем ошибку. использование шаблона auto_ptr здесь абсолютно излишне и не понятно.
11
10 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
delete WBTablePropertysForm; не надо писать...
т.е не надо самому следить за удалением объекта, соотетсвенно при исключении не будет "утечки"памяти
принципиальной разницы вобщем то нет...
ЗЫ: вопрос в другом был...
ЗЫЗЫ: ошибка была в передаче TForm (надо TApplication)
1
10 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
delete WBTablePropertysForm; не надо писать...
т.е не надо самому следить за удалением объекта, соотетсвенно при исключении не будет "утечки"памяти
принципиальной разницы вобщем то нет...
ЗЫ: вопрос в другом был...
ЗЫЗЫ: ошибка была в передаче TForm (надо TApplication)


в форму вполне можно (и правильно) передавать NULL. Это говорит о том что вы сами - или шаблон будет отвечать за удаление объекта.
З.Ы. Если не вызывается более чем одна форма (а она не может вызываться более чем одна по условию) - то более правильным является явный вызов и явное удаление формы. Использование шаблона в данном случае - да и еще с владельцем TApplication - как раз прямой путь к появлению утечек.
З.Ы. А по вопросу исключений - так их надо обрабатывать. тем более в билдере есть конструкция __finally

11
10 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
1. как в таком случае (в форму вполне можно (и правильно) передавать NULL) форма будет знать, относительно чего быть модальной?
2. Каким образом будут утечки, если auto_ptr cледит за удалением объекта, и при чет тут вообще TApplication?
3. Про __finally догадывался, но не пользовал ни разу
1
10 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
1. как в таком случае (в форму вполне можно (и правильно) передавать NULL) форма будет знать, относительно чего быть модальной?


Вобще то владелец - это не относительно чего она будет модальной - это кто отвечает за ее разрушение. Модальная форма предполагает блокирование потока ввода до тех пор пока пользователь ее не закроет.

Цитата: oxotnik333

2. Каким образом будут утечки, если auto_ptr cледит за удалением объекта, и при чет тут вообще TApplication?


если владелец формы - приложение то форма будет разрушена тогда когда приложение завершится. Т.е. вызов нескольких форм приведет к появлению объектов которые очистят память только по завершению владельца.

Цитата: oxotnik333

3. Про __finally догадывался, но не пользовал ни разу



используй. по крайней мере это достаточно неплохое расширение языка (ИМХО), которое позволяет гибко обрабатывать исключения.

11
10 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kot_
Вобще то владелец - это не относительно чего она будет модальной - это кто отвечает за ее разрушение. Модальная форма предполагает блокирование потока ввода до тех пор пока пользователь ее не закроет.


возвращаясь к началу темы: как ее сделать модальной, если она в DLL?

Цитата: kot_
если владелец формы - приложение то форма будет разрушена тогда когда приложение завершится. Т.е. вызов нескольких форм приведет к появлению объектов которые очистят память только по завершению владельца.


auto_ptr разрушает объект при выходе из ф-ции в которой с его помощью этот объект создается...
http://forum.codenet.ru/showthread.php?t=42871 (последний ответ)

1
10 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
возвращаясь к началу темы: как ее сделать модальной, если она в DLL?


Модальные формы, которые вызываются из длл - вызываются как модальные формы. Я для этого использую тот код который привел выше. Формы вызываются как модальные в контексте данного приложения.

Цитата: oxotnik333

auto_ptr разрушает объект при выходе из ф-ции в которой с его помощью этот объект создается...
http://forum.codenet.ru/showthread.php?t=42871 (последний ответ)


да. но формой управляет другой объект. возможно она будет разрушена. возможно нет. никаких гарантий на этот счет ты не имеешь. ИМХО - могу ошибаться. но мое мнение - для таких задач использование шаблона auto_ptr не верно и не оправданно. но это ИМХО.

11
10 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
такой подход (new/delete, Owner = NULL)я тоже пробовал... разницы нет... все равно она не модально и торчит отдельной задачей в панели задач...
При передаче в Owner TApplication вроде все нормально, с одним минусом: работает корректно только *.bpl-ками
1
10 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
такой подход (new/delete, Owner = NULL)я тоже пробовал... разницы нет... все равно она не модально и торчит отдельной задачей в панели задач...
При передаче в Owner TApplication вроде все нормально, с одним минусом: работает корректно только *.bpl-ками


мммм. ДЛЛ в которой форма - она аттачится в процесс? Или запускается как отдельный? Я по крайней мере не сталкивался с подобным - если форма вызывается и запускается как модальная - она так же и работает. Поэтому сложно сказать в чем проблема.

1
10 ноября 2007 года
kot_
7.3K / / 20.01.2000
Код который привел я - он соответствует?
11
10 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
соответсвует, за исключением __finally...

к стати если Owner = NULL тогда будет ошибка "...has no parent window"
11
10 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
Цитата: kot_
мммм. ДЛЛ в которой форма - она аттачится в процесс? Или запускается как отдельный? Я по крайней мере не сталкивался с подобным - если форма вызывается и запускается как модальная - она так же и работает. Поэтому сложно сказать в чем проблема.


не совсем понятен вопрос:
LoadLibrary(...) в exe
в dll:
как я описал... т.е. кроме *.cpp самой длл есть dfm и cpp формы в проекте dll

1
11 ноября 2007 года
kot_
7.3K / / 20.01.2000
Цитата: oxotnik333
соответсвует, за исключением __finally...

к стати если Owner = NULL тогда будет ошибка "...has no parent window"


тогда давай по порядку. Какого типа окно? Мой код работает с классом унаследованным от TForm и никаких ошибок не вызывает. Вот конкретный работающий пример:

Код:
//loadmodule.h
#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)

Вызывается так:
 
Код:
typedef HWND (__import *pLoadForm)(HWND Handler,const char* connect);
 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 передается хендлер вызывающего окна - что бы можно было уведомлять его о происходящих событиях, и строка подключения к базе. Окно отображается модально и работает в потоке приложения.
11
12 ноября 2007 года
oxotnik333
2.9K / / 03.08.2007
в exe:
 
Код:
HINSTANCE dllp = LoadLibrary("DLL.dll");
  void __stdcall(*ShowModalForm)(void);
  if (dllp) {
              ShowModalForm = (void __stdcall (*)(void)) GetProcAddress(dllp, "ShowModalForm");
          if (ShowModalForm)
                  ShowModalForm();
         }
  FreeLibrary(dllp);


в dll:
 
Код:
extern "C" void __export __stdcall ShowModalForm (void)
{
  TForm2 *Form2 = new TForm2 (NULL);
  Form2->ShowModal();
  delete Form2;
}


форма показывается модально, однако в панели задач торчит отдельным окном
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог