- •Объектно-ориентированное программирование
- •Часть 1 классы и объекты
- •Введение
- •1. Классы и объекты
- •Var aLine: tLine;
- •Var aColorLine: tColorLine;
- •2. Методы
- •2.1. Методы-функции и методы-процедуры
- •2.2. Конструкторы и деструкторы
- •Inherited Create;
- •Var TmpFrm: tForm;
- •Var Mem: tMemo;
- •2.3. Классовые процедуры и функции
- •Var s: String;
- •2.4. Скрытый Self
- •3. Видимость компонентов класса
- •4. Наследование
- •4.1. Основные понятия
- •4.2. Наследование полей
- •4.3. Поведение методов при наследовании
- •Var SomeObject: t1;
- •Virtual;
- •Virtual; Abstract;
- •4.4. Иерархия классов
- •4.5. Rtti
- •4.6. Проверка типа
- •4.7. Приведение типа
- •4.8. Указатели на класс
- •Var ObjRef: tObjRef;
- •Implementation
- •X, y, w, h: Integer): tControl;
- •5. Полиморфизм
- •6. Свойства (properties)
- •6.1. Объявление свойств
- •6.2. Объявления свойств-массивов
- •Var I: Byte;
- •6.3. Раздел Read
- •6.4. Раздел Write
- •Inherited Create;
- •Inherited Destroy;
- •6.5. Команды Default, NoDefault и Stored
- •6.6. Команда Index
- •Var aYear, aMonth, aDay: Word;
- •Var aYear, aMonth, aDay: Word;
- •6.7. Команды DispId и Implements
- •6.8. Переопределение свойств при наследовании
- •7. События (events)
- •7.1. Объявление событий
- •IfAssigned(fOnMouseMove) Then fOnMouseMove(Self, Shift, X, y);
- •Vk_return: NumMemo.DoNumStr(l);
- •Vk_return: PostMessage(NumMemo.Handle, wm_user1,1, 0);
- •7.2. Обработчики событий
- •7.3. Делегирование событий
- •Var Objl: tIstClass;
- •7.4. Переопределение стандартных событий
- •Var NewBtn: tNewButton;
IfAssigned(fOnMouseMove) Then fOnMouseMove(Self, Shift, X, y);
End;
Могут встречаться случаи, когда потребуется необходимость подавления реакции на те или иные действия, например:
• IfAssigned(OnKeyPress) Then OnKeyPress(Self, Key);
• If Key о #0 Then <onepamop>;
Разрабатываемые пользовательские события должны допускать пустые обработчики, т.е. пустой обработчик должен производит такой же результат, что и никакой обработчик вообще, например:
If Assigned(OnClick) Then OnClick(Self) Else <onepamop>;
Рассмотрим пример объявления пользовательского события. Создадим компонент-потомок от TMemo, позволяющий выводить в дополнительном компоненте Label 1 номер строки при перемещении по ним с помощью клавиш Up и Down.
• Первоначально объявляем указатель на метод и новый класс.
Type
TNumStrEvent=Procedure(Sender: TObject; Num: Integer) Of Object; // Указатель TNumMemo=Class(TMemo) // Объявление нового класса Private
FOnNumStr: TNumStrEvent; // Поле для события FNumStr; Integer; // Поле свойства Protected
Procedure DoNumStr(Num: Integer); Dynamic; // Корреспондирующий метод Public
Property NumStr: Integer Read FNumStr Write FNumStr; // Свойство Property OnNumStr: TNumStrEvent Read FOnNumStr Write FOnNumStr;
End;
Поле FNumStr и свойство NumStr введены для хранения номера текущей строки.
• Поскольку создать обработчик компонента объявленного класса невозможно, поэтому объявим однотипным метод в классе TFormI, а затем делегируем его нашему новому компоненту.
TForm' <:lass(TForm) Labell: TLabel;
Procedure FormCreate(Sender: TObject);
Procedure FormKeyDown(Sender: TObject; Var Key: Word;
Shift: TShiftState);
Public
NumMemo: TNumMemo; // Переменная типа класса Procedure EventNumStr(Sender: TObject; Num: Integer); // Обработчик End;
• Реализации корреспондирующего метода и метода EventNumStr могут иметь следующий вид:
Procedure TNumMemo.DoNumStr(Num; Integer);
Begin
IfAssigned(FOnNumStr) Then FOnNumStr(Self, Num); II Вызов обработчика End;
Procedure TForml.EventNumStr(Sender: TObject; Num: Integer);
Begin
NumMemo.NumStr:=NumMemo.NumStr+Num; // Определение номера строки
Labell.Caption:=IntToStr(NumMemo.NumStr); // Вывод номера строки End;
• Инициализацию компонента класса TNumMemo выполним с помощью виртуального конструктора, код которого разместим в событии OnCreate формы.
Procedure TForml.FormCreate(Sender: TObject);
Begin
NumMemo:=TNumMemo.Create(Self); // Инициализация компонента With NumMemo Do Begin Parent:=Self;
SetBounds(10,10,150,150); 11Размер и расположение Name:='NumMemo';
FNumStr:=l; // Начальное значение номера строки Visible:=True;
OnNumStr:=EventNumStr; II Делегирование события End;
Forml.KeyPreview;=True; II Для доступа к кодам клавиш End;
• С помощью события OnKeyDown формы обеспечим "отлавливание" кодов клавиш Up (VK_UP) и Down (VKJDOWN) и вызов корреспондирующего метода события объявленного класса TNumMemo. Ввод каждой новой строки увеличивает число строк в компоненте NumMemo и номер текущей строки после нажатия клавиши Enter (VK_RETURN).
Procedure TForml.FormKeyDown(Sender: TObject; Var Key: Word;
Shift: TShiftState);
Begin
Case Key Of
VK_DOWN: If NumMemo.NumStr<NumMemo.Lines.Count+l
Then NumMemo.DoNumStr(l);
VK_UP: IfNumMemo.NumStr>l Then NumMemo.DoNumStr(-l);