Формы в Dll

  • Автор темы nikolasiii
  • Дата начала
Статус
Закрыто для дальнейших ответов.
N

nikolasiii

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

Заранее благодарен.
 
N

nikolasiii

#2
Для: sax_ol

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

nikolasiii

#3
Для: sax_ol

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

nikolasiii

#4
Для: sax_ol

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

nikolasiii

#5
Для: sax_ol


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

Grumza

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

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

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

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


Код:
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.
--=========================================================

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


Код:
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.
--==========================================================
И модуль библиотеки которая грузит форму

Код:
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)

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


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