
- •Литература
- •Содержание
- •1. Основные понятия ооп
- •2. Программирование для Windows
- •3. Визуальное программирование и среда Delphi
- •Создание приложений в средеDelphi
- •Компоненты общего назначения tMainMenu- главное меню формы (программы)
- •TPopupMenu- вспомогательное (локальное) меню
- •TLabel- метка для отображения текста
- •TEdit-ввод и отображение строки
- •TMemo- ввод и отображение текста
- •TButton- кнопка
- •TBitBtn- кнопка с изображением
- •TSpeedButton- кнопка для инструментальных панелей
- •TCheckBox- независимый переключатель
- •TRadioButton- зависимые переключатели
- •TRadioGroup- группа зависимых переключателей
- •TListBox- список выбора
- •TComboBox- раскрывающийся список выбора
- •TPanel- панель
- •TTabControl- набор закладок
- •TPageControl- набор страниц с закладками
- •4. Особенности языка ооп Object Pascal
- •Процедуры и функции Выход из процедур и фукнций и возврат результата
- •Передача параметров
- •Параметры со значениями по умолчанию
- •Перегрузка функций
- •Динамическое распределение памяти
- •Указатели
- •Операции с указателями
- •Операция @
- •Самоадресуемые записи
- •Динамические массивы Одномерные динамические массивы
- •Многомерные динамические массивы
- •Исключения и их обработка
- •Защита кода зачистки в блокахtry...Finally
- •Защита кода зачистки на уровне модуля — разделfinalization
- •Обработка исключений в блокахtry...Except
- •Последовательность обработки исключений
- •5. Классы и объекты
- •Классы и объекты
- •Инкапсуляция
- •Наследование
- •Полиморфизм
- •Составляющие класса Поля
- •Одноименные методы
- •Свойства
- •События
- •Объявление класса
- •Операции с классами
- •Ссылки на классы
- •TObjectи информация о классах
- •Регистрация и обнаружение классов
- •6. Создание объектов во время выполнения, поиск компонентов
- •Клонирование объектов
- •Поиск компонента
- •Двукратное освобождение объекта
- •7. Построение собственных компонентов
- •Как и для чего следует строить компоненты
- •Общие руководящие принципы
- •Ключевые идеи
- •Компиляция компонентов
- •Отладка компонентов
- •Примечание
- •Примечание
- •Примечание
- •8. Работа с потоками
- •Классы потоковDelphi
- •Файловые потоки
- •Примечание
- •Методы потоков в действии: программаMemoStr
- •Потоки памяти
- •Пример программыMemoryS
- •Примечание
- •Написание заказного класса потока
- •9. Работа с com-объектами, использование серверов ole-автоматизации
Операции с классами
Для классов определены операции отношения = и <>. Кроме того, для классов определены еще две операции: as (как) и is (является). Первым операндом в обеих операциях является объект, вторым — класс.
Если А — объект, а С — класс, то выражение A as С возвращает тот же самый объект, но рассматриваемый как объект класса С. Операция даст результат, если указанный класс С является классом объекта А или одним из наследников этого класса. В противном случае будет сгенерировано исключение.
Наиболее часто операция as применяется к параметру Sender, передаваемому во все обработчики событий как объект — источник события и имеющему тип TObject, в котором очень мало свойств для идентификации объекта. Например:
if (Sender as TComponent) .Name = 'Button2' then ...;
Этот оператор выбирает событие, связанное с компонентом, имеющим имя «Button2», и не реагирует на события, связанные с другими компонентами.
Выражение A is С позволяет определить, относится ли объект А к классу С или к одному из его потомков. Если относится, то операция is возвращает true, в противном случае — false. Например, оператор:
if Sender is TButton then ...;
будет реагировать только на объекты класса TButton или потомков этого класса.
Применительно к объектам надо четко представлять различие между оператором присваивания и методом копирования Assign, свойственным многим классам объектов. Метод Assign объявлен следующим образом:
<объект-приемник>.Assign(<объект-источник>); Например:
A.Assign (В);
Этот оператор копирует содержание объекта А (все его свойства) в объект В.
Для тех же самых объектов А и В можно записать оператор присваивания:
А:=B;
Различие между двумя приведенными операторами следующее. Метод Assign копирует содержимое одного объекта в другой. Таким образом в памяти будет иметься два объекта А и В одинакового содержания. А оператор присваивания, примененный к указателям (имя объекта — это указатель на объект), присваивает указателю А значение указателя В. Таким образом, и А, и В будут указывать на один и тот же объект в памяти. А тот объект, на который до выполнения этого оператора указывал А, может быть вообще потерян, если в программе где-то не хранится другой указатель на него.
Ссылки на классы
Особый элемент языка Object Pascal — это поддержка ссылок на классы. Это — объекты, сохраняющие информацию о каждом классе в целом («метаклассы» по терминологии языка Smalltalk или Borland C++Builder) вместо хранения информации для определенного экземпляра класса. Ссылка (reference) на класс в Delphi имеет специальный тип данных, объявленный как:
type
TMyCRef := class of TMyClass;
var
MyCRef: TMyCRef;
В этом примере тип данных ссылки на класс TMyCRef может относиться только к классу TMyClass и его подклассам. Другими словами, ссылки на класс используют правила совместимости типа, связанные с наследованием, точно так же, как другие объекты. Delphi VCL определяет несколько таких ссылок на классы, как TClass (являющийся классом TObject), TComponentClass, TControlClass и многие другие. Как предполагается, ссылке на класс TClass можно присвоить любой класс (все классы происходят от TObject; а все ссылки на класс - от TClass). Однако так чаще всего работают с классами компонентов или элементов управления.
Для чего можно использовать ссылки на классы? Прежде всего, их можно использовать, для обеспечения доступа к информации о типе или для создания объектов данного класса. Второе назначение состоит в использовании ссылок конструктором форм Delphi при добавлении в форму нового компонента.