Главная » Delphi » Информация о типах времени выполнения (RTTI)

0

Общая  концепция информации  о  типах  времени выполнения (RTTI —  Runtime Type Information) рассматривалась в главе  2, “Язык программирования Object Pascal”. Теперь наступил  момент более  углубленно  изучить  информацию RTTI,  использование которой позволяет расширить обычные возможности языка  Object  Pascal. Рассмотрим, как получать  информацию о текущих типах  объектов и данных  в выполняемых про граммах, а также то, как это делается в интегрированной среде разработки Delphi.

Итак, каким образом проявляет себя RTTI? Судить об этом можно, по крайней ме ре, по двум областям применения. Первая — работа с интегрированной средой разра ботки  Delphi. С помощью RTTI интегрированная среда разработки узнает все данные об объекте или компоненте, с которым она работает, и помещает их в окно инспекто ра объектов. Конечно, не вся эта информация относится к RTTI,  но для удобства  бу дем рассматривать только  ее.  Вторая область  —  выполняемый код.  В главе  2, “Язык программирования Object  Pascal”, уже упоминались операторы is и as.Для  иллюстрации типичного  использования  информации  RTTI  рассмотрим  опе

ратор is.

Предположим,  что  все  компоненты  TEdit создаваемой  формы  необходимо  сде

лать  доступными только  для чтения. Это достаточно просто: пройдитесь в цикле  по

всем компонентам, используя оператор is для выявления компонентов класса TEdit, а затем присвойте их свойствам ReadOnly значения True. Например:

for i := 0 to ComponentCount – 1 do if Components[i] is TEdit then

TEdit(Components[i]).ReadOnly := True;

Оператор as обычно применяется для  выполнения определенных действий над параметром Sender обработчика события, используемого в различных компонентах. Если все компоненты произошли от общего  предка, к свойству  которого необходимо получить доступ,  то  в обработчике события можно  использовать оператор  as для безопасного приведения типа  параметра Sender к соответствующему потомку,  что позволит получить доступ к нужному свойству. Например:

procedure TForm1.ControlOnClickEvent(Sender: TObject);

var

i: integer;

begin

(Sender as TControl).Enabled := False;

end;

Эти  примеры с безопасным использованием типов (typesafe  programming) иллюстри руют применение расширенных возможностей языка  Object Pascal,  опосредованным образом использующих RTTI.  Теперь рассмотрим задачу,  решение которой требует непосредственного использования информации RTTI.

Допустим, что существует форма с различными компонентами: одни из них предна значены для работы с данными, а другие —  нет.  Но  действия необходимо выполнить только  над компонентами, работающими с данными. С одной  стороны, можно  было бы в цикле  перебрать весь массив  Components формы и проверить каждый  из компонен тов на соответствие требуемому типу. А для этого пришлось бы перебрать все типы ком понентов, используемых для работы с данными. С другой стороны, у компонентов, ра ботающих с данными, может не быть общего  предка  (базового класса),  соответствие ко торому было бы легко проверить. Для такого  случая, например, неплохо было бы иметь тип TDataAwareControl, но его, к сожалению, не существует.

Гораздо проще определить, интересует ли нас данный компонент, проверив сущест

вование свойства DataSource (известно, что это свойство присуще  всем компонентам, работающим с данными). Для такой  проверки потребуется непосредственное использо вание информации RTTI.

Далее  в этой  главе более  подробно рассматриваются возможности использования информации RTTI для решения подобных проблем.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии