- •ЛР 1. Операторы и выражения Delphi
- •Оператор присваивания
- •Арифметические операторы
- •Оператор конкатенации строк
- •Логические операторы
- •Операторы поразрядного сдвига
- •Операторы отношения
- •Операторы множеств
- •Составной оператор begin..end
- •Условный оператор if..then..else
- •Оператор-селектор case
- •Оператор перехода goto
- •Оператор with..do
- •Организация циклов
- •Цикл с параметром for..do
- •Инструкция in в цикле for..do
- •Цикл с предусловием while..do
- •Цикл с постусловием repeat..until
- •Вложенные циклы
- •Операторы break и continue
- •ЗАДАНИЕ
- •Вариант 1.
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 2. Структурные типы
- •Множества
- •Записи
- •Вариантные поля
- •Усовершенствованная запись
- •Массивы
- •Объявление массива
- •Обращение к ячейкам массива
- •Динамический массив
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •Вариант 6
- •Вариант 7
- •Вариант 8
- •Вариант 9
- •Вариант 10
- •Вариант 11
- •Вариант 12
- •ЛР 3. Объекты и классы
- •Проектирование класса
- •Управление жизненным циклом объекта
- •Опережающее объявление класса
- •Ограничение видимости членов класса
- •Свойства объекта
- •Особенности объявления методов
- •Поля класса и методы класса
- •Иерархия наследования
- •Полиморфизм
- •ЗАДАНИЕ
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •ЛР4. Опорные классы VCL
- •Класс TObject
- •Класс TPersistent
- •Основа компонента, класс TComponent
- •Владение компонентом
- •Класс TControl
- •Принадлежность к родительскому контейнеру
- •Размещение и размеры элемента управления
- •События, связанные с изменением размеров
- •Выравнивание элемента управления в контейнере
- •Видимость и активность элемента управления
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант5
- •Совет
- •ЛР5. Обработка клавиатурных событий и событий мышки
- •Щелчки кнопками мыши
- •Перемещение указателя мыши
- •Вращение колесика мыши
- •Операция перетаскивания drag and drop
- •Обработка событий клавиатуры
- •Задание
- •Вариант 1
- •Вариант 2
- •Вариант 3
- •Вариант 4
- •Вариант 5
- •ЛР 6. Классы потоков данных
- •Прототип потоков данных, класс TStream
- •Потоки с дескриптором, класс THandleStream
- •Файловый поток данных, класс TFileStream
- •Пример работы с файловым потоком данных
- •Задание
- •Вариант 1.
- •Вариант 2.
- •Вариант 3.
- •Вариант 4.
- •Вариант 5.
Языки программирования
функций. Необязательный формальный параметр DragObject применяется наиболее подготовленными программистами для создания собственного экземпляра класса TDragObject, позволяющего осуществлять более тонкую настройку операций перетаскивания.
Как мы уже говорили, событие OnDragOver возникает в то время, когда курсор мыши с перетаскиваемым клиентом движется над элементом-приемником, а также в момент отпускания кнопки мыши. Обработчик события уведомляет о готовности элемента-получателя принять клиента.
property OnDragOver: TDragOverEvent;
TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean) of object;
Параметры события приведены в табл. 5.4.
|
|
Таблица 5.4. Параметры события OnDragOver() |
|
|
|
|
|
Параметр |
Возможные значения |
Описание |
|
|
|
|
|
Sender |
Любой потомок класса |
Ссылка на приемник |
|
|
TObject |
|
|
Source |
Ссылка на источник |
|
|
|
|
||
X, Y |
integer |
Координаты указателя над приемником |
|
State |
dsDragEnter |
Указатель появился над приемником |
|
|
dsDragLeave |
Указатель убран с поверхности приемника |
|
|
dsDragMove |
Указатель движется над приемником |
|
Accept |
Boolean |
Результат решения на прием клиента: |
|
|
|
• true — готовность к приему клиента; |
|
|
|
• false — отказ от приема |
|
Задачей программиста является информирование приложения (через параметр Accept) о готовности или отказе приема операции drag and drop. В случае положительного решения при отпускании кнопки мыши возникает событие
property OnDragDrop: TDragDropEvent;
type TDragDropEvent = procedure(Sender, Source: TObject; X, Y: Integer) of object;
Вне зависимости от готовности элемента-приемника к получению клиента, в финале перетаскивания элемент-источник генерирует событие:
property OnEndDrag: TEndDragEvent;
type TEndDragEvent = procedure(Sender, Target: TObject; X, Y: Integer) of object;
В рамках обработчика события допускается освободить захваченные ранее ресурсы или выполнить какие-то другие действия, определяемые программистом.
Обработка событий клавиатуры
Благодаря умению получать фокус ввода потомки класса TWinControl способны реагировать на события клавиатуры. Клавиатурных событий всего три, и они возникают в строгой последовательности:
1.В момент опускания клавиши у находящегося в фокусе ввода оконного элемента управления генерируется событие OnKeyDown().
2.В момент фиксации клавиши в нажатом положении вызывается событие OnKeyPress().
53
СКФУ Кафедра компьютерной безопасности
Языки программирования
3. Подъем клавиши сопровождается событием OnKeyUp().
События опускания и подъема клавиши (первое и третье в нашем списке) описываются идентичным набором параметров:
property OnKeyDown: TKeyEvent;
property OnKeyUp: TKeyEvent;
type TKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState) of object;
Здесь: Sender — ссылка на элемент управления, в котором возникло событие; Shift — индикатор состояния служебных клавиш <Shift>, <Ctrl> и <Alt>; Key — код клавиши (табл. 5.5).
|
|
|
|
|
Таблица 5.5. Коды клавиш |
|
|
|
|
|
|
|
|
Код клавиши |
|
Клавиша |
Код клавиши |
Клавиша |
||
|
|
|
|
|
|
|
VK_CANCEL |
|
<Ctrl>/<Break> |
VK_PRIOR |
<Page Up> |
||
VK_BACK |
|
<Backspace> |
VK_NEXT |
<Page Down> |
||
VK_TAB |
|
<Tab> |
VK_END |
<End> |
||
VK_RETURN |
|
<Enter > |
VK_HOME |
<Home> |
||
VK_SHIFT |
|
<Shift > |
VK_LEFT |
<←> |
||
VK_CONTROL |
|
<Ctrl > |
VK_UP |
<↑> |
||
VK_MENU |
|
<Alt > |
VK_RIGHT |
<→> |
||
VK_PAUSE |
|
<Pause > |
VK_DOWN |
<↓> |
||
VK_CAPITAL |
|
<CapsLock > |
VK_INSERT |
<Ins> |
||
VK_ESCAPE |
|
<Esc > |
VK_DELETE |
<Del > |
||
VK_SPACE |
|
<Пробел > |
VK_NUMLOCK |
<Num Lock> |
||
VK_SNAPSHOT |
|
<Print Screen> |
VK_SCROLL |
<Scroll Lock> |
||
Цифровые и символьные клавиши основной клавиатуры |
|
|
||||
|
|
|
|
|
|
|
VK_0, ..., VK_9 |
|
<0>, ..., <9> |
|
VK_A, ..., VK_Z |
<A>, ..., <Z> |
|
Функциональные клавиши |
|
|
|
|
|
|
|
|
|
|
|
|
|
VK_F1, ..., VK_F12 |
|
|
<F1>, ..., <F12> |
|
|
|
Дополнительная цифровая клавиатура (Num Lock включен) |
|
|
||||
|
|
|
|
|
||
VK_NUMPAD0, ..., VK_NUMPAD9 |
|
<0>, ..., <9> |
|
|
||
VK_MULTIPLY |
|
<*> |
|
VK_SUBTRACT |
|
<–> |
VK_ADD |
|
<+> |
|
VK_DIVIDE |
|
</> |
VK_DECIMAL |
|
|
<.> |
|
|
В момент фиксации клавиши в нажатом состоянии генерируется событие:
property OnKeyPress: TKeyPressEvent;
type TKeyPressEvent = procedure(Sender: TObject;
var Key: Char) of object;
Обратите внимание на то, что на этот раз параметр-переменная Key в обработчике отслеживает не код клавиши, а выбранный пользователем символ. Благодаря этому можно проверять корректность вводимого текста (листинг 5.4).
54
СКФУ Кафедра компьютерной безопасности