среда, 15 октября 2014 г.

10. События формы. Лабораторные Delphi, C++ (6)


События перемещения мыши на форме в Delphi и C++Builder

Здесь будут исследованы события формы, появляющиеся при перемещениях пользователем указателя мыши по форме:
·       OnMouseEnter. Возникает, когда пользователь переводит указатель мыши на поверхность формы — перемещая его с другого компонента формы или из-за пределов формы.
·       OnMouseMove. Возникает, когда указатель мыши перемещается по форме.
·       OnMouseLeave. Возникает, когда указатель мыши покидает форму.
·       OnMouseWheel. Возникает, когда пользователь вращает колесо мыши в любую сторону.
·       OnMouseWheelDown. Возникает, когда пользователь вращает колесо мыши вниз.
·       OnMouseWheelUp. Возникает, когда пользователь вращает колесо мыши вверх.
Запустите на выполнение Delphi или C++Builder. Создайте новый проект, выбрав в меню File | New | VCL Forms Application - Delphi (File | New | VCL Forms Application – C++Builder).
Положите на форму компонент ListBox. Сюда будут помещаться сообщения программы. Установите в значение True все подсвойства свойства Anchors: akLeft, akTop, akRight и akBottom. Компонент будет привязан ко всем сторонам формы.
В верхней части формы разместите четыре компонента Label. Двум правым компонентам метки присвойте имена LX и LY. Они будут использованы для отображения текущих координат курсора мыши.












Рис. 1. Созданная форма

События перемещения мыши

Выделите мышью форму, перейдите на вкладку событий в Инспекторе Объектов. Создайте следующие обработчики событий для OnMouseEnter и OnMouseLeave:
Delphi
procedure TForm1.FormMouseEnter(Sender: TObject);
begin
  ListBox1.Items.Add('FormMouseEnter');
end;

procedure TForm1.FormMouseLeave(Sender: TObject);
begin
  ListBox1.Items.Add('FormMouseLeave');
end;
C++Builder
void __fastcall TForm1::FormMouseEnter(TObject *Sender)
{
  ListBox1->Items->Add("FormMouseEnter");
}

void __fastcall TForm1::FormMouseLeave(TObject *Sender)
{
  ListBox1->Items->Add("FormMouseLeave");
}
Запустите программу на выполнение. Перемещайте мышь по форме. Проследите за порядком появления событий.
Выделите мышью форму, перейдите на вкладку событий в Инспекторе Объектов. Создайте следующий обработчик события для OnMouseMove:
Delphi
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  LX.Caption := IntToStr(X);
  LY.Caption := IntToStr(Y);
end;
C++Builder
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
  int X, int Y)
{
  LX->Caption = IntToStr(X);
  LY->Caption = IntToStr(Y);
}
Обработчику события перемещения мыши по форме OnMouseMove передаются параметры X и Y, которые задают, соответственно, горизонтальную и вертикальную координату курсора мыши (в пикселах) относительно клиентской области окна. При перемещении мыши по форме в тексты меток LX и LY будут помещаться текущие координаты курсора мыши.

События вращения колеса мыши

Напишите следующий обработчик события вращения пользователем колеса мыши OnMouseWheel:
Delphi
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  ListBox1.Items.Add('FormMouseWheel, WheelDelta = ' + IntToStr(WheelDelta));
end;
C++Builder
void __fastcall TForm1::FormMouseWheel(TObject *Sender, TShiftState Shift,
  int WheelDelta, TPoint &MousePos, bool &Handled)
{
  ListBox1->Items->Add("FormMouseWheel, WheelDelta = " + IntToStr(WheelDelta));
}
Обработчику события передается и целочисленный параметр WheelDelta, определяющий величину смещения колеса мыши. Если это число положительное, то колесо мыши вращается вверх, если отрицательное, то вниз.
Напишите следующие обработчики событий вращения колеса мыши вверх и вниз: OnMouseWheelUp и OnMouseWheelDown:
Delphi
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  ListBox1.Items.Add('FormMouseWheelUp. X = ' +
    IntToStr(MousePos.X) + ', Y = ' + IntToStr(MousePos.Y));
end;

procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;
  MousePos: TPoint; var Handled: Boolean);
begin
  ListBox1.Items.Add('FormMouseWheelDown. X = ' +
    IntToStr(MousePos.X) + ', Y = ' + IntToStr(MousePos.Y));
end;
C++Builder
void __fastcall TForm1::FormMouseWheelUp(TObject *Sender, TShiftState Shift,
  TPoint &MousePos, bool &Handled)
{
  ListBox1->Items->Add("FormMouseWheelUp. X = " +
     IntToStr(__int64(MousePos.x)) + ", Y = " +
      IntToStr(__int64(MousePos.y)));
}

void __fastcall TForm1::FormMouseWheelDown(TObject *Sender, TShiftState Shift,
  TPoint &MousePos, bool &Handled)
{
  ListBox1->Items->Add("FormMouseWheelDown. X = " +
     IntToStr(__int64(MousePos.x)) + ", Y = " +
      IntToStr(__int64(MousePos.y)));
}
Параметр MousePos, передаваемый обоим событиям, является экземпляром класса TPoint. Он содержит члены X и Y, определяющие координаты курсора мыши относительно экрана.
Запустите программу на выполнение. Выполняйте вращение колеса мыши вверх и вниз. Посмотрите на результаты.




















вторник, 24 июня 2014 г.

9. События формы. Лабораторные Delphi, C++ (5)

Основные события формы в Delphi и C++Builder

Здесь будут исследованы события формы, связанные с появлением формы на экране, переключением между формами одного приложения, закрытием и изменениями размера формы:
·          OnActivate. Возникает после того, как форма становится активной — при первоначальном запуске приложения или когда форма после потери фокуса вновь получает фокус.
·          OnDeactivate. Возникает при деактивации формы — при потере фокуса, когда клиент переключается на другую форму того же приложения.
·          OnClose. Возникает непосредственно перед закрытием формы, после события OnCloseQuery.
·          OnCloseQuery. Возникает до закрытия формы перед событием OnClose.
·          OnPaint. Возникает при прорисовке формы.
·          OnResize. Возникает при изменении размера формы.
·          OnShow. Возникает один раз при начальной загрузке формы.

Запустите на выполнение Delphi или C++Builder. Создайте новый проект, выбрав в меню File | New | VCL Forms Application - Delphi (File | New | VCL Forms Application – C++Builder).

Создание двух форм

Положите на форму две кнопки Button с заголовками Форма и Завершить и компонент ListBox. В компонент ListBox будут помещаться информационные сообщения программы.











Рис. 1. Главная форма
При отображении такой формы, если размеры будут изменяться пользователем, то компонент ListBox будет занимать неправильное положение на форме. Чтобы размеры этого компонента каждый раз соответствовали размеру формы (чтобы от каждого края компонента до ближайшего края формы расстояние оставалось одинаковым), нужно установить значения для свойства Anchors компонента ListBox. Раскройте это свойство, щелкнув мышью по символу + слева от имени компонента. По умолчанию компонент привязан к левому верхнему углу формы — в значение True установлены подсвойства akLeft и akTop. Следует также установить в True значения подсвойств akRight и akBottom.
(Свойство Anchors мы с вами рассмотрим несколько позже, когда будем говорить о других компонентах).
Запустите программу на выполнение. Изменяйте размеры формы. Компонент ListBox в любом случае будет занимать на форме соответствующее положение с теми же расстояниями от края формы.
Создайте новую форму. Свяжите первую форму со второй.
Дважды щелкните мышью по кнопке Форма. Напишите следующий обработчик вызова второй формы:
Delphi
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show();
end;
C++Builder
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Form2->Show();
}
Вторая форма вызывается в немодальном варианте.
Для второй кнопки Завершить напишите обработчик щелчка, где форма закрывается методом Terminate класса Application:
Delphi
Application.Terminate();
C++Builder
Application->Terminate();

Основные события формы

OnShow

Выделите мышью первую форму, перейдите на вкладку событий, щелкнув мышью по вкладке Events в окне Object Inspector. Найдите событие OnShow и дважды щелкните мышью справа от названия события. В появившейся заготовке введите текст:
Delphi
procedure TForm1.FormShow(Sender: TObject);
begin
  Application.MessageBox('Show', 'Test', MB_OK);
end;
C++Builder
void __fastcall TForm1::FormShow(TObject *Sender)
{
  Application->MessageBox(L"Show", L"Test", MB_OK);
}
Поскольку в RAD Studio по умолчанию используются строки с кодировкой Юникод, в случае C++Builder перед строковым литералом в функции MessageBox нужно указать символ L.
Событие OnShow возникает перед первым появлением формы на экране. Чтобы отобразить факт возникновения этого события используется метод MessageBox объекта Application.
Запустите программу на выполнение. До того, как на экране появится сама форма, будет выдано сообщение:








Рис. 2. Сообщение о начале работы программы

OnActivate/OnDeactivate

Событие OnActivate возникает после того, как форма становится активной — при первоначальном запуске приложения или когда форма после потери фокуса вновь получает фокус, если пользователь перемещается между разными формами одного и того же приложения. Создайте следующий обработчик этого события:
Delphi
procedure TForm1.FormActivate(Sender: TObject);
begin
  ListBox1.Items.Add('FormActivate');
end;
C++Builder
void __fastcall TForm1::FormActivate(TObject *Sender)
{
  ListBox1->Items->Add("FormActivate");
}
Здесь в компонент ListBox помещается строка, информирующая о произошедшем событии.
Событие OnDeactivate возникает при деактивации формы — при потере фокуса, когда пользователь переключается на другую форму того же приложения. Для этого события напишите следующий обработчик:
Delphi
procedure TForm1.FormDeactivate(Sender: TObject);
begin
  ListBox1.Items.Add('FormDeactivate');
end;
C++Builder
void __fastcall TForm1::FormDeactivate(TObject *Sender)
{
  ListBox1->Items->Add("FormDeactivate");
}
Запустите программу на выполнение. Вызовите вторую форму, щелкнув по кнопке Форма. Переключайтесь с одной формы этого приложения на другую. В текстовом окне будут отображаться события активации/деактивации.

OnCloseQuery, OnClose

Событие OnCloseQuery возникает до закрытия формы непосредственно перед событием OnClose. Обработчику передается в виде параметра объект CanClose класса bool. Задавая в обработчике этого события свойству CanClose значение false, можно отменить закрытие формы. Значением по умолчанию является true — форма может быть закрыта.
Напишите следующий обработчик события:
Delphi
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if (Application.MessageBox('Завершить работу?',
      'CloseQuery', MB_OKCANCEL) = mrOk) then
    CanClose := true
  else
    CanClose := false;
end;
C++Builder
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  if (Application->MessageBox(L"Завершить работу?",
      L"CloseQuery", MB_OKCANCEL) == mrOk)
    CanClose = true;
  else
    CanClose = false;
}
Здесь при попытке закрыть форму пользователю выдается запрос о необходимости закрытия формы. Если пользователь щелкает по кнопке OK, то происходит закрытие формы. Иначе форма не закрывается.
Однако при выполнении оператора
Application.Terminate();
Application->Terminate();
событие OnCloseQuery не возникает.








Рис. 3. Запрос на завершение работы программы
Напишите следующий обработчик события OnClose:
Delphi
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Application.MessageBox('FormClose', 'Test', MB_OK);
end;
C++Builder
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  Application->MessageBox(L"FormClose", L"Test", MB_OK);
}
Событие OnClose также не возникает в случае выполнения оператора
Application.Terminate();
Application->Terminate();

Другие простые события формы

Событие OnPaint возникает, когда необходимо выполнить прорисовку формы либо при изменении ее размеров в сторону увеличения, либо при появлении формы на экране. Событие OnResize возникает при любом изменении размера формы.
Напишите следующие обработчики для этих двух событий:
Delphi
procedure TForm1.FormPaint(Sender: TObject);
begin
  ListBox1.Items.Add('FormPaint');
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  ListBox1.Items.Add('FormResize');
end;
C++Builder
void __fastcall TForm1::FormPaint(TObject *Sender)
{
  ListBox1->Items->Add("FormPaint");
}

void __fastcall TForm1::FormResize(TObject *Sender)
{
  ListBox1->Items->Add("FormResize");
}
Выполните программу, изменяйте размеры формы. Событие OnPaint возникает при прорисовке формы. Это событие будет происходить в самом начале выполнения программы, а также при изменении размеров формы в сторону увеличения. OnResize появляется при начальном запуске программы и при любом изменении размера формы.




суббота, 10 мая 2014 г.

8. События формы


Наиболее важные события формы представлены в следующей таблице.

Таблица 1. Основные события формы
Событие
Описание
OnActivate
Возникает после того, как форма становится активной — при первоначальном запуске приложения или когда форма после потери фокуса при перемещении фокуса к другой форме того же приложения вновь получает фокус.
OnClick
Возникает, когда пользователь щелкает левой кнопкой мыши по форме. Появляется после события OnMouseDown. Событие будет отправлено приложению лишь после того, как пользователь отпустит кнопку мыши.
OnClose
Возникает непосредственно перед закрытием формы, после события OnCloseQuery.
OnCloseQuery
Возникает до закрытия формы перед событием OnClose. В обработчике этого события можно на основании действий пользователя разрешить или отменить закрытие формы. Обработчику события передается параметр CanClose типа Boolean. Чтобы отменить закрытие формы свойству CanClose следует присвоить значение False. Значением по умолчанию является True — форма будет закрыта.
OnCreate
Возникает всего один раз в момент создания формы. Предшествует событиям OnShow и OnActivate.
OnDeactivate
Возникает при деактивации формы — при потере фокуса, когда клиент переключается на другую форму того же приложения.
OnDblClick
Возникает, когда пользователь дважды щелкает левой кнопкой мыши по форме. В этом случае порядок появления событий следующий:
·  OnMouseDown
·  OnClick
·  OnMouseUp
·  OnDblClick
·  OnMouseDown
·  OnMouseUp.
Событие будет отправлено приложению лишь после того, как пользователь второй раз отпустит кнопку мыши.
OnKeyDown
Возникает при нажатии пользователем на клавиатуре любой клавиши, включая ту, которая не вводит никаких символов (Ctrl, Shift, Alt и т.д.). Предшествует событию OnKeyPress.
OnKeyPress
Возникает при нажатии пользователем на клавиатуре клавиши, которая позволяет ввести отображаемый символ. Происходит сразу после OnKeyDown.
OnKeyUp
Возникает, когда пользователь отпускает нажатую клавишу, включая ту, которая не вводит никаких символов (Ctrl, Shift, Alt и т.д.). Происходит после событий OnKeyDown и OnKeyPress.
OnMouseDown
Возникает, когда пользователь нажимает на форме любую кнопку мыши. Предшествует событию OnClick.
OnMouseEnter
Событие происходит, когда пользователь переводит указатель мыши на поверхность формы — перемещая его с другого компонента формы или из-за пределов формы.
OnMouseLeave
Возникает, когда указатель мыши покидает форму.
OnMouseMove
Возникает, когда указатель мыши перемещается на форме.
OnMouseUp
Событие возникает, когда пользователь нажимает любую кнопку мыши, а потом ее отпускает. Перед этим могут происходить все сопутствующие события.
OnMouseWeel
Событие возникает, когда пользователь вращает колесо мыши.
OnMouseWeelDown
Событие возникает, когда пользователь вращает колесо мыши вниз.
OnMouseWeelUp
Событие возникает, когда пользователь вращает колесо мыши вверх.
OnPaint
Возникает при прорисовке формы, когда размеры формы увеличиваются.
OnResize
Возникает при любом изменении размеров формы как в сторону увеличения, так и в сторону уменьшения.
OnShow
Возникает при начальной загрузке формы перед событием OnActivate, а также в случае, когда форма становится видимой (свойству Visible присваивается значение True).

воскресенье, 30 марта 2014 г.

7. Свойства и методы формы. Лабораторные Delphi, C++ (4)


Создание непрямоугольных форм в Delphi и C++Builder

Запустите на выполнение Delphi или C++Builder. Создайте новый проект, выбрав в меню File | New | VCL Forms Application - Delphi (File | New | VCL Forms Application – C++Builder). Появится форма нового проекта.

Создание овальной формы

С вкладки Additional положите на форму компонент Image. Задайте для него следующие свойства:
·        AutoSize = True.
·        Left = 0, Top = 0.
Загрузите в этот компонент рисунок, щелкнув мышью справа от свойства Picture по кнопке с многоточием. Появится окно редактирования изображения:













Рис. 1. Окно Picture Editor
Щелкните мышью по кнопке Load и в каталоге на диске выберите подходящий графический файл. В окне Picture Editor щелкните по кнопке ОК.
Установите следующие свойства формы:
·        BorderStyle = bsNone.
·        Position = poScreenCenter.
Размеры формы (Height и Width) установите в соответствии с размерами картинки.
Положите на форму кнопку, задав для нее текст Close и размер шрифта Font 7, начертание жирное, Bold.
Форма примет следующий вид:




Рис. 2. Непрямоугольная форма
В обработчике события щелчка по этой кнопке задайте оператор закрытия формы:
Close();
Изменить представление формы на экране, отличное от прямоугольного, можно только в режиме выполнения программы. Напишите следующий обработчик события создания формы (OnCreate):
Delphi
procedure TForm1.FormCreate(Sender: TObject);
begin
  SetWindowRgn(Handle, CreateEllipticRgn(
  0, // x-координата левого верхнего угла
     // ограничивающего прямоугольника
  0, // y-координата левого верхнего угла
     // ограничивающего прямоугольника
  Height, // x-координата правого нижнего
          // угла ограничивающего прямоугольника
  Width   // y-координата правого нижнего
          // угла ограничивающего прямоугольника
  ), TRUE);
end;
C++Builder
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  HRGN hRgn = CreateEllipticRgn(
  0, // x-координата левого верхнего угла
     // ограничивающего прямоугольника
  0, // y-координата левого верхнего угла
     // ограничивающего прямоугольника
  Height, // x-координата правого нижнего
          // угла ограничивающего прямоугольника
  Height  // y-координата правого нижнего
          // угла ограничивающего прямоугольника
  );
  SetWindowRgn(Handle, hRgn, TRUE);
}
Событие OnCreate возникает перед созданием формы. В обработчике этого события создается объект hRgn типа HRGN. Метод CreateEllipticRgn позволяет создать эллипс с указанными характеристиками — координаты верхнего левого и правого нижнего угла (x, y). Функция SetWindowRgn позволяет изменять внешний вид формы во время выполнения программы.
Запустите программу на выполнение. Появившаяся форма будет иметь следующий вид:






Рис. 3. Выполнение программы
Переместить такую форму мышью по экрану невозможно, поскольку у нее отсутствует заголовок. Завершите работу программы, щелкнув по кнопке закрытия.