Delphi Изнутри. Урок 8. Продолжаем изучать TObject. Функции ClassInfo, GetPropInfo, InstanceSize. |
Автор megabax | |||||||||
27.05.2010 г. | |||||||||
Delphi Изнутри. Урок 8. Продолжаем изучать TObject. Функции ClassInfo, GetPropInfo, InstanceSize.Продолжим изучать TObject. Сегодня мы рассмотрим функцию ClassInfo. вот как она реализована:
Как видим, метод возвращает содержимое ячейки, расположенной по адресу, смещенному на vmtTypeInfo относительно описания класса. Эта функция возвращает информацию о типе. Где ее можно применить? Например, проверить, поддерживает ли объект заданное свойство:
Вот пример работы этой ой функции:
Он у нас выдаст сообщение "Поддерживает". А вот если мы напишем вот так:
То на экране ничего не увидим. FFocusControl у нас является приватным полем класса TCustomLabel, TLabel его наследует, соответственно, тоже как приватное. Но функция GetPropInfo у нас видит только свойства, объявленные как published. Рассмотрим еще один метод класса TObject - InstanceSize. Он возвращает размер экземпляра объекта. Для иллюстрации работы класса рассмотрим пример:
Данный пример выдаст два сообщения: 8 и 88 - соответственно, размеры экземпляров первого и второго класса. Как видим, второй объект у нас больше так как у него в качестве поля целый массив, а у первого только число. Стоит заметить, что InstanceSize - это не занимаемая объектом память, а именно размер его экземпляра. Определим, например, такой класса:
Проверим, что же у нас вернет InstanceSize:
Ответ 8, хотя, казалось бы, у нас есть поля на класс, размером целых 88 байт. Но, дело в том, что храниться то в классе экземпляре TInstanceSizeTest3 не сам объект класса TInstanceSizeTest2 а только указатель на его. Теперь поняли, в чем разница между InstanceSize и объемом занимаемой памяти? Скажу более, объекта класса TInstanceSizeTest2 , на которое указывает FField может даже не существовать, а FField быть равным nil. Ну, и на последок посмотрим, а как же устроена функция InstanceSize:
Как видим, принцип работы аналогичный многим другим функциям TObject - обращение к определенному адресу по его смещению. Кстати, конкретные размеры смещений вы можете посмотреть в модуле System*:
Скриншоты, помеченные знаком * , являются цитатами и иллюстрациями программного продукта "Delphi", авторское право на который принадлежит "Borland Software Corporation". |
|||||||||
Последнее обновление ( 30.05.2013 г. ) |