Введение в DELPHI

       

Как Вы, наверное, заметили, методы


Как Вы, наверное, заметили, методы программы CONTROL2, являющиеся откликами на события OnClick и OnDblClick, во многом похожи друг на друга.

Открытость среды Delphi позволяет получать и оперировать информацией особого рода, называемой информацией периода выполнения (RTTI - run-time type information). Эта информация организована в виде нескольких уровней.

Верхний уровень RTTI представлен как средство проверки и приведения типов с использованием ключевых слов is и as.

Ключевое слово is дает программисту возможность определить, имеет ли данный объект требуемый тип или является одним из наследников данного типа, например, таким образом: if MyObject is TSomeObj then ...

Имеется возможность использовать RTTI и для процесса приведения объектного типа, используя ключевое слово as: if MyObject is TSomeObj then (MyObject as TSomeObj).MyField:=...

что эквивалентно: TSomeObj(MyObject).MyField:=...

Средний уровень RTTI использует методы объектов и классов для подмены операций as и is на этапе компиляции. В основном, все эти методы заложены в базовом классе TObject, от которого наследуются все классы библиотеки компонент VCL. Для любого потомка TObject доступны, в числе прочих, следующие информационные методы:
  • ClassName - возвращает имя класса, экземпляром которого является объект
  • ClassInfo - возвращает указатель на таблицу с RTTI, содержащей информацию о типе объекта, типе его родителя, а также о всех его публикуемых свойствах, методах и событиях
  • ClassParent - возвращает тип родителя объекта
  • ClassType - возвращает тип самого объекта
  • InheritsFrom - возвращает логическое значение, определяющее, является ли объект потомком указанного класса
  • InstanceSize - возвращает размер объекта в байтах.


Эти методы могут использоваться в Вашем коде напрямую.

Нижний уровень RTTI определяется в дельфийском модуле TypInfo и представляет особый интерес для разработчиков компонент. Через него можно получить доступ к внутренним структурам Delphi, в том числе, к ресурсам форм, инспектору объектов и т.п.

Итак, доступ к информации периода выполнения в Delphi позволяет динамически получать как имя объекта, находящегося на форме, так и название класса, которому он принадлежит (и еще много другой полезной информации; но об этом - в дальнейших уроках). Для этого используется свойство Name, имеющееся у любого класса-наследника TComponent (а таковыми являются все компоненты, входящие в дельфийскую библиотеку VCL), и метод ClassName, доступный для любого потомка класса базового TObject. А, поскольку класс TComponent, в свою очередь, является наследником класса TObject, то он доступен для всех компонент из библиотеки VCL. vВернувшись к нашим примерам, мы можем заменить целую "кучу" методов двумя, реализующими события OnClick и OnDblClick для всех объектов сразу. Для этого можно скопировать все файлы из CONTROL2 в новый директорий CONTROL3 или использовать для работы уже имеющуюся на диске программу. Создадим стандартным образом методы ControlDblClick и ControlClick для какого-либо объекта (например, для Label1). Введем в них следующие строки: procedure TForm1.ControlDblClick(Sender: TObject); begin Edit1.Text := 'Двойной щелчок на ' + (Sender as TComponent).Name + ' (класс ' + Sender.ClassName + ')'; end; procedure TForm1.ControlClick(Sender: TObject); begin Edit1.Text := 'Щелчок на ' + (Sender as TComponent).Name + ' (класс ' + Sender.ClassName + ')'; end;

Теперь назначим данные методы всем событиям OnClick и OnDblClick, имеющимся у расположенных на форме объектов. Мы видим, что размер программы существенно сократился, а функциональность ее значительно выросла. В режиме выполнения после, например, щелчка на объекте CheckBox1 приложение будет иметь вид, изображенный на Рис. Ошибка! Текст указанного стиля в документе отсутствует.-F.



Рис. Ошибка! Текст указанного стиля в документе отсутствует.-F: Программа CONTROL3 выводит информацию не только об имени объекта, но и о названии его класса (типа)

Итак, мы видим, что используя информацию периода выполнения, можно сделать программу очень гибкой и универсальной.


Содержание раздела