![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Добрый день!
Ситуация такая: Есть два пакета (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 после изменения в первом пакете сохраняла свое значение и его можно было бы прочитать из второго пакета? Последний раз редактировалось pvscherbinin, 27.03.2015 в 11:01. |