Как создать свойство массива и его процедуру в delphi

avatar
Laughin Coffin
8 апреля 2018 в 08:18
443
1
1

Я хочу создать свойство массива в моем устройстве uFleet, которое будет считывать информацию с другого устройства — uCubeF.

Вот что я сделал в uFleet:

Type
  AUnits = array of array[1..3] of integer;

  TFleet = class(TDummy)

    private
      FUnits: array of array[1..3] of integer;
      procedure SetUnits(const value: array of array[1..3] of integer);

    public

      property Units: AUnits read FUnits write SetUnits;

  end;

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

procedure TFleet.SetUnits(const value: array of array[1..3] of integer);
begin

  FUnits:= value;

end;

Я знаю, что для правильной обработки свойства массива мне нужно использовать индексы. Но я очень смущен тем, как. Особенно когда мне придется использовать индекс в процедуре.

Как мне изменить свой код?

Источник

Ответы (1)

avatar
Vasek
8 апреля 2018 в 11:54
2

Есть два решения. Свойство массива или свойство индекса.

interface

type
  TUnits = TArray<array[1..3] of Integer>;

  // Array property
  TFleet1 = class
  private
    FUnits: TUnits;
    procedure SetUnits(const Value: TUnits);
  public
    property Units: TUnits read FUnits write SetUnits;
  end;

  // Index property
  TFleet2 = class
  private
    FUnits: TUnits;

    function GetUnit(Index1, Index2: Integer): Integer;
    procedure SetUnit(Index1, Index2: Integer; Value: Integer);
  public
    procedure SetUnits(const Value: TUnits);

    property Units[Index1, Index2: Integer]: Integer read GetUnit write SetUnit; default;
  end;

implementation

{ TFleet1 }

procedure TFleet1.SetUnits(const Value: TUnits);
begin
  FUnits := Value
end;

{ TFleet2 }

function TFleet2.GetUnit(Index1, Index2: Integer): Integer;
begin
  // if need check index before return result
  Result := FUnits[Index1, Index2];
end;

procedure TFleet2.SetUnit(Index1, Index2: Integer; Value: Integer);
begin
  // if need check index before set value
  FUnits[Index1, Index2] := Value;
end;

procedure TFleet2.SetUnits(const Value: TUnits);
begin
  FUnits := Value;
end;

{ TestFleet }

procedure TestFleet();
var
  I: Integer;
  F1: TFleet1;
  F2: TFleet2;
  U: TUnits;
begin
  SetLength(U, 10);

  F1 := TFleet1.Create;
  F1.Units := U;
  I := F1.Units[0, 1];
  F1.Units[0, 1] := 1;

  F2 := TFleet2.Create;
  F2.SetUnits(U);
  I := F2.Units[0, 1];
  F2[0, 1] := 1;
end;

У обоих решений есть плюсы и минусы (хотя свойство индекса считается предпочтительным). Чтобы поиграть с обоими и выбрать нужный.