
- •Литература
- •Содержание
- •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-автоматизации
События
Событие — это специальное свойство, являющееся указателем функции. Тип обобщенного указателя на функцию, которой передается один параметр типа TObject (обычно Self — данный объект), — TNotifyEvent. Подобный тип используется в Delphi для событий типа OnClick и многих других, которые передают в обработчик только один параметр — Sender: TObject. Если требуется ввести в класс подобное событие, достаточно определить в объявлении класса соответствующее поле и метод работы с ним. Например:
private
FMyEvent:TNotifyEvent;
published
property MyEvent:TNotifyEvent read FmyEvent write FMyEvent;
Остается только вызвать в нужный момент обработчик событий пользователя, если пользователь его предусмотрел. Проверка, имеется ли обработчик пользователя, осуществляется функцией assigned, которая возвращает true, если пользователь предусмотрел свой обработчик. Значит, при возникновении события надо проверять, имеется ли обработчик пользователя, и, если имеется, то вызвать его. Для этого можно использовать оператор вида:
if assigned(FMyEvent) then OnMyEvent(Self);
Функция OnMyEvent, которая вызывается этим оператором, это и есть обработчик пользователя. Его имя совпадает с именем . свойства, перед которым добавляется префикс «On».
Место, куда надо включать подобный оператор, зависит от вида события. Если событие вызывается каким-то из ваших методов, то вызов обработчика пользователя надо осуществлять из этого метода. Если событие связано с какими-то сообщениями, поступающими от других приложений или от Windows, то надо предусмотреть обработчик соответствующего сообщения (это подробно рассмотрено в разделе 1.11.3 главы 1) и из него вызывать обработчик пользователя.
Если в обработчик события надо передать какие-то параметры помимо Self, то тип функции TNotifyEvent уже не подходит и надо объявить свой собственный тип. Это объявление должно предшествовать объявлению класса. Например:
type
TMyEvent = procedure(Sender:TObject; var CanEvent:boolean) of object;
Т = class(TObject)
private
FMyEvent: TMyEvent;
published
property MyEvent: TMyEvent read FmyEvent write FMyEvent;
end;
Выше было рассмотрено введение в класс какого-то нового события. Если же вам надо переопределить одно из традиционных событий, связанных с клавиатурой, мышью и т. п., то это можно сделать, переопределив соответствующий стандартный обработчик родительского класса.
Объявление класса
Любой вновь создаваемый класс может содержать секции (разделы), определяемые зарезервированными словами published (декларированные), private (личные), protected (защищенные), public (доступные) и automated (автоматизированные). Внутри каждой секции вначале определяются поля, а затем - методы и свойства.
Секции определяют области видимости элементов описания класса. Секция public не накладывает ограничений на область видимости перечисляемых в ней полей, методов и свойств - их можно вызывать в любом другом модуле программы. Секция published также не ограничивает область видимости, однако в ней перечисляются свойства, которые должны быть доступны не только на этапе исполнения, но и на этапе конструирования программы (т.е. в окне Инспектора Объектов). Секция published используется только при разработке нестандартных компонентов. Среда Delphi помещает описания компонентов, вставленных в форму, в специальную секцию без названия, которая располагается сразу за заголовком класса и продолжается до первой объявленной секции. Эта секция - published. Программисту не следует помещать в нее собственные элементы описания класса или удалять из нее элементы, вставленные средой. Секция private сужает область видимости до минимума: личные элементы описания доступны только внутри методов данного класса и в подпрограммах, находящихся в том же модуле, где описан класс. Элемент, объявленный в секции private, становится недоступным даже ближайшим потомкам класса, если они размещаются в других модулях. Секция protected доступна только методам самого класса, а также любым его потомкам независимо от того, находятся ли они в том же модуле или нет. Наконец, секция automated используется только для объявления свойств и методов, которые будут добавлены к так называемому интерфейсу OLE-объектов автоматизации; область видимости членов этой секции не ограничена.
В Object Pascal разрешается сколько угодно раз объявлять любую секцию, причем порядок следования секций не имеет значения. Любая секция может быть пустой.
Следующий фрагмент кода поясняет области видимости.
Unit Unit1;
Interface
Uses Controls, Forms;
type
TForm1 = class(TForm)
Button1: TButton; // Эта секция обслуживается Delphi
// Ее элементы доступны всем
private // Эта секция доступна в модуле Unit1
FIntField: Integer;
Procedure SetValue(Value: Integer);
Function GetValue: Integer;
published // Эта секция доступна в любом модуле
Property IntField: read GetValue write SetValue;
protected // Эта секция доступна классам-потомкам
Procedure Proс1;
public // Эта секция доступна в любом модуле
Procedure Proc2;
end;
var
Forml: TForml;
Implementation
Procedure TForml.Procl;
begin
Buttonl.Color := clBtnFace; // Так можно
FIntField := 0; // Так можно
IntField := 0; // Так можно
Procl; // Так можно
Proc2; // Так можно
end;
begin
Forml.Buttonl.Color := clBtnFace; // Так можно
Forml.FIntField := 0; // Так можно
Forml.IntField := 0; // Так можно
Forml.Procl; // Так нельзя
Forml.Proc2; // Так можно
end.
Unit Unit2;
Interface
Uses Controls, Unitl;
type
TForm2 = class(TForml)
Button2: TButton;
Procedure Button2Click(Sender: TObject);
end;
var
Form2: TForm2;
Implementation
Procedure TForm2.Button2Click(Sender: TObject);
begin
Button1.Color:= clBtnFace; // Так можно
FIntField := 0; // Так нельзя
IntField := 0; // Так можно
Procl; // Так можно
Proc2; // Так можно
end;
begin
Forml.Buttonl.Color := clBtnFace; // Так можно
Forml.FIntField := 0; // Так нельзя
Forml.IntField := 0; // Так можно
Forml.Procl; // Так нельзя
Forml.Proc2; // Так можно
end.
При объявлении класса-потомка разрешается перемещать элементы класса из одной области видимости в другую. Для предыдущего примера допустимо такое объявление:
type
TForm2 = class(TForml)
…..
Public
Procedure Proc1;
……
end;
После этого в модуле Unit2 возможно такое обращение:
Form2 . Proс1;
После перемещения в секцию private элемент объявления становится невидим потомкам (если потомок, как это обычно бывает, объявляется в другом модуле) и, следовательно, его уже нельзя переместить в другую секцию.
Класс может объявляться только в интерфейсной области модуля или в самом начале области реализации. Нельзя определять классы в разделе описаний подпрограмм.