Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Свойства-массивы

375
10 сентября 2007 года
dominator
199 / / 16.10.2003
Набрел на онлайновую книгу по Дельфи (http://www.rsdn.ru/, ->Статьи->Delphi->Программирование на языке Delphi.Учебное пособие). В главе 3 есть раздел: "3.6.3. Свойства-массивы".
Так вот, читаю там следующее (цитата):
Свойства-массивы имеют два важных отличия от обычных массивов:
их индексы не ограничиваются диапазоном и могут иметь любой тип данных, а не только Integer. Например, можно создать свойство-массив, в котором индексами будут строки. Обращение к такому свойству могло бы выглядеть примерно так:
Reader.Items['FirstName'] := 'Alexander';
...

Больше ничего. Очень интересно, а как сделать такое? Как использовать: понятно. А как правильно объявить такой массив?
10
10 сентября 2007 года
Freeman
3.2K / / 06.03.2004
Цитата: dominator
А как правильно объявить такой массив?


 
Код:
function GetItem(const Index: string): string;
procedure SetItem(const Index, Value: string);

property Items[Index: string]: string read GetItem write SetItem;
375
10 сентября 2007 года
dominator
199 / / 16.10.2003
Цитата: Freeman
 
Код:
function GetItem(const Index: string): string;
procedure SetItem(const Index, Value: string);

property Items[Index: string]: string read GetItem write SetItem;



Делаю:

Код:
unit Unit2;

interface

type
  TDelimitedReader = class
    FItems: array of string;

    constructor create();
    function GetItem(const Index: string): string;
    procedure SetItem(const Index, Value: string);
end;


implementation

constructor TDelimitedReader.create;
begin
   SetLength(FItems, 1);
end;

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

procedure TDelimitedReader.SetItem(const Index, Value: string);
begin
   FItems[Index] := Value;
end;


Получаю: [Pascal Error] Unit2.pas(32): E2010 Incompatible types: 'Integer' and 'string'
268
10 сентября 2007 года
Михаил
587 / / 25.06.2005
Цитата: dominator
Делаю:
Код:
unit Unit2;

interface

type
  TDelimitedReader = class
    FItems: array of string;

    constructor create();
    function GetItem(const Index: string): string;
    procedure SetItem(const Index, Value: string);
end;


implementation

constructor TDelimitedReader.create;
begin
   SetLength(FItems, 1);
end;

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

procedure TDelimitedReader.SetItem(const Index, Value: string);
begin
   FItems[Index] := Value;
end;
Получаю: [Pascal Error] Unit2.pas(32): E2010 Incompatible types: 'Integer' and 'string'


это естественно, т.к. FItems это не ассоциативный массив, обращаться к элементам можно только по индексам

375
10 сентября 2007 года
dominator
199 / / 16.10.2003
Цитата: Михаил
это естественно, т.к. FItems это не ассоциативный массив, обращаться к элементам можно только по индексам



Извините, недопонял:)
Здесь же это выглядит именно как ассоциативный массив, или нет:
Reader.Items['FirstName'] := 'Alexander';
В приведенном выше коде попытался развернуть решение от Freeman.
Где ошибся? Ведь function GetItem(const Index: string): string; как раз таки предполагает обращение по индексу, который является строкой?

268
10 сентября 2007 года
Михаил
587 / / 25.06.2005
Цитата: dominator
Извините, недопонял:)
Здесь же это выглядит именно как ассоциативный массив, или нет:
Reader.Items['FirstName'] := 'Alexander';
В приведенном выше коде попытался развернуть решение от Freeman.
Где ошибся? Ведь function GetItem(const Index: string): string; как раз таки предполагает обращение по индексу, который является строкой?



если быть точным то данное объявление функции предполагает только передачу одно параметра типа string и все а то что индекс будет типа string предполагает соответствующее объявление property :). То что написал Freeman это описание ассоциативного свойства-массива, а FItems таковым не является.

Код:
type
tc=class
FItems:array of string;
...
property Items[Index:string]:string read .... write ...;
end;

var c:tc;

c.Items['myIndex']:='myValue';//works!
c.FItems['myIndex']:='myValue';// don`t work :(
303
10 сентября 2007 года
makbeth
1.0K / / 25.11.2004
dominator, не путай свойство-массив (индексатор) и массив. Это абсолютно разные вещи. В простых массивах ты можешь использовать только целочисленные индексы. Обращение же к свойству массиву просто транслируется компилятором в вызов соответствующего метода, внутри которого ты можешь делать все, что угодно.
10
10 сентября 2007 года
Freeman
3.2K / / 06.03.2004
Код:
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;
309
11 сентября 2007 года
el scorpio
1.1K / / 19.09.2006
dominator
Главное, правильно объявить методы чтения/записи индексируемого свойства. Вот конкретный пример использования свойства со строковым индексом.
Код:
var
list: TStringList;
val: string;

begin
list := TStringList.Create;
list.Add ('Вася=Юзер');
val := list.values ['Вася']; // значение - "Юзер"
list.values['Вася'] := 'Хакер';
val := list.Strings [0]; //значение "Вася=Хакер"
end;


Соответственно, объявление свойства выглядит так:
 
Код:
function GetValue (const Name: string): string;
procedure SetValue (const Name, Value: string);

property Value [Name: string]: string read GetValue write SetValue ;
375
11 сентября 2007 года
dominator
199 / / 16.10.2003
Спасибо всем большое, все ясно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог