Za wiele na razie nie mam bo to wstępne przymiarki do przełożenia aplikacji do dll.
Założenie było takie aby wszystko wsadzić do dll i dopisać mały program inicjujący, niestety poległem na tworzeniu formy fsMDIForm w dll'u więc wygląda to tak że w exe mam fsMDIForm a w dll DataModule i fsMDIChild (reszta w planach);
DLL
library formDll;
uses
ShareMem,
Forms,
SysUtils,
Classes,
Windows,
uMain in 'uMain.pas' {frmMain}, // to miał być fsMDIForm
uDM in 'uDM.pas' {DM: TDataModule},
uTable in 'uTable.pas' {frmTable},
uShare in 'uShare.pas';
{$R *.res}
procedure MyDLLProc(Reason: Integer); stdcall;
begin
if Reason = DLL_PROCESS_DETACH then
if Assigned(DllApp) then
begin
Application := DllApp;
Screen := DllScreen;
end;
end;
exports
ShowMain name 'ShowMain',
MyDllProc name 'MyDllProc';
begin
end.
unit uShare;
interface
uses
Windows, Forms, Dialogs, SysUtils, Classes;
var
DllApp : TApplication;
DllScreen : TScreen;
procedure ShowMain(App : TApplication; Scr : TScreen); stdcall;
exports
ShowMain;
implementation
Uses uTable, uDM;
procedure ShowMain(App : TApplication; Scr : TScreen); stdcall;
begin
if not Assigned(DllApp) then
begin
DllApp := Application;
DllScreen := Screen;
Application := App;
Screen := Scr;
end;
if not DM.DataBase.Connected then // DataBase = ZConnection
DM.DataBase.Connect;
DM.qZ.Open;
frmTable := TfrmTable.Create(Application);
frmTable.Show;
frmTable.DBGrid1.DataSource := DM.dsZ;
frmTable.DBEdit1.DataSource := DM.dsZ;
frmTable.DBEdit1.DataField := 'nazwisko';
end;
end.
W DataModule tylko sekcje initialization/finalization.
EXE
...
var
Form1: TForm1;
procedure ShowMain(App : TApplication; Src : TScreen); stdcall external 'formDll.dll' name 'ShowMain';
procedure MyDLLProc(Reason: Integer); stdcall external 'formDll.dll' name 'MyDllProc';
implementation
{$R *.dfm}
procedure TForm1.Show1Click(Sender: TObject);
begin
ShowMain(Application, Screen);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
i : integer;
begin
for I := 0 to MDIChildCount -1 do
begin
MDIChildren[i].Free;
end;
MyDllProc(DLL_PROCESS_DETACH);
end;
end.