Формы в Dll

Тема в разделе "Delphi - Базы данных", создана пользователем nikolasiii, 23 авг 2007.

Статус темы:
Закрыта.
  1. nikolasiii

    nikolasiii Гость

    Доброго всем времени суток.
    Использую модульную архитектуру при разработке приложений.
    В модулях (dll) храню формы. dll подключаю динамически.
    Приложения у меня MDI.
    Модули я делаю чтобы exe-шник не раздувался и чтобы использовать одни и те же модули разными приложениями.
    С модальными формами я разобрался, всё работает на "Ура!", а с формами MDI проблема.
    Не очень хорошо представляю себе как можно работать с TApplication и TForm используя dll.
    Прошу вас помочь мне. В инете мало чего есть по использованию MDI. Может для этого есть другие решения? Не знаю. Я решил сделать так. Хотя есть у меня один вариант, но после вызова формы не работает кнопка Tab на клавиатуре. Даже код могу показать код:

    //вызывается после выгрузки dll
    procedure MyDLLProc(Reason: Integer);
    begin
    if Reason = DLL_PROCESS_DETACH then
    if assigned(App) then Application:=App;
    end;

    procedure FormCreate(var aApp:TApplication;aComp:TComponent);
    begin
    if not assigned(FrmAutorization) then
    begin
    DllProc:=@MyDLLProc;
    if not assigned(App) then
    begin App:=Application;Application:=aApp;end;
    FrmAutorization:=TFrmAutorization.Create(aComp);
    end;
    end;

    Заранее благодарен.
     
  2. nikolasiii

    nikolasiii Гость

    Для: sax_ol

    Спасибо.
    В краце, если можно, что такое bpl и где про него можно поискать. Я так понимаю что это пакет.
     
  3. nikolasiii

    nikolasiii Гость

    Для: sax_ol

    Хорошо тем кто разбирается в английском. :)
    И за это спасибо. Буду разбираться. :blink:
     
  4. nikolasiii

    nikolasiii Гость

    Для: sax_ol

    у меня ещё один вопрос.
    почему не высвобождается память после HLib:=LoadLibrary(PChar(aPath));
    хотя в конце я делаю FreeLibrary(HLib);
    Это я заметил в диспетчере объектов. Каждый раз при вызове процедуры (именно при вызове LoadLibrary()) память уменьшается на 4 Кб.
     
  5. nikolasiii

    nikolasiii Гость

    Для: sax_ol


    Огромнейшее спасибо за подсказку (bpl) и за сайт.
    Вы мне очень помогли.
    Ура!
    Я решил свою проблему с формами в модулях.
    :blink: :) :D
     
  6. Grumza

    Grumza Гость

    Доброго времени суток господа!!!

    Случайно наткнулся на эту тему!! с такой проблемой сталкивался и у меня есть готовое хорошее решение!

    ======================================================================

    Создаем главную форму, FormStyle =MDI Form;
    Вот исходник моей формы


    Код (Text):
    unit Main;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    ExtCtrls, Menus, ComCtrls;

    type
    TInitProc  = procedure(App, Scr: integer); StdCall;
    TDoneProc  = procedure; StdCall;
    TCreateProc = function: integer; StdCall;

    type
    TfrmMain = class(TForm)
    procedure Exit1Click(Sender: TObject);
    procedure Cascade1Click(Sender: TObject);
    procedure Arrange1Click(Sender: TObject);
    procedure About1Click(Sender: TObject);
    procedure Newlocal1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure NewDLL1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    private
    { Private declarations }
    FLib      : THandle;
    InitPlugin : TInitProc;
    DonePlugin : TDoneProc;
    CreateMDI : TCreateProc;
    public
    { Public declarations }
    end;

    var
    frmMain: TfrmMain;

    implementation

    {$R *.DFM}

    uses
    About, MDILOC;

    procedure TfrmMain.FormCreate(Sender: TObject);
    begin
    FLib := LoadLibrary(PChar('mdidll.dll'));
    @InitPlugin := GetProcAddress(FLib, PChar('InitPlugin'));
    @DonePlugin := GetProcAddress(FLib, PChar('DonePlugin'));
    @CreateMDI := GetProcAddress(FLib, PChar('CreateMDI'));
    InitPlugin(integer(Application), integer(Screen));
    end;

    procedure TfrmMain.FormDestroy(Sender: TObject);
    begin
    DonePlugin;
    FreeLibrary(FLib);
    end;

    procedure TfrmMain.Exit1Click(Sender: TObject);
    begin
    Close;
    end;

    procedure TfrmMain.Cascade1Click(Sender: TObject);
    begin
    Application.MainForm.Cascade;
    end;

    procedure TfrmMain.Arrange1Click(Sender: TObject);
    begin
    Application.MainForm.ArrangeIcons;
    end;

    procedure TfrmMain.About1Click(Sender: TObject);
    begin
    TfrmAbout.Create(Application).ShowModal;
    end;

    procedure TfrmMain.Newlocal1Click(Sender: TObject);
    begin
    TfrmMDI_local.Create(Application);
    end;

    procedure TfrmMain.NewDLL1Click(Sender: TObject);
    var X: TForm;
    begin
    X := TForm(CreateMDI);
    end;


    end.
    --=========================================================

    Естесно модуль самой формы


    Код (Text):
    unit MDILIB;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    Menus;

    type
    TfrmMDI_dll = class(TForm)
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    frmMDI_dll: TfrmMDI_dll;

    implementation

    {$R *.DFM}

    procedure TfrmMDI_dll.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    Action := caFree;
    end;

    end.
    --==========================================================
    И модуль библиотеки которая грузит форму

    Код (Text):
    library mdidll;


    uses
    SysUtils,
    Classes,
    Forms,
    MDILIB in 'MDILIB.pas' {frmMDI_dll};

    var
    DA : TApplication;
    DS : TScreen;

    procedure InitPlugin(App, Scr: integer); StdCall;
    var DA: TApplication; DS: TScreen;
    begin
    DS := Screen;
    Screen := TScreen(Scr);
    DA := Application;
    Application := TApplication(App);
    end;

    procedure DonePlugin; StdCall;
    begin
    Screen := DS;
    Application := DA;
    end;

    function CreateMDI: integer; StdCall;
    begin
    Result := integer(TfrmMDI_dll.Create(Application));
    end;

    exports
    InitPlugin,
    DonePlugin,
    CreateMDI;

    begin
    end.
    ---=======================================================

    При этом необходимо поставить галочку в свойствах пректа
    Project -->Options -->Packages ----> Галочка (Build with runtime packages)

    Всё должно работать как часики!!!


    кому не понятно могу пояснить как главная форма передает свой скрин на форму из библиотеке!!
     
  7. Grumza

    Grumza Гость

    Сорри не знал!! седня первый день зарегился!
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей