Формы в Dll

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

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

    nikolasiii Гость

    Репутация:
    0
    Доброго всем времени суток.
    Использую модульную архитектуру при разработке приложений.
    В модулях (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 Гость

    Репутация:
    0
    Для: sax_ol

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

    nikolasiii Гость

    Репутация:
    0
    Для: sax_ol

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

    nikolasiii Гость

    Репутация:
    0
    Для: sax_ol

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

    nikolasiii Гость

    Репутация:
    0
    Для: sax_ol


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

    Grumza Гость

    Репутация:
    0
    Доброго времени суток господа!!!

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

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

    Создаем главную форму, 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 Гость

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

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