Size: a a a

2020 September 01

Ш

Шляпник in Delphi & Lazarus
обсуждается как раз эта тема
источник

RS

Renat Suleymanov in Delphi & Lazarus
Гляну
источник

Ш

Шляпник in Delphi & Lazarus
type
 TStringByString = class
 private
   FItems: TStrings;
   function GetItem(const Index: string): string;
   procedure SetItem(const Index, Value: string);
 public
   constructor Create;
   destructor Destroy; override;
   property Items[Index: string]: string read GetItem write SetItem;
 end;

{ TStringByString }

constructor TStringByString.Create;
begin
 FItems := TStringList.Create;
end;

destructor TStringByString.Destroy;
begin
 FItems.Free;
end;

function TStringByString.GetItem(const Index: string): string;
begin
 Result := FItems.Values[Index];
end;

procedure TStringByString.SetItem(const Index, Value: string);
begin
 FItems.Index[Index] := Value;
end;
источник

Ш

Шляпник in Delphi & Lazarus
вроде там сошлись на таком конечном результате
источник

АВ

Александр В... in Delphi & Lazarus
Задачи конечно бывают разные, ток я не понял нафига стринговые индексы в виде нашлепки над стринглистом:/
источник

Ш

Шляпник in Delphi & Lazarus
ну, как обычно танцы с бубнами из-за отсутствия в Делфе ассоциативных массивов :)))
источник

A

Anthony in Delphi & Lazarus
Александр В
Задачи конечно бывают разные, ток я не понял нафига стринговые индексы в виде нашлепки над стринглистом:/
Пишет gbp, а ему в ответ список значений завязанный на, к примеру, банки.
источник

Ш

Шляпник in Delphi & Lazarus
если бы список был бы ограниченным, можно было бы станцевать с перечислением.
источник

АВ

Александр В... in Delphi & Lazarus
А, ясн. Индекс то там серавно числовой под капотом
источник

RS

Renat Suleymanov in Delphi & Lazarus
Шляпник
type
 TStringByString = class
 private
   FItems: TStrings;
   function GetItem(const Index: string): string;
   procedure SetItem(const Index, Value: string);
 public
   constructor Create;
   destructor Destroy; override;
   property Items[Index: string]: string read GetItem write SetItem;
 end;

{ TStringByString }

constructor TStringByString.Create;
begin
 FItems := TStringList.Create;
end;

destructor TStringByString.Destroy;
begin
 FItems.Free;
end;

function TStringByString.GetItem(const Index: string): string;
begin
 Result := FItems.Values[Index];
end;

procedure TStringByString.SetItem(const Index, Value: string);
begin
 FItems.Index[Index] := Value;
end;
Я такую конструкцию использую периодически, но задача была в другом. СЕйчас уточню вопрос https://t.me/Delphi_Lazarus/133829
источник

RS

Renat Suleymanov in Delphi & Lazarus
По ссылке в принципе тоже про то, что индексы могут быть и строковые и свойств массивов я не только знал, но и использую постоянно. Я собственно и хотел их использовать в своем примере в коде.
источник

RS

Renat Suleymanov in Delphi & Lazarus
Суть в том, что есть ключевое слово index, которое можно использовать в свойствах для того, чтобы использовать один геттер (то есть тот метод, который идет после read в property). К примеру, конструкция ниже нормально бы скомпилировалась.
 { TValuteList }

 TValuteList = class
 private
   function GetValutes(Index: Integer): TValuteItem;
 public
   constructor Create;
   destructor Destroy; override;
   property Valutes[Index: Integer]: TValuteItem read GetValutes;
 published
   property GBP: TValuteItem index 1 GetValutes;    
   property USD: TValuteItem index 2 GetValutes;  
   property EUR: TValuteItem index 3 GetValutes;
... ... ... ...
 
   property CNY: TValuteItem index 25 GetValutes;
 end;
Подробнее о таких конструкциях https://www.freepascal.org/docs-html/ref/refsu34.html
 По ней видно, что лаконичность достигается использованием одного геттера на все эти свойства. Обратите внимание, что к элементу, к примеру, USD можно обратится вот так TValueList.USD и вот так TValueList.Valutes[2]. Можно использовать таки в качестве индекса и строковый тип как в примеру приведенном мною изначально, но не скомпилируется конструкция property GBP, USD, EUR и т.д. c index, так как она к сожалению поддерживает только Integer
источник

RS

Renat Suleymanov in Delphi & Lazarus
Вообщем, замарачиваться не буду. Можно сделать вручную каждый геттер, но я просто изменю подход. Использую план Б без паскалевских объектов
источник

Ш

Шляпник in Delphi & Lazarus
ну и нафига козе баян? Почему тогда не создать перечисление и не сделать свойство этого типа?
источник

Ш

Шляпник in Delphi & Lazarus
суть будет та же
источник

RS

Renat Suleymanov in Delphi & Lazarus
Шляпник
ну и нафига козе баян? Почему тогда не создать перечисление и не сделать свойство этого типа?
Да, это "третий путь", забыл про него упомянуть. Просто хотелось сохранить в public свойство массив со строковым индексом для использования ее снаружи
источник

Ш

Шляпник in Delphi & Lazarus
да не будет тогда красивого обращения к свойству по имени валюты, зато кода будет значительно меньше
источник

Ш

Шляпник in Delphi & Lazarus
Renat Suleymanov
Да, это "третий путь", забыл про него упомянуть. Просто хотелось сохранить в public свойство массив со строковым индексом для использования ее снаружи
нуу :) красиво  в принципе тоже аргумент, при условии конечно, что оно не ведёт к большому геморрою ;)
источник

RS

Renat Suleymanov in Delphi & Lazarus
Шляпник
да не будет тогда красивого обращения к свойству по имени валюты, зато кода будет значительно меньше
да, красоты поменьше будет. Просто я уже думаю не делать объекты паскалевские, а оставлять TJSONData и все. Нефиг мне плодить сущности раз не хочет принимать строку как индекс
источник

Ш

Шляпник in Delphi & Lazarus
то есть ты про этот "index 25" индекс говорил?
источник