Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Визуальное программирование-лекция-7

.doc
Скачиваний:
20
Добавлен:
07.06.2015
Размер:
53.25 Кб
Скачать

Лекция № 7 DELPHI (конспекты лекций)

События в Delphi

  1. События в Delphi

Одна из ключевых целей среды визуального программирования – скрыть от пользователя сложность программирования в Windows. Delphi предоставляет полный доступ к подструктуре событий, предоставляемой Windows. С другой стороны, Delphi упрощает программирование обработчиков таких событий.

Объекты из библиотеки визуальных компонент (VCL) Delphi, равно как и объекты реального мира, имеют свой набор свойств и свое поведение – набор откликов на события, происходящие с ними. Список событий для данного объекта, на которые он реагирует, можно посмотреть, например, в Инспекторе Объектов на странице событий. (На самом деле, на этой странице представлен список свойств, которые имеют тип вроде TMouseMoveEvent и представляют из себя процедуры-обработчики событий.

Существует соглашение по названиям данных свойств. Например, OnDblClick соответствует двойному щелчку мыши, а OnKeyUp – событию, когда нажатая клавиша была отпущена.) Среди набора событий для различных объектов из VCL есть как события, портируемые из Windows (МouseMove, KeyDown), так и события, порождаемые непосредственно в программе (DataChange для TDataSource).

Поведение объекта определяется тем, какие обработчики и для каких событий он имеет. Создание приложения в Delphi состоит из настройки свойств используемых объектов и создания обработчиков событий.

Простейшие события, на которые иногда нужно реагировать – это, например, события, связанные с мышкой (они есть практически у всех видимых объектов) или событие Click для кнопки TButton.

Предположим, что вы хотите перехватить щелчок левой кнопки мыши на форме.

Чтобы сделать это – создайте новый проект, в Инспекторе Объектов выберите страницу событий и сделайте двойной щелчок на правой части для свойства OnClick. Вы получите заготовку для обработчика данного события:

procedure TForm1.FormClick(Sender: TObject);

begin

MessageDlg('Hello', mtInformation, [mbOk], 0);

end;

Каждый раз, когда делается щелчок левой кнопки мыши над формой, будет появляться окно диалога.

Синтаксис функции MessageDlg.

function MessageDlg(const Msg: WideString; DlgType: TMsgDlgType; Buttons: TMsgDlgButtons; HelpCtx: Longint; DefaultBtn: TMsgDlgBtn = mbNone; Bitmap: TBitmap = nil): Integer; overload;

Значения аргумента Buttons: TMsgDlgBtn перечисляются через запятую в квадратных скобках.

Значения аргумента Buttons: TMsgDlgBtn

Возвращаемые значения

mbOk

mrOk

mbCancel

mrCancel

mbYes

mrYes

mbNo

mrNo

mbAbort

mrAbort

mbRetry

mrRetry

mbIgnore

mrIgnore

При возникновении события, операционная система передает не только уведомление о нем, но и некоторую связанную с ним информацию. Например, при возникновении события “нажата левая кнопка мыши” программа информируется о том, в каком месте это произошло. Если вы хотите получить доступ к такой информации, то должны вернуться в Инспектор Объектов и создать обработчик события OnMouseDown:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

begin

Canvas.TextOut(X, Y, 'X='+IntToStr(X)+' Y='+IntToStr(Y));

end;

Используются аргументы следующих типов:

type TMouseButton = (mbLeft, mbRight, mbMiddle); // Нажатая клавиша мыши.

type TShiftState = set of (ssShift, ssAlt, ssCtrl, ssLeft, ssRight, ssMiddle, ssDouble); // Нажатая клавиша клавиатуры или кнопка мыши.

ssLeft Нажата левая кнопка мыши.

ssRight Нажата правая кнопка мыши.

ssMiddle Нажата средняя кнопка мыши.

ssDouble Двойной щелчок кнопкой мыши.

X,Y : координаты текущего положения мыши.

Мышкой не обязательно и щелкать.

Пример. Отображение в Label1 и Label2 текущих координат указателя мыши.

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);

begin

label1.Caption:=IntToStr(x);

label2.Caption:=IntToStr(y);

end;

Можно проанализировать и события связанные с нажатием клавиш на клавиатуре. Например, можно создать обработчик для OnKeyDown (нажата клавиша):

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);

begin

label3.Caption:=Chr(Key);

end;

Правда, будут отображаться только заглавные буквы латинского алфавита, арабские цифры и некоторые символы.

Для отображения не только латинских, но и русских букв достаточно следующей процедуры.

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);

begin

Label1.Caption:=Key

end;

Перемещение рисунка с помощью клавиш управления курсором можно организовать следующим образом.

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

label1.caption:=inttostr(key);

Case key of

39: Form1.Image1.left:= Form1.Image1.left+2;

37: Form1.Image1.left:= Form1.Image1.left-2;

38: Form1.Image1.Top:= Form1.Image1.Top-2;

40: Form1.Image1.Top:= Form1.Image1.Top+2;

34: Begin

Form1.Image1.left:= Form1.Image1.left+2;

Form1.Image1.Top:= Form1.Image1.Top+2;

end

end

end;

Есть способ обработки всех сообщений, которые получает приложение. Для этого используется свойство OnMessage объекта Application, который автоматически создается при запуске программы. Если определен обработчик события OnMessage, то он получает управление при любом событии, сообщение о котором направлено в программу. Следующий код будет приводить к появлению диалога при двойном щелчке мыши на любом объекте в приложении.

procedure TForm1.FormCreate(Sender: TObject);

begin

Application.OnMessage:=MessageDblClick;

end;

procedure TForm1.MessageDblClick(var Msg: TMsg; var Handled: Boolean);

begin

Handled:=False;

if Msg.Message = WM_LBUTTONDBLCLK

then

begin

MessageDlg('Двойное нажатие мыши', mtInformation, [mbOK], 0);

Handled:=True;

end;

end;

Конечно, в обработчике нельзя выполнять операции, требующие длительного времени, поскольку это приведет к замедлению выполнения всего приложения.

4