ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 284
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
ЛР 1. Операторы и выражения Delphi
Управление жизненным циклом объекта
Ограничение видимости членов класса
Особенности объявления методов
Принадлежность к родительскому контейнеру
Размещение и размеры элемента управления
Видимость и активность элемента управления
ЛР5. Обработка клавиатурных событий и событий мышки
— после перемещения мыши на небольшое расстояние (количество пикселов указывается в Threshold).
При необходимости прервать процесс перетаскивания вызывается метод
procedure EndDrag(Drop: Boolean);
В случае если параметру Drop передано значение true, то результаты перетаскивания будут приняты. В противном случае произойдет отмена.
За внешний вид курсора при операции перетаскивания отвечает свойство:
property DragCursor: TCursor;
Если элемент-приемник по каким-то причинам отказывается получать данные от источника, то внешний вид курсора над ним будет соответствовать значению crNoDrop (перечеркнутый круг). Если все в порядке, то сигналом готовности станет курсор crDrag.
Процесс перетаскивания последовательно сопровождается четырьмя событиями (табл. 5.3).
Таблица5.3.Последовательностьсобытийвоперацииdraganddrop
В момент начала перетягивания генерируется событие
property OnStartDrag:
TStartDragEvent;
type TStartDragEvent = procedure(Sender: TObject;
var DragObject: TDragObject) of object;
В программах Delphi обработчик события OnStartDrag() задействуется только при необходимости, например для инициализации переменных, вызова дополнительных процедур и
функций. Необязательный формальный параметр 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()
Задачей программиста является информирование приложения (через параметр 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 способны реагировать на события клавиатуры. Клавиатурных событий всего три, и они возникают в строгой последовательности:
События опускания и подъема клавиши (первое и третье в нашем списке) описываются идентичным набором параметров:
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>
Разработайте приложение, состоящее из одной формы и нескольких (не менее 10) произвольных элементов управления.
Приложение должно позволять пользователю самостоятельно назначать местоположение элементов управления, перемещая их мышью во время выполнения программы.
Замечание
Постарайтесь, чтобы листинг программы не превысил 100 строк кода!
Разработайте приложение-калькулятор позволяющее осуществлять 4 основных арифметических операции. Пользовательский интерфейс калькулятора должен позволять осуществлять расчёты без использования мышки (управление с клавиатуры)
Замечание
Постарайтесь, чтобы листинг программы не превысил 200 строк кода!
Разработайте приложение позволяющее осуществлять перетаскивание (интерфейс drag and drop) текстовых надписей из одного списка (компонент TListBox) в другой.
Замечание
Постарайтесь, чтобы листинг программы не превысил 80 строк кода!
Разработайте приложение содержащее не менее 5 компонентов TImage. Загрузите в один из компонентов рисунок. Реализуйте интерфейс (drag and drop) позволяющий осуществлять перетаскивание текстовых надписей из одного компонента в другой.
Замечание
Постарайтесь, чтобы листинг программы не превысил 80 строк кода!
Разработайте приложение позволяющее пользователю (используя только клавиатуру) изменять размеры и положение главной формы.
Замечание
Постарайтесь, чтобы
При необходимости прервать процесс перетаскивания вызывается метод
procedure EndDrag(Drop: Boolean);
В случае если параметру Drop передано значение true, то результаты перетаскивания будут приняты. В противном случае произойдет отмена.
За внешний вид курсора при операции перетаскивания отвечает свойство:
property DragCursor: TCursor;
Если элемент-приемник по каким-то причинам отказывается получать данные от источника, то внешний вид курсора над ним будет соответствовать значению crNoDrop (перечеркнутый круг). Если все в порядке, то сигналом готовности станет курсор crDrag.
Процесс перетаскивания последовательно сопровождается четырьмя событиями (табл. 5.3).
Таблица5.3.Последовательностьсобытийвоперацииdraganddrop
События | Инициатор | Описание |
OnStartDrag() | Элемент- источник | Над элементом-источником нажата кнопка мыши и начато движение с удержанием кнопки в нажатом состоянии |
OnDragOver() | Элемент- приемник | Перетаскиваемый элемент находится над приемником |
OnDragDroup() | Элемент- приемник | Над элементом-приемником отпущена кнопка мыши |
OnEndDrag() | Элемент- источник | Сигнализирует о завершении перетаскивания, используется для освобождения используемых ресурсов, отмены операции и т. п. |
В момент начала перетягивания генерируется событие
property OnStartDrag:
TStartDragEvent;
type TStartDragEvent = procedure(Sender: TObject;
var DragObject: TDragObject) of object;
В программах Delphi обработчик события OnStartDrag() задействуется только при необходимости, например для инициализации переменных, вызова дополнительных процедур и
функций. Необязательный формальный параметр 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 | Результат решения на прием клиента:
|
Задачей программиста является информирование приложения (через параметр 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 способны реагировать на события клавиатуры. Клавиатурных событий всего три, и они возникают в строгой последовательности:
-
В момент опускания клавиши у находящегося в фокусе ввода оконного элемента управления генерируется событие 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
Задание
Вариант 1
Разработайте приложение, состоящее из одной формы и нескольких (не менее 10) произвольных элементов управления.
Приложение должно позволять пользователю самостоятельно назначать местоположение элементов управления, перемещая их мышью во время выполнения программы.
Замечание
Постарайтесь, чтобы листинг программы не превысил 100 строк кода!
Вариант 2
Разработайте приложение-калькулятор позволяющее осуществлять 4 основных арифметических операции. Пользовательский интерфейс калькулятора должен позволять осуществлять расчёты без использования мышки (управление с клавиатуры)
Замечание
Постарайтесь, чтобы листинг программы не превысил 200 строк кода!
Вариант 3
Разработайте приложение позволяющее осуществлять перетаскивание (интерфейс drag and drop) текстовых надписей из одного списка (компонент TListBox) в другой.
Замечание
Постарайтесь, чтобы листинг программы не превысил 80 строк кода!
Вариант 4
Разработайте приложение содержащее не менее 5 компонентов TImage. Загрузите в один из компонентов рисунок. Реализуйте интерфейс (drag and drop) позволяющий осуществлять перетаскивание текстовых надписей из одного компонента в другой.
Замечание
Постарайтесь, чтобы листинг программы не превысил 80 строк кода!
Вариант 5
Разработайте приложение позволяющее пользователю (используя только клавиатуру) изменять размеры и положение главной формы.
Замечание
Постарайтесь, чтобы