unit FormDLLU;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TFormDLL = class(TForm)
Timer: TTimer;
ExitBtn: TButton;
TimeLbl: TLabel;
procedure TimerTimer(Sender: TObject);
procedure ExitBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
t: Integer;
{*--}
ParentForm: THandle; { Родительская форма (её Handle) }
{--*}
end;
var
FormDLL: TFormDLL; { Форма, хранимая в библиотеке }
{ Показать форму
Отдельная процедура написана для экспорта }
procedure ShowForm(AOwner: TForm);
implementation
{$R *.dfm}
{ Показать форму }
procedure ShowForm(AOwner: TForm);
begin
FormDLL := TFormDLL.Create(AOwner); { Создать форму }
{*--}
FormDLL.ParentForm := AOwner.Handle;{ Запомнить Handle родительской формы }
{--*}
FormDLL.Show; { Показать форму (не модально) }
end;
procedure TFormDLL.TimerTimer(Sender: TObject);
begin
{ Здесь может быть любое действие
Таймер сделан для демонстрации длительности процесса }
Inc(t);
TimeLbl.Caption := 'Время выполнения: '+IntToStr(t)+ ' с.';
end;
procedure TFormDLL.ExitBtnClick(Sender: TObject);
begin
{ Здесь может быть любое действие }
Close;
end;
procedure TFormDLL.FormCreate(Sender: TObject);
begin
{ Здесь может быть любое действие }
t := 0;
{ Расположить форму в произвольном месте экрана }
Randomize;
Left := Random(Screen.Width - Width);
Top := Random(Screen.Height - Height);
end;
procedure TFormDLL.FormClose(Sender: TObject; var Action: TCloseAction);
begin
{*--}
{ Если надо, при закрытии формы передать сообщение об этом в главную (вызвавшую) форму }
if ParentForm <> 0 then SendMessage(ParentForm, WM_USER, 0, 0);
{--*}
{ После закрытия автоматически освободить память и уничтожить форму
Важно! Это действие надо, чтобы не занимать память оставшимися закрытыми форматми }
Action := caFree;
end;
end.
library ShowWin;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes,
ShellAPI,
Windows,
FormDLLU in 'FormDLLU.pas' {FormDLL};
{$R *.res}
{ Экспортируемые процедуры
RunExe - запускает внешнее приложение и выполняется дальше (не контролирует приложение)
1 - Блокнот, 2 - Калькулятор, иначе - Проводник }
procedure RunExe(n: Byte);
begin
case n of
1: ShellExecute(0, 'open', 'notepad.exe', nil, nil, SW_ShowNormal);
2: ShellExecute(0, 'open', 'calc.exe', nil, nil, SW_ShowNormal);
else ShellExecute(0, 'open', 'explorer.exe', nil, nil, SW_ShowNormal);
end;
end;
{ Экспортируемые процедуры и функции }
exports
RunExe, // Запустить внешнюю программу (после запуска не влияет на работу и не контролируется )
ShowForm; // Показать форму из библиотеки (описана в FormDLLU)
begin
end.
|