КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
Примечание. Обратите внимание, что обычно унаследованный конструктор вызывается в первую очередьОбратите внимание, что обычно унаследованный конструктор вызывается в первую очередь. Это необходимо для того, чтобы выполнить все нужные операции при создании объекта до инициализации его собственных свойств. При уничтожении объекта обычно сначала выполняются завершающие операции и только в самом конце вызывается унаследованный деструктор, чтобы выполнить собственно уничтожение объекта. При уничтожении объектов рекомендуется вместо деструктора использовать метод Free, который просто вызывает деструктор, но перед этим проверяет, чтобы указатель на экземпляр объекта был не пустым (не был равен Nil). Это позволяет избежать серьезных ошибок. Если объект является владельцем других объектов (например, форма владеет всеми размещенными на ней компонентами), то его метод Free автоматически вызовет эти же методы для всех объектов. Поэтому при закрытии формы разработчик избавлен от необходимости заботиться об уничтожении всех компонентов. Для освобождения занимаемой объектом памяти деструктор автоматически Вызывает метод Freelnstance: procedure Freelnstance; virtual; Каждый объект должен содержать некоторую информацию о себе, которая используется приложением и средой разработки. Поэтому класс TObject содержит ряд методов, обеспечивающих представление этой информации в потомках. Метод class function Classlnfo: Pointer; возвращает указатель на таблицу информации времени выполнения (RTTI). Эта информация используется в среде разработки и в приложении. Функция class function ClassName: ShortString; возвращает имя типа объекта, которое может быть использовано для идентификации. Например, один метод-обработчик щелчка на кнопке может работать с несколькими типами компонентов кнопок: procedure TForml.BitBtnlClick(Sender: TObject); begin if Sender is TBitBtn then TBitBtn(Sender).Enabled := False; if Sender is TSpeedButton then TSpeedButton(Sender).Down := True; end; Метод class function ClassNamels(const Name: string): Boolean; позволяет определить, является ли данный объект того типа, имя которого передано в параметре Name. В случае положительного ответа функция возвращает True. Как известно, программирование для Windows основано на событиях. Каждое приложение и каждый программный объект должны уметь реагировать на сообщение о событиях и, в свою очередь, рассылать сообщения. В выполнении этих операций заключается третья общая для всех объектов функция. Метод procedure Dispatch(var Message); virtual; осуществляет обработку сообщений, поступающих объекту. Он определяет, сможет ли объект обработать сообщение при помощи собственных обработчиков событий. В случае отсутствия таких методов сообщение передается аналогичному методу Dispatch класса-предка (если он есть). Класс TObject имеет предопределенный обработчик событий: procedure DefaultHandler(var Message); virtual; Кроме рассмотренных здесь методов, класс TObject имеет еще несколько методов, которые в основном применяются для взаимодействия объекта со средой разработки. В целом класс TObject может служить для создания на его основе некоторых простых классов для использования в приложениях. Класс TPersistent "Persistent" в переводе с английского означает "устойчивый", "постоянный". Что же такого постоянного в одноименном классе? Ответ таков: виртуальный метод procedure Assign(Source: TPersistent); Этот важнейший метод осуществляет копирование содержимого одного объекта (source) в другой (self, т. е. в объект, вызвавший метод Assign). При этом объект-получатель остается самим собой, чего нельзя достигнуть, используя простое присваивание переменных объектного типа: FirstObject := SecondObject; Ведь в этом случае указатель на одну область адресного пространства, содержащую экземпляр класса (объект), замещается указателем на другую область адресного пространства, содержащую другой объект. Метод Assign позволяет продублировать объект — присвоить одному объекту значения всех свойств другого. При этом объекты не обязательно должны быть одного и того же класса; более того, они не обязательно должны находиться в отношениях "родитель-потомок". Данный метод тем и хорош, что позволяет полиморфное присвоение. Конструкция Clipboard.Assign(Picture); позволяет скопировать содержимое картинки Picture в папку обмена Windows (объект clipboard). Какова здесь логика? Известно, что в папку обмена можно поместить растровую картинку, текст, метафайл, мультимедийные данные и т. п. Метод Assign класса TClipboard переписан таким образом, чтобы обеспечить присвоение (т. е. реальное перемещение в папку обмена) всех этих данных. procedure TCiipboard.Assign(Source: TPersistent); begin if Source is TPicture then AssignPicture(TPicture(Source)) else if Source is TGraphic then AssignGraphic(TGraphic(Source)) else inherited Assign(Source); end; Для обеспечения взаимодействия потомков класса TPersistent со средой разработки предназначен метод function GetNamePath: string; dynamic; Он возвращает имя объекта для передачи его в Инспектор объектов. Для взаимодействия с потоками при загрузке и сохранении компонентов предназначен следующий метод: procedure DefineProperties(Filer: TFiler); virtual; Класс TPersistent никогда не используется напрямую, от него порождаются потомки, которые должны уметь передавать другим объектам значения своих свойств, но не являться при этом компонентами. Класс TComponent Класс TComponent является предком всех компонентов VCL. Он используется в качестве основы для создания невизуальных компонентов и реализует основные механизмы, которые обеспечивают функционирование любого компонента. В нем появляются первые свойства, которые отображаются в Инспекторе объектов. Это свойство property Name: TComponentName; Оно содержит имя экземпляра компонента, которое используется для идентификации компонента в приложении.
|