Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.03.2015, 10:55
pvscherbinin pvscherbinin вне форума
Прохожий
 
Регистрация: 27.03.2015
Сообщения: 6
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию Общий модуль в нескольких 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.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:31.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025