Копировать массив с указателями - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть массив

type
Ttable=array[0..7] of ^TRecord;
var
table:Ttable;

Я хотел бы создать временную таблицу tmp с теми же значениями, однако временное изменение не влияет на правильное.

Не могли бы вы мне помочь?

1 Ответ

0 голосов
/ 07 декабря 2018

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

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

Для иллюстрации я добавил в форму 3 памятных поля.Два замечания - вам нужно как-то создать второй набор записей, и важный бит - CopyTable

unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Unit3, Vcl.StdCtrls;

type
  TRecord = record
    Something : integer;
  end;

  TTable = array[0..7] of ^TRecord;

  TForm2 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Memo3: TMemo;
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
    Record0 : TRecord;
    Record1 : TRecord;
    Record2 : TRecord;
    Record3 : TRecord;
    Record4 : TRecord;
    Record5 : TRecord;
    Record6 : TRecord;
    Record7 : TRecord;
    TempRecord0 : TRecord;
    TempRecord1 : TRecord;
    TempRecord2 : TRecord;
    TempRecord3 : TRecord;
    TempRecord4 : TRecord;
    TempRecord5 : TRecord;
    TempRecord6 : TRecord;
    TempRecord7 : TRecord;
    fTempTable : TTable;
  public
    Table : TTable;
    { Public declarations }
    procedure CopyTable;
    procedure ShowTable( const ATable : TTable; const AMemo : TMemo );
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.CopyTable;
var
  i: Integer;
begin
  for i := 0 to 7 do
  fTempTable[i]^ := Table[ i ]^;
end;

procedure TForm2.FormShow(Sender: TObject);
var
  i: Integer;
begin
  // Set up tables
  Table[0] := @Record0;
  fTempTable[0] := @TempRecord0;
  Table[1] := @Record1;
  fTempTable[1] := @TempRecord1;
  Table[2] := @Record2;
  fTempTable[2] := @TempRecord2;
  Table[3] := @Record3;
  fTempTable[3] := @TempRecord3;
  Table[4] := @Record4;
  fTempTable[4] := @TempRecord4;
  Table[5] := @Record5;
  fTempTable[5] := @TempRecord5;
  Table[6] := @Record6;
  fTempTable[6] := @TempRecord6;
  Table[7] := @Record7;
  fTempTable[7] := @TempRecord7;
  for i := 0 to 7 do
  begin
    Table[i]^.Something := i;
  end;
  ShowTable( Table, Memo1 );
  CopyTable;
  fTempTable[ 5 ].Something := 73;
  ShowTable( fTempTable, Memo2 );
  ShowTable( Table, Memo3 );
end;

procedure TForm2.ShowTable(const ATable: TTable; const AMemo: TMemo);
var
  i: Integer;
begin
  AMemo.Clear;
  for i := 0 to 7 do
  begin
    AMemo.Lines.Add( IntToStr( ATable[i]^.Something));
  end;
end;

end.
...