Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Hello, World!
  
 

Фильтр по датам

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  14:44[Войти] | [Зарегистрироваться]

Обсуждение материала
Путешествуя по TObject. Или как оно работает.
Полный текст материала


Другие публикации автора: Максим Игнатьев

Цитата или краткий комментарий:

«... Каждый класс в Delphi является наследником TObject, и, соответственно, обладает всеми его свойствами и методами. Это, несомненно, полезный факт, но каковы его методы и свойства, каковы его основные свойства и как их можно использовать? Как мы увидим немного позже, очень многое в реализации TObject направлено на описание объектной модели Delphi. ...»


Важно:
  • Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
  • Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
  • При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
  • Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.



Добавить свое мнение.

Результаты голосования
Оценка содержания

  Содержит полезные и(или) интересные сведения
[1]1386.7%
 
  Ничего особенно нового и интересного
[2]213.3%
 
  Написано неверно (обязательно укажите почему)
[3]00%
 
Всего проголосовали: 15

Оценка стиля изложения

  Все понятно, материал читается легко
[1]1173.3%
 
  Есть неясности в изложении
[2]426.7%
 
  Непонятно написано, трудно читается
[3]00%
 
Всего проголосовали: 15




Смотрите также материалы по темам:
[TObject] [Классы]

Комментарии жителей
Отслеживать это обсуждение

Всего сообщений: 10

14-01-2015 09:28
Вот дал почитать статью новичку (не сильно вникая в текст), потому что думал, что тут серьёзный сайт, ошибок вроде как быть не должно. Тем более, что дата довольно старая, все ошибки должны быть устранены. Оказывается, ламернулся. Помимо уже замеченных ошибок, выявилось следующее:
>>> В первой строке происходит сверка указателя на Self (себя) с нулем - а не освободили ли нас уже?
Нет, это просто проверка ссылки на объект на nil. Объект можно освободить, при этом ссылка НЕ занулится самостоятельно, это надо сделать руками, например, используя FreeAndNil. Также напоминаю, что деструктор обязан уметь корректно освобождать неполностью созданный объект. Если в конструкторе произойдёт исключение, автоматически будет вызван деструктор, но объект полностью инициирован не будет.
>>> Наличие вызова унаследованного деструктора не обязательно
Это уже совсем нехорошо. Например, у меня есть класс, который в себе создаёт довольно тяжёлый список. В деструкторе этого класса ему делается Free. От него наследуются другие классы. Что будет, если в наследнике НЕ вызвать родительский деструктор? Правильно, список никто не освободит и память будет потеряна. Не надо учить плохому начинающих, пусть зарубят на носу - вызывать inherited Destroy НУЖНО ВСЕГДА. Никаких исключений, никогда. В начале, или конце своего деструктора - возможны варианты, скорее всего, в конце. Но вызов быть должен. Для прямых наследников TObject - да, там деструктор ничего не делает, но избалованного программиста потом не переучишь.


08-02-2014 08:10
На дворе 2014 год, а перегрузки операторов для классов в Delphi как не было так и нет =(
Сообщение не подписано


17-02-2008 00:09
raVen:

Вы на дату публикации обращайте внимание. Статья опубликована в 2000 году, а перегрузка операторов, причём сначала в усечённом виде, только для Variant'ов, появилась только в Delphi 7, а это уже 2003 год.


16-02-2008 15:59
В Delphi есть перегрузка операторов.


17-08-2006 11:07
class function GetInterfaceTable: PInterfaceTable;
Таблица интерфейсов. Несмотря на то, что заявлено использование бесконечного числа интерфейсов, в исходном тексте ясно указано на 10000 элементов таблицы интерфейсов. Я, разумеется, не хочу поставить эксперимент и попытаться превысить этот лимит, но прогресс идет такими темпами, что, боюсь, через некоторое время этот лимит будет исчерпан.


Я могу конечно ошибаться, но по-моему это не так, по крайней мере для Delphi 7.
Просмотрел исходники TObject и там кроме как в описании типа TInterfaceTable этого ограничения не нашел, но т.к. при обращении к InterfaceTable.Entries[i]  и при i>9999 не произойдет ошибки (лишь бы, только под ее была выделена память), и в самой реализации TObject проверки на переполнение данного массива не происходит, то выходит, что все же можно использовать бесконечное число интерфейсов.


PInterfaceTable = ^TInterfaceTable;
  TInterfaceTable = packed record
    EntryCount: Integer;
    Entries: array[0..9999] of TInterfaceEntry;
  end;


А вообще статья очень хороша (многое для себя подчерпнул)
 SAI


03-05-2006 14:01
Крайне забавно читать спор о таких вещах, как расположение ссылок на методы в VMT с претензией на глубокие познания в области программирования, причем без соответствующей оговорки о версиях Delphi. Я сто лет не заглядывал в VMT, да и надобность туда заглянуть была, кажется только один раз, когда разбирался в расположении информации в библиотеке типов. Я все это к тому, что голословные заявления "это правильно" или "это неправильно" на такие конкретные вещи звучат, мягко выражаясь, как соревнование в знании терминов. В данном случае я индифферентен как к автору, так и к критикам (кстати прочтя ентот спор, у меня осталось одно ощущение "оба ошибаются"), но хотел бы призвать, чтобы подобные возражения содержали конкретику. Не ахти какие познания нужно иметь, чтобы просто запомнить порядок расположения ссылок в таблицах. Если с этим работал совсем вчера, то просто приведи список и дело с концом. А если это было позавчера, то лучше молчи, потому что такое легко забывается.


03-05-2006 07:09
В рамках вызова NewInstance выполняется вызов InitInstance, который заполняет поля метода значениями, обозначенными в модификаторах default

Эта фраза неверна. Значения свойств, указанные как default, сами никуда не заносятся, они служат лишь указателем, что если свойство раздела published имеет значение, совпадающее с default, оно не сохраняется в dfm-файле. Но установить эти значения нужно в коде конструктора (или ещё где) вручную. А InitInstance только обнуляет значения всех полей и не более того.


05-07-2001 10:20
Забавно, что в статье везде, к месту и не к месту, употребляется 'VMT' как некая шкатулка на все случаи жизни. Хотя буквально VMT это всего лишь таблица виртуальных методов. И в статье для неё как раз приводится рисунок. В остальных случаях было бы уместно говорить или 'таблица класса', как о глобальной информационной структуре класса, содержащей в том числе RTTI, или всё-таки конкретизировать каждый случай. Например:

>> class function ClassName: ShortString;  
>> Возвращает название класса. Используется VMT.

Здесь используется специфическая VMT у TObject, расположенная по отрицательному смещению.

>> Function FieldAddress(const Name: ShortString): Pointer;
>> Доступ к полям. Возвращает указатель на поле. Как всегда
>> использует VMT.

Для published-полей, как и для published-методов, создаются специальные таблицы типа название-адрес, которые и используются методами (FieldAddress, MethodAddress, MethodName). Адреса этих таблиц берутся всё из той же специальной VMT.

>>Procedure Dispatch(var Message); virtual;
>>Этот метод сканирует VMT на наличие обработчика сообщения, ID
>> которого указан в первых 4 байтах (длинное слово,Cardinal)  ..

Он сканирует не VMT, а DMT(таблицу динамических методов), поскольку любой обработчик сообщения вида

procedure WMLButtonDown(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;

есть динамический метод. А идентификатором для поиска в DMT выступает как раз WM_LBUTTONDOWN.

>> Еще одна интересная особенность TObject - это хранение на уровне
>> VMT информации о трех методах с интересным названием:
>> QueryInterface, AddRef и Release. То есть любой класс, созданный в
>> рамках объектной модели Delphi является COM объектом! Единственным
>> ограничением здесь является то, что для функционирования этих
>> методов необходимо унаследовать хотя бы один интерфейс, что и
>> сделано в рамках другого базового класса TInterfacedObject.

Вот это неправильно. VMT объекта не содержит указателей на эти методы, хотя vmtQueryInterface, vmtAddRef, vmtRelease и присутствуют в Virtual method table entries для TObject в System.pas. Если бы это так, то мы могли получать IUnknown.QueryInterface просто через смещение в VMT без использования GetInterface. Однако же обращение по адресу vmtQueryInterface с дальнейшим использованием скорее всего приведет просто к AV.


31-12-2000 00:58
Согласен с Vitaly


16-06-2000 09:43
Хотелось бы сделать одно немаловажное замечание по поводу приведенной таблицы <<Поддерживаемые возможности объектных моделей некоторых языков программирования>>.
  Что такое DELPHI? DELPHI - это среда визуального программиравния.
   DELPHI = язык Object Pascal + библиотека VCL (набор библиотек).
  Так как же можно сравнивать такую конструкцию с каким бы то ни было языком программирования. Сам по себе язык не имеет ни классов ни методов, а является средством для их создания (и то, не каждый). Уже если что-то и сравнивать, так сравнивайте Object Pascal c C++, Delphi c Visual C++. В конце-концов появились такие продукты, как JBuilder, C++ Builder и т.д.


Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Вода мокрая или сухая?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.

Оценка содержания
 
Содержит полезные и(или) интересные сведения
 
Ничего особенно нового и интересного
 
Написано неверно (обязательно укажите почему)


Оценка стиля изложения
 
Все понятно, материал читается легко
 
Есть неясности в изложении
 
Непонятно написано, трудно читается

Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования