Добрый день!
Ситуация такая:
Есть два пакета (Package1 и Package2) и общий для них модуль (uGlobal)
Package1:
Код:
unit uPack1;
interface
uses
System.SysUtils, System.Classes, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.Controls;
type
TfrmPack1 = class(TForm)
btnSetVal1: TButton;
btnShowVal1: TButton;
procedure btnSetVal1Click(Sender: TObject);
procedure btnShowVal1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmPack1: TfrmPack1;
implementation
{$R *.dfm}
uses uGlobal;
procedure TfrmPack1.btnSetVal1Click(Sender: TObject);
begin
SetValue(5);
end;
procedure TfrmPack1.btnShowVal1Click(Sender: TObject);
var
MyClass1: TMyClass;
begin
MyClass1 := TMyClass.create;
showmessage(inttostr(MyClass1.ClassInt));
MyClass1.Free;
end;
initialization
RegisterClass(TfrmPack1);
if Assigned(getclass('TfrmPack1')) then
showmessage('Pack1 register ok');
finalization
UnRegisterClass(TfrmPack1);
if not Assigned(getclass('TfrmPack1')) then
showmessage('Pack1 unregister ok');
end.
Package2:
Код:
unit uPack2;
interface
uses
System.SysUtils, System.Classes, Vcl.Forms, Vcl.Dialogs,
Vcl.StdCtrls, Vcl.Controls;
type
TfrmPack2 = class(TForm)
btnSetVal2: TButton;
btnShowVal2: TButton;
procedure btnSetVal2Click(Sender: TObject);
procedure btnShowVal2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmPack1: TfrmPack2;
implementation
{$R *.dfm}
uses uGlobal;
procedure TfrmPack2.btnSetVal2Click(Sender: TObject);
begin
SetValue(15);
end;
procedure TfrmPack2.btnShowVal2Click(Sender: TObject);
var
MyClass2: TMyClass;
begin
MyClass2 := TMyClass.create;
showmessage(inttostr(MyClass2.ClassInt));
MyClass2.Free;
end;
initialization
RegisterClass(TfrmPack2);
if Assigned(getclass('TfrmPack2')) then
showmessage('Pack2 register ok');
finalization
UnRegisterClass(TfrmPack2);
if not Assigned(getclass('TfrmPack2')) then
showmessage('Pack2 unregister ok');
end.
uGlobal:
Код:
unit uGlobal;
interface
uses classes, forms, sysutils;
type
TMyClass = class(TObject)
private
fInt: integer;
public
constructor create;
property ClassInt: integer read fInt;
end;
procedure SetValue(int: integer);
procedure BPLForm(bplname, classname: string; modal: boolean = true);
implementation
var
GlobalInt: integer = 0;
{ MyClass }
constructor TMyClass.create;
begin
inherited;
fInt := GlobalInt;
end;
procedure SetValue;
begin
GlobalInt := int;
end;
procedure BPLForm;
var
PackageModule: HMODULE;
AClass: TPersistentClass;
begin
try
PackageModule := LoadPackage(bplname);
except
Application.MessageBox(pwidechar('Не удалось загрузить пакет ' + bplname),
'Error', $00000010 { mb_iconerror } );
exit;
end;
if PackageModule <> 0 then
begin
AClass := GetClass(classname);
if AClass = nil then
begin
Application.MessageBox(pwidechar('Не удалось загрузить класс ' +
classname), 'Error', $00000010 { mb_iconerror } );
UnloadPackage(PackageModule);
exit;
end;
with TComponentClass(AClass).create(Application) as TCustomForm do
begin
if modal then
begin
ShowModal;
Release;
UnloadPackage(PackageModule);
end;
end;
end;
end;
end.
Из основного приложения сначала выполняю
BPLForm('Package1.bpl','TfrmPack1'), нажимаю поочередно кнопки
btnSetVal1 и
btnShowVal1. Результат ожидаемый, значение=5.
После этого выполняю
BPLForm('Package2.bpl','TfrmPack2'), и сразу нажимаю кнопку
btnShowVal2, в результате чего получаю значение 0.
Вопрос в следующем:
Как сделать так, чтобы
GlobalInt из
uGlobal.pas после изменения в первом пакете сохраняла свое значение и его можно было бы прочитать из второго пакета?