Форум по 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.
Ответить с цитированием
  #2  
Старый 27.03.2015, 11:02
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А где объявлена переменная int? Или это недопечатка от fInt
Ответить с цитированием
  #3  
Старый 27.03.2015, 11:08
pvscherbinin pvscherbinin вне форума
Прохожий
 
Регистрация: 27.03.2015
Сообщения: 6
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
А где объявлена переменная int?

Код:
procedure SetValue(int: integer);

Это параметр процедуры
Ответить с цитированием
  #4  
Старый 27.03.2015, 11:12
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

А записана как
Код:
procedure SetValue;
begin
  GlobalInt := int;
end;

З.Ы. Попробуйте у GlobalInt = 0 убрать - она и так нулевая, т.к. глобальная

Последний раз редактировалось Alegun, 27.03.2015 в 11:16.
Ответить с цитированием
  #5  
Старый 27.03.2015, 11:23
pvscherbinin pvscherbinin вне форума
Прохожий
 
Регистрация: 27.03.2015
Сообщения: 6
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
А записана как
ну дык в объявлении-то с параметром описана))

По поводу GlobalInt = 0:
я привык явно инициализировать переменные, потому и задал значение.
Однако провел эксперимент, убрал, не помогло
Ответить с цитированием
  #6  
Старый 27.03.2015, 12:43
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

написать трретий пакет, включить в него uGlobal, и подключить этот пакет к первым двум.
Ответить с цитированием
  #7  
Старый 27.03.2015, 13:18
pvscherbinin pvscherbinin вне форума
Прохожий
 
Регистрация: 27.03.2015
Сообщения: 6
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
написать трретий пакет, включить в него uGlobal, и подключить этот пакет к первым двум.

Спасибо за совет, такой вариант подходит, сейчас попробую сделать.
Ответить с цитированием
  #8  
Старый 27.03.2015, 18:01
pvscherbinin pvscherbinin вне форума
Прохожий
 
Регистрация: 27.03.2015
Сообщения: 6
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Прошу прощения за глупые вопросы, но у меня очередная проблема.
Я сделал третий пакет, прицепил к первым двум. Как теперь я могу воспользоваться переменной из третьего пакета?
Ответить с цитированием
  #9  
Старый 27.03.2015, 21:49
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

А прицепил, это как?
Должно быть
1) третий пакет должен быть указан в разделе requires обоих пакетов.
2) модуль uGlobal должен быть убран из раздела contains обоих пакетов
Ответить с цитированием
  #10  
Старый 28.03.2015, 00:09
pvscherbinin pvscherbinin вне форума
Прохожий
 
Регистрация: 27.03.2015
Сообщения: 6
Версия Delphi: Delphi XE5
Репутация: 10
По умолчанию

Цитата:
Сообщение от icWasya
А прицепил, это как?
Должно быть
1) третий пакет должен быть указан в разделе requires обоих пакетов.
2) модуль uGlobal должен быть убран из раздела contains обоих пакетов

Сделал как Вы сказали,
к сожалению, результата не принесло((
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter