ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 1082
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ЛР 1. Операторы и выражения Delphi
Управление жизненным циклом объекта
Ограничение видимости членов класса
Особенности объявления методов
Принадлежность к родительскому контейнеру
Размещение и размеры элемента управления
Видимость и активность элемента управления
ЛР5. Обработка клавиатурных событий и событий мышки
— после перемещения мыши на небольшое расстояние (количество пикселов указывается в Threshold).ПринеобходимостипрерватьпроцессперетаскиваниявызываетсяметодprocedureEndDrag(Drop:Boolean);В случае если параметру Dropпередано значение true, то результаты перетаскивания будут приняты. В противном случае произойдет отмена.Завнешнийвидкурсораприоперацииперетаскиванияотвечаетсвойство:propertyDragCursor:TCursor;Если элемент-приемник по каким-то причинам отказывается получать данные от источника, то внешний вид курсора над ним будет соответствовать значению crNoDrop(перечеркнутый круг). Если все в порядке, то сигналом готовности станет курсор crDrag.Процессперетаскиванияпоследовательносопровождаетсячетырьмясобытиями(табл.5.3).Таблица5.3.Последовательностьсобытийвоперацииdraganddrop
ВмоментначалаперетягиваниягенерируетсясобытиеpropertyOnStartDrag:
TStartDragEvent;typeTStartDragEvent=procedure(Sender:TObject;varDragObject:TDragObject)ofobject;В программах Delphi обработчик события OnStartDrag() задействуется только при необходимости,напримердляинициализациипеременных,вызовадополнительныхпроцедурифункций. Необязательный формальный параметр DragObject применяется наиболее подготовленными программистами для создания собственного экземпляра класса TDragObject, позволяющего осуществлять более тонкую настройку операций перетаскивания.Как мы уже говорили, событие OnDragOver возникает в то время, когда курсор мыши с перетаскиваемым клиентом движется над элементом-приемником, а также в момент отпускания кнопки мыши. Обработчик события уведомляет о готовности элемента-получателя принять клиента.propertyOnDragOver:TDragOverEvent;TDragOverEvent=procedure(Sender,Source:TObject;X,Y:Integer;State:TDragState;varAccept:Boolean)ofobject;Параметрысобытияприведенывтабл.5.4.Таблица5.4.ПараметрысобытияOnDragOver()
Задачей программиста является информирование приложения (через параметр Accept) о готовности или отказе приема операции drag and drop. В случае положительного решения при отпускании кнопки мыши возникает событиеpropertyOnDragDrop:TDragDropEvent;typeTDragDropEvent=procedure(Sender,Source:TObject;X,Y:Integer)ofobject;Вне зависимости от готовности элемента-приемника к получению клиента, в финале перетаскивания элемент-источник генерирует событие:propertyOnEndDrag:TEndDragEvent;typeTEndDragEvent=procedure(Sender,Target:TObject;X,Y:Integer)ofobject;В рамках обработчика события допускается освободить захваченные ранее ресурсы иливыполнить какие-то другие действия, определяемые программистом.
Благодаря умению получать фокус ввода потомки класса TWinControl способны реагировать на события клавиатуры. Клавиатурных событий всего три, и они возникают в строгой последовательности:
События опускания и подъема клавиши (первое и третье в нашем списке) описываются идентичным набором параметров:
property OnKeyDown: TKeyEvent;
property OnKeyUp: TKeyEvent;
type TKeyEvent = procedure(Sender: TObject; var Key: Word;
Shift: TShiftState) of object;
Здесь: Sender — ссылка на элемент управления, в котором возникло событие; Shift — индикатор состояния служебных клавиш, и ; Key — код клавиши (табл. 5.5).
Таблица5.5.Кодыклавиш
В момент фиксации клавиши в нажатом состоянии генерируется событие:
property OnKeyPress: TKeyPressEvent;
type TKeyPressEvent = procedure(Sender: TObject;
var Key: Char) of object;
Обратите внимание на то, что на этот раз параметр-переменная Key в обработчике отслеживает не код клавиши, а выбранный пользователем символ. Благодаря этому можно проверять корректность вводимого текста (листинг 5.4).
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if ((KEY<'0') or (KEY>'9') or (Length(Edit1.Text)>=11)) and (KEY<>#8) then {#8 — код клавиши Backspace}
begin
Key:=#0;
if (Length(Edit1.Text)>=11)=false then
ShowMessage('Допускаются только цифры!')
else
ShowMessage('Длина текста превысила 11 знаков!')
end; end;
Событие осуществляет контроль верности ввода телефонного номера в строку ввода Edit1. Процедура допускает ввод только цифр, причем длина номера не должна превышать 11 символов. В противном случае ввод ошибочного символа отменяется (параметру-переменной Key присваивается значение #0) и выдается сообщение об ошибке.
9>0>9>0>
| События | Инициатор | Описание |
| OnStartDrag() | Элемент- источник | Над элементом-источником нажата кнопка мыши и начато движение с удержанием кнопки в нажатом состоянии |
| OnDragOver() | Элемент- приемник | Перетаскиваемый элемент находится над приемником |
| OnDragDroup() | Элемент- приемник | Над элементом-приемником отпущена кнопка мыши |
| OnEndDrag() | Элемент- источник | Сигнализирует о завершении перетаскивания, используется для освобождения используемых ресурсов, отмены операции и т. п. |
TStartDragEvent;typeTStartDragEvent=procedure(Sender:TObject;varDragObject:TDragObject)ofobject;В программах Delphi обработчик события OnStartDrag() задействуется только при необходимости,напримердляинициализациипеременных,вызовадополнительныхпроцедурифункций. Необязательный формальный параметр DragObject применяется наиболее подготовленными программистами для создания собственного экземпляра класса TDragObject, позволяющего осуществлять более тонкую настройку операций перетаскивания.Как мы уже говорили, событие OnDragOver возникает в то время, когда курсор мыши с перетаскиваемым клиентом движется над элементом-приемником, а также в момент отпускания кнопки мыши. Обработчик события уведомляет о готовности элемента-получателя принять клиента.propertyOnDragOver:TDragOverEvent;TDragOverEvent=procedure(Sender,Source:TObject;X,Y:Integer;State:TDragState;varAccept:Boolean)ofobject;Параметрысобытияприведенывтабл.5.4.Таблица5.4.ПараметрысобытияOnDragOver()
| Параметр | Возможные значения | Описание |
| Sender | Любой потомок класса TObject | Ссылка на приемник |
| Source | Ссылка на источник | |
| X, Y | integer | Координаты указателя над приемником |
| State | dsDragEnter | Указатель появился над приемником |
| | dsDragLeave | Указатель убран с поверхности приемника |
| | dsDragMove | Указатель движется над приемником |
| Accept | Boolean | Результат решения на прием клиента:
|
Задачей программиста является информирование приложения (через параметр Accept) о готовности или отказе приема операции drag and drop. В случае положительного решения при отпускании кнопки мыши возникает событиеpropertyOnDragDrop:TDragDropEvent;typeTDragDropEvent=procedure(Sender,Source:TObject;X,Y:Integer)ofobject;Вне зависимости от готовности элемента-приемника к получению клиента, в финале перетаскивания элемент-источник генерирует событие:propertyOnEndDrag:TEndDragEvent;typeTEndDragEvent=procedure(Sender,Target:TObject;X,Y:Integer)ofobject;В рамках обработчика события допускается освободить захваченные ранее ресурсы иливыполнить какие-то другие действия, определяемые программистом.
Обработка событий клавиатуры
Благодаря умению получать фокус ввода потомки класса TWinControl способны реагировать на события клавиатуры. Клавиатурных событий всего три, и они возникают в строгой последовательности:
-
В момент опускания клавиши у находящегося в фокусе ввода оконного элемента управления генерируется событие OnKeyDown(). -
В момент фиксации клавиши в нажатом положении вызывается событие OnKeyPress().
-
Подъем клавиши сопровождается событием OnKeyUp().
События опускания и подъема клавиши (первое и третье в нашем списке) описываются идентичным набором параметров:
property OnKeyDown: TKeyEvent;
property OnKeyUp: TKeyEvent;
type TKeyEvent = procedure(Sender: TObject; var Key: Word;
Shift: TShiftState) of object;
Здесь: Sender — ссылка на элемент управления, в котором возникло событие; Shift — индикатор состояния служебных клавиш
Таблица5.5.Кодыклавиш
| Код клавиши | Клавиша | Код клавиши | Клавиша | |
| VK_CANCEL | | VK_PRIOR | Up> | |
| VK_BACK | | VK_NEXT | Down> | |
| VK_TAB | | VK_END | | |
| VK_RETURN | | VK_HOME | | |
| VK_SHIFT | | VK_LEFT | <> | |
| VK_CONTROL | | VK_UP | <> | |
| VK_MENU | | VK_RIGHT | <> | |
| VK_PAUSE | > | VK_DOWN | <> | |
| VK_CAPITAL | | VK_INSERT | | |
| VK_ESCAPE | | VK_DELETE | | |
| VK_SPACE | <Пробел > | VK_NUMLOCK | | |
| VK_SNAPSHOT | Screen> | VK_SCROLL | | |
| Цифровые и символьные клавиши основной клавиатуры | ||||
| VK_0, ..., VK_9 | <0>, ..., <9> | VK_A, ..., VK_Z | , ..., | |
| Функциональные клавиши | ||||
| VK_F1, ..., VK_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).
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if ((KEY<'0') or (KEY>'9') or (Length(Edit1.Text)>=11)) and (KEY<>#8) then {#8 — код клавиши Backspace}
begin
Key:=#0;
if (Length(Edit1.Text)>=11)=false then
ShowMessage('Допускаются только цифры!')
else
ShowMessage('Длина текста превысила 11 знаков!')
end; end;
Событие осуществляет контроль верности ввода телефонного номера в строку ввода Edit1. Процедура допускает ввод только цифр, причем длина номера не должна превышать 11 символов. В противном случае ввод ошибочного символа отменяется (параметру-переменной Key присваивается значение #0) и выдается сообщение об ошибке.
9>0>9>0>
1 ... 18 19 20 21 22 23 24 25 26