|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Общий модуль в нескольких bpl
Добрый день!
Ситуация такая: Есть два пакета (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. |
#2
|
||||
|
||||
А где объявлена переменная int? Или это недопечатка от fInt
Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
Цитата:
Код:
procedure SetValue(int: integer); Это параметр процедуры |
#4
|
||||
|
||||
А записана как
Код:
procedure SetValue; begin GlobalInt := int; end; З.Ы. Попробуйте у GlobalInt = 0 убрать - она и так нулевая, т.к. глобальная Я не понял Вашего вопроса, но всё же Вам на него отвечу! Последний раз редактировалось Alegun, 27.03.2015 в 11:16. |
#5
|
|||
|
|||
Цитата:
По поводу GlobalInt = 0: я привык явно инициализировать переменные, потому и задал значение. Однако провел эксперимент, убрал, не помогло |
#6
|
|||
|
|||
написать трретий пакет, включить в него uGlobal, и подключить этот пакет к первым двум.
|
#7
|
|||
|
|||
Цитата:
Спасибо за совет, такой вариант подходит, сейчас попробую сделать. |
#8
|
|||
|
|||
Прошу прощения за глупые вопросы, но у меня очередная проблема.
Я сделал третий пакет, прицепил к первым двум. Как теперь я могу воспользоваться переменной из третьего пакета? |
#9
|
|||
|
|||
А прицепил, это как?
Должно быть 1) третий пакет должен быть указан в разделе requires обоих пакетов. 2) модуль uGlobal должен быть убран из раздела contains обоих пакетов |
#10
|
|||
|
|||
Цитата:
Сделал как Вы сказали, к сожалению, результата не принесло(( |