Delphi: Присвоение глобальной записи - глобальная запись не меняется - PullRequest
2 голосов
/ 08 июля 2010

В модуле delphi у меня есть глобальная запись под названием «Context»:

interface
  type
    TContext = record
       ...
    end;

  var
    context: TContext;

У меня также есть процедура инициализации в этом модуле, принимая контекст:

interface  
  procedure Init(AContext: TContext);

Внутри процедуры Init я пытаюсь назначить данный контекст глобальному контексту:

implementation
  procedure Init(AContext: TContext);
  begin
    context := AContext;
  end;

По какой-то причине глобальный контекст остается пустым после назначения.Это почему?Объявление локальной процедуры внутри процедуры и присвоение ей работает, как и ожидалось.


То, что я должен был упомянуть, это то, что этот модуль живет в dll, а процедура init вызывается из exe.Объявление глобальной записи или объявление нескольких глобальных строк не имеет значения.Присвоенные значения теряются.

привет,
-Vegar

Ответы [ 3 ]

3 голосов
/ 08 июля 2010

Полагаю, вам нужно показать немного больше кода.С

unit Unit1;

interface

type
  TContext = record
    dummy: Integer;
  end;

var
  context: TContext;

procedure Init(AContext: TContext);

implementation

procedure Init(AContext: TContext);
begin
  context := AContext;
end;

end.

и

program Project1;

{$APPTYPE CONSOLE}

uses
  Unit1 in 'Unit1.pas';

procedure Test;
var
  c: TContext;
begin
  c.dummy := 666;
  Init(c);
end;

begin
  Test;
end.

я получаю ожидаемый результат, т.е. c и Unit1.context оба содержат 666 после выполнения Init(c); в Test.

0 голосов
/ 26 июля 2010

Ошибка найдена. На самом деле все было немного беспорядочно ... Оказалось, что объект, ответственный за вызов метода init, существует дважды, а модуль, содержащий глобальную переменную, существует как внутри проекта dll, так и в проекте exe. По какой-то причине один из экземпляров вызывающего класса манипулировал глобальной переменной внутри exe, а другой - внутри dll, а разработчик и отладчик были остановлены ...

Код является частью какого-то старого, грязного унаследованного кода, который мы пытаемся разбить на части и очистить. Мы действительно начинаем понимать «ломающуюся» часть ...

Спасибо за ответы и извините, что потратили ваше время.

С уважением, -Vegar

0 голосов
/ 08 июля 2010

Если вы не измените

Процедура Init (AContext: TContext);

до

Процедура Init (Var AContext: TContext);

...