Главная / FAQ по Builder'у / 108 Как засyнyть несколько фоpм...

108 Как засyнyть несколько фоpм в DLL, а потом вызывать их из дpyгого пpиложения?


1-й способ

Запросто. Если с базами работаешь, то нужно передать параметром указатель на
базу, а затем, перед показом формы произвести переприсвоение используемых
базовых компонентов переданному указателю.

//--------------------------------------------------------------------------

#include <vcl.h>
#include <windows.h>
#include "Unit1.h"
#pragma hdrstop
#pragma argsused


int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*
lpReserved)
{
        return 1;
}
//--------------------------------------------------------------------------
extern "C" int __declspec (dllexport) WINAPI Login()
{
  try
    {
     if(BringWindowToTop(FindWindow("TfrmLogin","Вход в систему"))!=0)
return 0;

     frmLogon=new TfrmLogon(NULL); // Создаем форму.
     frmLogon->ShowModal(); /* Открываем как модальную. Можно, в принципе, и
как обычную с помощью Show();*/
     delete frmLogon; /* А вот это не обязательно. Можно в событии Close
прописать освобождать память. последенее время я обхожусь без delete*/
    }
      catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
 return 1;
}

Cолошенко Дмитрий

2-й способ

Пример форма Filtr в dll. Делаешь проект dll. Создаешь там форм сколько
хочешь, только в хедере dll:

    #ifdef __BUILDING_THE_DLL
     #define ET __export
     #else
     #define ET __import
    #endif

__BUILDING_THE_DLL определяется в опциях компилятора проекта dll
(conditional defines). В программе гду dll используется не нужно.

Форма в хедере объяавляется так:

class ET TFiltr;
class TFiltr : public TForm
{
__published: // IDE-managed Components
        TPanel *Panel1;
        TComboBox *cb_ident;

...
};
extern PACKAGE TFiltr *Filtr;
и т.д.

В программе вызова, для создания формы рекомендую стандартный метод, что
можно найти в WinMain.

Application->CreateForm(__classid(TFiltr), &Filtr);
Filtr->Tag = (int)&Filtr;
Filtr->Show();

Таg использую для хранения адреса указателя формы. Когда форма закрывается,
память освобождается (Action = caFree; в FormClose), однако указатель не
становится NULL, что затрудняет блокировку от вторичного запуска. Hо в форме
по событию onDestroy я обнуляю этот указатель и все тип-том.

void __fastcall TFiltr::FormDestroy(TObject *Sender)
{
int *addr = (int*)Tag;    /* нужно перед полной ликвидацией обнулить
указатель на форме вызова */
*addr=NULL;
}
Alexander Koryagin

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz