Итерация по индексированному свойству в Delphi 2010

Есть ли в Delphi 2010 способ перебора любого индексируемого свойства (например, Pages of TPageControl)?


person Rafael Piccolo    schedule 31.10.2011    source источник
comment
@TLame ActivePageIndex не является индексируемым свойством.   -  person David Heffernan    schedule 31.10.2011
comment
Я не понял вашего комментария, довольно оскорбительного кстати... Я ничего не говорил про ActivePageIndex, не знаю, где вы это увидели. Я сказал Пейдж.   -  person Rafael Piccolo    schedule 01.11.2011
comment
Я полагаю, вы имеете в виду удаленные комментарии   -  person David Heffernan    schedule 01.11.2011


Ответы (2)


Нет, это невозможно, так как не существует стандартного шаблона, который:

  • указывает тип индекса
  • указывает начальное и конечное значения используемого индекса

Вот почему в некоторых классах есть перечислители: это шаблон, который сообщает оператору for ... in, как его перечислять.

Однако то, что вы можете сделать, является наилучшей оценкой:

  • в большинстве случаев индекс является целым числом
  • в большинстве случаев индекс начинается с нуля
  • в большинстве случаев есть свойство Count или Length, которое говорит вам, как получить конечное значение

Наконец, можно "модернизировать " TPageControl с GetEnumertor, использующим помощники класса (или помощники записи, если базовым типом является запись).

person Jeroen Wiert Pluimers    schedule 31.10.2011
comment
Я видел ваш пост (хороший материал), когда искал в Интернете, пытаясь найти ответ на этот вопрос :) В моем случае у меня есть полдюжины проиндексированных свойств различных компонентов. Я перебираю их только для того, чтобы получить свойство Caption. Итак, сейчас у меня полдюжины почти одинаковых петель, и мне это не нравится. Хотя GetEnumerator — это круто, это слишком много кода для такой маленькой задачи. - person Rafael Piccolo; 01.11.2011
comment
Как насчет того, чтобы абстрагировать эти циклы в некий общий код, а затем передать ему анонимный метод, содержащий неидентичный код? - person Jeroen Wiert Pluimers; 02.11.2011

Если я вас правильно понял, вы хотите перебирать эти свойства через RTTI, ничего не зная о свойстве и его значениях индекса. Поскольку действительные значения индекса не должны быть последовательностью целых значений, это невозможно. Могут быть свойства со строковыми индексами или со ссылками на объекты в качестве значения индекса. И в RTTI нет механизма для запроса действительных значений индекса, которые можно было бы использовать для итерации.

person Michael    schedule 31.10.2011