Показать сообщение отдельно
  #2  
Старый 04.02.2022, 02:05
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну так и делай. Собственно, как известно, многомерные массивы в Delphi это вложенные одномерные массивы. Указание нескольких индексов это просто синтаксический сахар.

Соответсвенно. Если ты хочешь иметь доступ по первому индексу по ключу, а далее по индексу, то храни в TDictionary массив:
Код:
uses System.Generics.Collections;

type
  TA = Array Of String;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyMap : TDictionary<String,TDictionary<String,TA>>;
  a : TDictionary<String,TA>;
begin
  MyMap := TDictionary<String,TDictionary<String,TA>>.Create;
  a := TDictionary<String,TA>.Create;
  a.Add('1',['10','20']);
  MyMap.Add('товар1',a);
end;

Должно работать. Ну с поправкой на то, что надо использовать соотв. методы TDictuonary.

В принципе, можно написать свой класс-враппер, что бы упростить синтакс. Что-то типа:
Код:
type
  TMyMap = class
  private
    FMyMap : TDictionary<String,TDictionary<String,Array Of String>>;
  public
    constructor Create;
    destructor Destroy; override;

    function Get(Key1 : String; Key2 : String) : Array Of String;
    procedure Set(Key1 : Stringl Key2 : String; Values : Array Of String);
  end;

...

var
  MyMap : TMyMap;
begin
  MyMap := TMyMap.Create;
  MyMap.Set('товар1','0',['10','20']);
  MyMap.Set('товар1','1',['30','40']);

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