2018-08-02 22:04:49 +03:00
< html >
< head >
< object type = "application/x-oleobject" classid = "clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e" >
2025-11-07 16:12:31 +03:00
< param name = "Keyword" value = "Индексные свойства" >
< param name = "Keyword" value = "Расширенные индексные свойства" >
2018-08-02 22:04:49 +03:00
< / object >
< meta http-equiv = "Content-Type" content = "text/html; charset=windows-1251" >
< title > < / title >
< link rel = "StyleSheet" href = "../../default.css" >
< / head >
< body >
2025-11-07 16:12:31 +03:00
< H1 > Индексные свойства< / H1 >
< p > Индексные свойства ведут себя аналогично полям-массивам и
используются, как правило, для доступа к элементам контейнеров.
Как и при использовании обычных свойств, при использовании индексных свойств
могут попутно выполняться некоторые действия.
2018-08-02 22:04:49 +03:00
< / p >
2025-11-07 16:12:31 +03:00
< p > Индексное свойство описывается в классе следующим
образом:< / p >
2018-08-02 22:04:49 +03:00
< blockquote >
2025-11-07 16:12:31 +03:00
< p > < code > < b > property< / b > Prop[< code class = "codeit" > описание индексов< / code > ]: < code class = "codeit" > тип< / code > < b > read< / b >
2019-02-02 19:46:57 +03:00
< code class = "codeit" > IndexedPropertyReader< / code > < b >
write< / b >
< code class = "codeit" > IndexedPropertyWriter< / code > ;< / code > < / p >
< / blockquote >
2025-11-07 16:12:31 +03:00
< p > В качестве < code > < code class = "codeit" > IndexedPropertyReader< / code > < / code > может
выступать: < / p >
2019-02-02 19:46:57 +03:00
< ul >
2025-11-07 16:12:31 +03:00
< li > < em > имя функции чтения индексного свойства< / em > ;< / li >
< li > < em > выражение< / em > соответствующего типа (в этом случае индексное свойство
называется < em > расширенным< / em > ). < / li >
2019-02-02 19:46:57 +03:00
< / ul >
2025-11-07 16:12:31 +03:00
< p > В качестве < code > < code class = "codeit" > IndexedPropertyWriter< / code > < / code > может
выступать: < / p >
2019-02-02 19:46:57 +03:00
< ul >
2025-11-07 16:12:31 +03:00
< li > < em > имя процедуры записи индексного свойства< / em > ;< / li >
< li > < em > оператор< / em > (в этом случае индексное свойство называется < em > расширенным< / em > ).
В операторе доступна предопределённая переменная value, в которую помещается
значение для изменения свойства.< / li >
2019-02-02 19:46:57 +03:00
< / ul >
2025-11-07 16:12:31 +03:00
< p > Функция чтения и процедура записи должны быть методами этого класса и иметь
следующий вид:< / p >
2019-02-02 19:46:57 +03:00
< blockquote >
2025-11-07 16:12:31 +03:00
< p > < code > < b > function< / b > GetProp(< code class = "codeit" > описание индексов< / code > ): < code class = "codeit" >
тип< / code > ;< b > < br >
procedure< / b > SetProp(< code class = "codeit" > описание индексов< / code > ; value: < code class = "codeit" > тип< / code > );< / code > < / p >
2018-08-02 22:04:49 +03:00
< / blockquote >
2025-11-07 16:12:31 +03:00
< p > В простейшем случае одного индекса описание индексного свойства выглядит так:< / p >
2018-08-02 22:04:49 +03:00
< blockquote >
< p > < code > < b > property< / b > Prop[ind: < code class = "codeit" >
2025-11-07 16:12:31 +03:00
тип индекса< / code > ]: < code class = "codeit" > тип< / code > < b > read< / b >
2019-02-02 19:46:57 +03:00
GetProp < b >
write< / b > SetProp;< / code > < / p >
2018-08-02 22:04:49 +03:00
< / blockquote >
2025-11-07 16:12:31 +03:00
< p > Всякий раз, когда мы для объекта < code > a< / code > , содержащего свойство < code >
Prop< / code > , выполняем присваивание < code > a.Prop[ind] := value< / code > ,
вызывается процедура < code > a.SetProp(ind,value)< / code > , а
когда считываем значение
< code > a.Prop[ind]< / code > , вызывается функция
2019-02-02 19:46:57 +03:00
< code > a.GetProp(ind)< / code > .< / p >
2025-11-07 16:12:31 +03:00
< p > Индексное свойство, после которого добавлено ключевое слово < b > < code > default< / code > < / b > с последующей < code > ;< / code > , называется < i > < b > < font color = "#FF0000" > ин< / font > < / b > < font color = "#FF0000" > < b > дексным
свойством по умолчанию< / b > < / font > < / i > и позволяет пользоваться объектами класса как массивами, т.е .
использовать запись < code > a[ind]< / code > < i > вместо < / i > < code > a.Prop[ind]< / code > . < / p >
< p > Принципиальное отличие индексных свойств от полей-массивов
состоит в том, что тип индекса может быть произвольным (в частности, строковым). Это
позволяет легко реализовать так называемые ассоциативные массивы, элементы
которых индексируются строками. < / p >
< p > В следующем примере индексное свойство используется для закрашивания клеток шахматной доски
белым или в графическом режиме.< / p >
2019-02-02 19:46:57 +03:00
< blockquote >
< p > < code > < strong > uses< / strong > GraphWPF;< br > < strong > const< / strong > < br >
n = 8;< br > sz = 50;< br > < strong > type< / strong > < br > ChessBoard =
class< br > < strong > private< / strong > < br > a: < strong >
array< / strong > [,] < strong > of< / strong > boolean := new boolean[n,n];< br >
< strong > procedure< / strong > setCell(x,y: integer; value: boolean);< br >
< strong > begin< / strong > < br > < strong > if< / strong >
value < strong > then< / strong > < br >
Brush.Color := Colors.White< br > < strong > else< / strong >
Brush.Color := Colors.Gray;< br >
FillRectangle((x-1)*sz+1,(y-1)*sz+1,sz,sz);< br >
a[x-1,y-1] := value;< br > < strong > end< / strong > ;< br >
< strong > function< / strong > getCell(x,y: integer) := a[x-1,y-1];< br >
< strong > public< / strong > < br > < strong > property< / strong >
Cells[x,y: integer]: boolean < strong > read< / strong > getCell < strong > write< / strong >
setCell; < strong > default< / strong > ;< br > < strong > end< / strong > ;< br > < br > < strong >
var< / strong > c: ChessBoard := new ChessBoard;< br > < br > < strong > begin< / strong > < br >
< strong > for< / strong > < strong > var< / strong > x:=1 < strong > to< / strong > n < strong >
do< / strong > < br > < strong > for< / strong > < strong > var< / strong > y:=1 < strong >
to< / strong > n < strong > do< / strong > < br > c[x,y] := Odd(x+y);
< br > < strong > end< / strong > .< / code > < / p >
< / blockquote >
2025-11-07 16:12:31 +03:00
< p > Можно не писать отдельные методы < code > getCell< / code > и < code > setCell< / code >
для доступа к свойству на чтение и запись, а воспользоваться < em > расширенными
индексными свойствами< / em > :< / p >
2018-08-02 22:04:49 +03:00
< blockquote >
2019-02-02 19:46:57 +03:00
< p > < code > < strong > type< / strong > < br > ChessBoard = class< br >
< strong > private< / strong > < br > a: < strong > array< / strong > [,]
< strong > of< / strong > boolean := new boolean[n,n];< br > < strong > public< / strong > < br >
< strong > property< / strong > Cells[x,y: integer]: boolean < strong > < br >
read< / strong > a[x-1,y-1] < strong > < br > write< / strong >
< strong > begin< / strong > < br > < strong >
if< / strong > value < strong > then< / strong > < br >
Brush.Color := Colors.White< br >
< strong > else< / strong > Brush.Color := Colors.Gray;< br >
FillRectangle((x-1)*sz+1,(y-1)*sz+1,sz,sz);< br >
a[x-1,y-1] := value;< br > < strong > end< / strong > ;
< strong > default< / strong > ;< br > < strong > end< / strong > ;< / code > < / p >
2018-08-02 22:04:49 +03:00
< / blockquote >
< / body >
< / html >