Изменить указатель переменных - PullRequest
0 голосов
/ 07 августа 2020

Учитывая 2 переменные (логические, целые, int64, TDateTime или строковые), как я могу установить A, чтобы он всегда указывал на B?

С этого момента я хочу, чтобы A всегда указывал на B, поэтому, если я сделаю A := 5, вместо этого он изменит B.

Я хочу иметь возможность делать это во время выполнения.

1 Ответ

3 голосов
/ 07 августа 2020

Есть несколько способов, и все они очевидны, если понимать, что такое переменная: указатель на память.

Использование указателей

var
  iNumber: Integer;   // Our commonly used variables 
  sText: String;
  bFlag: Boolean;

  pNumber: PInteger;  // Only pointers
  pText: PString;
  pFlag: PBoolean;
begin
  pNumber:= @iNumber;  // Set pointers to the same address of the variables
  pText:= @sText;
  pFlag:= @bFlag;

  // Change the memory that both variable and pointer link to. No matter if
  // you access it thru the variable or the pointer it will give you the
  // same content when accessing it thru the opposite way.
  pNumber^:= 1138;     // Same as   iNumber:= 1138;
  sText:= 'Content';   // Same as   pText^:= 'Content';
  pFlag^:= TRUE;       // Same as   bFlag:= TRUE;

Использование объектов

type
  TMyVars= class( TObject )
    iNumber: Integer;
    sText: String;
    bFlag: Boolean;
  end;

var
  oFirst, oSecond: TMyVars;

begin
  oFirst:= TMyVars.Create();   // Instanciate object of class
  oSecond:= oFirst;            // Links to same object

  // An object is already "only" a pointer, hence it doesn't matter through
  // which variable you access a property, as it will give you always the
  // same content/memory.
  oFirst.iNumber:= 1138;       // Same as   oSecond.iNumber:= 1138;
  oSecond.sText:= 'Content';   // Same as   oFirst.sText:= 'Content';
  oFirst.bFlag:= TRUE;         // Same as   oSecond.bFlag:= TRUE;

Использование объявлений

var
  iNumber: Integer;
  sText: String;
  bFlag: Boolean;

  iSameNumber: Integer absolute iNumber;
  iOtherText: String absolute sText;
  bSwitch: Boolean absolute bFlag;
begin
  // Pascal's keyword "absolute" makes the variable merely an alias of
  // another variable, so anything you do with one of both also happens
  // with the other side.
  iNumber:= 1138;            // Same as   iSameNumber:= 1138;
  sOtherText:= 'Content';    // Same as   sText:= 'Content';
  bFlag:= TRUE;              // Same as   bSwitch:= TRUE;

Чаще всего используются указатели, но они также имеют большинство недостатков (особенно если вы не дисциплинированный программист). Поскольку вы используете Delphi, я рекомендую использовать ваши собственные классы для последующей работы с их объектами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...