404
Компонент ориентированная разработка Часть IV
Для иллюстрации типичного использования информации 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 для решения подобных проблем.
Модуль TypInfo.pas — определитель RTTI Информация о типе существует для любого объекта (потомка класса TObject). Она содержится в памяти и при необходимости считывается интегрированной сре дой разработки или динамической библиотекой (runtime library). В модуле Typ-