![]()  | 
	
 
  | 
		
			
  | 	
	
	
		
		|||||||
| Регистрация | << Правила форума >> | 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.  |