Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы программирования в Delphi. Учебно-методическое пособие
.pdf
Основы программирования в Delphi
ющий ей файл для ввода текста программы для элементов управления, распо-
ложенных на этой форме (модуль Unit2).
В разделе implementation модуля Unit1 добавьте ссылку на модуль Unit2
(напишите строку uses Unit2) и в разделе interface модуля Unit2 добавьте ссылку на Unit1.
Свойство Visible определяет видимость формы. Если это свойство имеет
значение True, то форма становится видимой. Вместо использования свойства
Visible лучше применять метод Show, например, Form2. Show. Он лучше тем,
что показывает форму, перемещает ее на передний план экрана и делает актив-
ной.
Показ формы как модального окна
Между появившейся на экране формой Form2 и главным окном (Form1)
можно переключиться произвольным способом. Такой подход не всегда удобен. Обычно в приложениях переключение на другую форму допускается толь-
ко при закрытии текущей вспомогательной формы. Такой режим работы окна
называется модальным. Чтобы вызвать форму в модальном режиме, необходимо использовать метод ShowModal. Например,
Form2.ShowModal;
Пример. В основной форме Form1 установим командную кнопку Новый
студент и поле меток (рис.11.9).
91

Основы программирования в Delphi
Рис. 11.9 Основная форма
При щелчке на этой кнопке должна появиться вспомогательная форма
Form2, где вводятся данные о новом студенте (рис. 11.10). При нажатии на
кнопке ОК этой формы введенные данные будут отображаться в поле меток
главной формы.
Рис. 11.10 Вспомогательная форма
Для сохранения введенных данных в разделе глобальных данных модуля
Unit1 определим новый тип TStudent и переменную Stud1 этого типа. Переменая Accepted будет равен True, если нажата кнопка ОК, и равен False если
нажата кнопка Отмена.
С учетом сказанного, код модуля Unit1 имеет вид:
type
TStudent = record
Name : string;
Kurs : 1 .. 5;
Address : string;
Phone : integer;
end;
var
92

Основы программирования в Delphi
Form1: TForm1;
Stud1 : TStudent;
Accepted : boolean;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.ShowModal;
with Stud1 do begin
if Accepted=True
then
Label1.Caption :='Принять студент ' + Name + #13+
' на ' + IntToStr(Kurs) +'-й курс' +#13 +
'Адрес - ' + Address + #13+
'Телефон - ' + IntToStr (Phone)
else
Label1.Caption:= 'Отказ от введеных данных';
end; // end of with
end;
Код для кнопок ОК и Отмена расположенных на форме Form2 имеет вид:
procedure TForm2.cmdOKClick(Sender: TObject);
begin
Stud1.Name:= Edit1.Text;
Stud1.Kurs:= StrToInt(Edit2.Text);
Stud1.Address:= Edit3.Text;
Stud1.Phone:= StrToInt(Edit4.Text);
Accepted:= True;
Form2.Close;
end;
procedure TForm2.cmdCanselClick(Sender: TObject);
begin
Accepted := False;
Form2.Close;
end;
93

Основы программирования в Delphi
Как видно из работы этой программы, только после закрытия модального
окна возможно переходить на основное окно. Причем, код последующий после
выражения Form2.ShowModal, выполняется только после закрытия модального
окна.
В конце заметим, что формы, оформленные как диалоговые окна, не должны изменять своих размеров. Для этого свойство BorderStyle для формы Form2
следует установить на значение bsDialog.
11.5. Обработка событий мыши
Управление большинства программ Windows осуществляется с помощью
мыши. В системе Delphi 7 имеется событие OnClick, которое происходит при
щелчке на кнопке мыши. Недостатком обработчика этого события является то,
что этому обработчику не передается координаты мыши, состояние клавиш
Shift, Alt и Ctrl.
События OnMouseDown, OnMouseUp и OnMouseMove
Обработчики событий OnMouseDown (при нажатии кнопки мыши) и OnMouseUp (при отпускании кнопки мыши) содержат подробную информацию о
параметрах щелчка: координаты мыши, тип щелчка (одинарный или двойной),
какая кнопка мыши была нажата/отпущена и состояние системных клавиш Shift,
Alt и Ctrl.
Эти события отдельно существуют для многих элементов управления. Об-
работчики этих событий отличаются только названиями, список их параметров
полностью совпадают. Например, для формы обработчик события On-
MouseDown имеет заголовок:
procedure TForm1.FormMouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Для командной кнопки с именем Button1 заголовок обработчика события
OnMouseUp имеет вид:
procedure TForm1.Button1MouseUp (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
Здесь предполагалось, что форма и командная кнопка имеют стандартные
названия: Form1 и Button1.
Рассмотрим параметров этих процедур. Параметр Sender имеет такое же
назначение, что и в других обработчиках. Параметр Button определяет, какая
кнопка мыши была нажата. Он может принимать одну из трех значений:
1. mbLeft – нажата левая кнопка мыши;
94

Основы программирования в Delphi
ss Shift
нажата клавиша Shift
ssAlt
нажата клавиша Alt
ssCtrl
нажата клавиша Ctrl
ssLeft
нажата левая кнопка мыши
ssRight
нажата правая кнопка мыши
ssDouble
выполнен двойной щелчок
2. mbRight – нажата правая кнопка мыши;
3. mbMiddle – нажата средняя кнопка мыши.
Параметр Shift определяет, какие управляющие клавиши в этот момент
были нажаты. Так как одновременно может быть нажато несколько управляющих клавиш, поэтому этот параметр может принять следующие значения:
Примечание. При обработке щелчка мыши правильнее анализировать
событие OnMouseUp, а не OnMouseDown событие. При отпускании кнопки
соответствующее событие генерируется всегда один раз, а при нажатии
кнопки Windows генерирует сообщение о нажатии непрерывно, что приводит
к многократному вызову обработчика события OnMouseDown.
В системе Delphi имеется еще одно полезное событие OnMouseMove, вы-
зываемое при перемещении указателя мыши над объектом. Эти события отдельно существуют для многих элементов управления. В заголовке обработчика этого события указываются только координаты текущей позиции указателя и
состояние кнопок мыши. Обработчики этих событий отличаются также только
названиями, список их параметров полностью совпадают. Например, для командной кнопки с именем Button1 заголовок обработчика события OnMouse-
Move имеет вид:
procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X, Y:
Integer);
Пример. Вывод текущей координаты мыши на заголовке формы
procedure TForm1.FormMouseMove (Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
Form1.Caption:='Координаты мыши: Х= ' + IntToStr(X) +' Y= ' + IntToStr(Y);
end;
Заметим, что событие OnMouseMove происходит с некоторой дискретно-
стью во времени. Поэтому изменение координаты мыши на 1 пиксель еще не
95

Основы программирования в Delphi
Файл
Сложить
Выход
инициирует это событие. При быстром движении мыши, между двумя событи-
ями OnMouseMove мышь успевает перейти на большие расстояния.
Компонент Контекстное меню (PopupMenu)
Контекстное меню вызывается при нажатии правой кнопки мыши. Пункты
контекстного меню зависят от того, на что указывает указатель мыши. Поэтому
в контекстное меню включают такие команды, которые могут выполняться с
выбранным объектом. Главное отличие контекстного меню от главного меню
состоит в том, что в контекстном меню не может быть нескольких разделов
верхнего уровня.
Чтобы добавить к разрабатываемой программе контекстное меню, надо
выбрать компонент TPopupMenu из панели компонентов Стандартные и
поместить его на форме в произвольном месте. При этом, система Delphi присвоит свойству Name этого компонента значение PopupMenu1. Заметим, что
одна форма может содержать несколько контекстных меню, которые отличают-
ся друг от друга именами.
Пункты контекстного меню определяются также как и в случае главного
меню, с помощью редактора меню. Редактор меню появляется при двойном
щелчке на объекте TPopupMenu.
Пример. Для программы сложения двух чисел создайте контекстное меню следующего вида:
Измените свойства Name этих пунктов меню, соответственно на mnuFile,
mnuAdd и mnuExit. Теперь разработаем обработчик событий пунктов меню. При
двойном щелчке на пункте меню появится заготовка процедуры обработки со-
бытия. Ниже приведем коды процедур для пунктов Выход и Сложить:
procedure TForm1.mnuExitClick (Sender: T Obect);
begin
if Close Query then Close;
end;
procedure TForm1.mnuAddClick (Sender: T Obect);
begin
cmdAddClick (Sender)
end;
96

Основы программирования в Delphi
Как видно, в обработчике пункта Add контекстного меню вызывается обработчик события щелчок на кнопке Сложить (обработчик cmdAddClick ( )).
Такой повторный вызов обработчиков называется вложенным вызывом обра-
ботчиков.
Теперь осталось вызывать созданное меню из программы. Для этого надо
обработать щелчок правой кнопки мыши на форме. Заготовка процедуры обра-
ботки этого события появится при двойном щелчке на строке OnMouseUp Инспектора объектов (вкладка События), когда выделена форма. Система Delphi
сгенерирует следующий код:
procedure TfrmCalc.FormMouseUp (Sender: TObect; Button:
TMouseButton; Shift: TShiftState; X,Y:Integer);
begin
…
end;
В теле данной процедуры, если нажата правая кнопка мыши, необходимо
активизировать контекстное меню с именем PopupMenu1. Это осуществляется с
помощью метода Popup( ) с двумя параметрами - координаты верхнего угла
меню. Только оказываются эти координаты в экранной системы отчета, а не в
границах к области программы.
Координаты X и Y (параметры обработчика MouseUp) являются координа-
тами мыши относительно клиентской области формы. Чтобы указать коррект-
ное значение координат, надо добавить к координатам X и Y смещение, определяющее начало клиентской области формы формы.
К сожалению, свойства формы Left и Top определяют координаты левого
верхнего угла формы. Эти координаты не учитывают высоты строки заголовка
и панели командных кнопок. Поэтому приходится использовать функцию
GetClientOrigin, которая возвращает координаты клиентской области. Возвращаемое значение имеет тип TPoint , представляющий собой запись из двух элементов Х и Y. С учетом сказанного, обработчик события нажатие правой кнопки
мыши имеет вид:
procedure TfrmCalc.FormMouseUp (Sender: TObject; Button: TMouseButton;
Shift: TShiftState; x,y; Integer);
var P: TPoint;
begin
if Button = mbRight then
begin
97

Основы программирования в Delphi
P: = GetClientOrigin
PopupMenu1. Popup (x+P.X, y+P.Y);
end;
end;
Теперь скомпилируйте программу и запустите. Как видно, контекстное
меню появится на той точке формы, где был выполнен щелчок правой кнопки
мыши и функционирует так, как было спланировано.
Механизм перетаскивания (Drag and Drop)
Как известно, в Windows программах механизм перетаскивания с мышью
применяется часто. Суть перетаскивания с мышью заключается в том, что для
перетаскивания объекта на форме, следует подвести курсор мыши к этому объекту, нажать левую кнопку мыши и перетаскивать курсор мыши на новое ме-
сто. После отпускания кнопки мыши объект переходит на новое место.
Для запуска процесса перемещения объекта должен быть вызван метод
BeginDrag(). Обычно этот метод вызывается обработчиком события On-
MouseDown, для того объекта, для которого реализуется механизм перетаски-
вания.
Далее должны быть реализованы обработчики событий для элемента
управления, для которого разрешено оставление перетаскиваемого объекта.:
1. OnDragOver – перетаскиваемый объект находится над элементом
управления;
2. OnDragDrop – выполнен сброс объекта: отпущена кнопка мыши. Ком-
понент может принять сбрасываемый на него объект, только если в обработчи-
ке события OnDragDrop установлен параметр Accept на значение True.
Рассмотрим работу данного механизма на двух примерах: перетаскивание
текста из текстового поля и перемещение кнопки по форме.
Пример. Перетаскивание текста из текстового поля Edit1. Для этого
создайте и разместите на форме три компонента: текстовое поле, панель
(элемент типа TPanel на панели инструментов Стандартные), кнопку (рис.
11.11).
Последовательность действий для реализации механизма перетаскивания
следующий:
1. Для объекта Edit1 создайте обработчик события OnMouseDown. В нем про-
веряется, нажата ли именно левая кнопка. Если нажата левая кнопка, то вызы-
вается метод BeginDrag с параметром False. Это означает, что процесс пере-
98

Основы программирования в Delphi
таскивания не начнется, пока пользователь не переместит мышь на некоторое
расстояние. Это позволяет не путать простые щелчки на объекте с началом
процесса перетаскивания.
Рис. 11.11 Механизм перетаскивания
procedure TForm1.Edit1MouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShift State; X, Y: Integer);
begin
if Button = mbLeft then
Edit1. BeginDrag (false);
end;
2. Для объекта Panel1 создается обработчик события OnDragOver путем
двойного щелчка на соответствующей строке окна Инспектора объектов
(вкладка События). В нем проверяется, является ли перетаскиваемый объект
полем ввода Edit1. Результат проверки заносится в параметр Accept.
procedure TForm1. Panel1DragOver (Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept := (Source = Edit1)
end;
3. Панель должна обрабатывать еще одно событие OnDragDrop, генери-
руемое когда происходит «сброс» перетаскиваемого объекта. В нем произво-
99

Основы программирования в Delphi
дится итоговое действие: в заголовок панели записывается текст, находящийся
в текстовом поле.
procedure TForm1. Panel1DragDrop (Sender, Source: TObject; X, Y: Integer);
begin
Panel1. Caption: = Edit1. Text;
end;
Теперь можно запустить программу, навести указатель мыши на текстовое
поле, нажать левую кнопку мыши и, не отпуская ее, переместить мышь по
направлению к панели. Курсор мыши при этом примет вид перечеркнутого
кружка, означающего, что в данном месте «сброс» перетаскиваемого объекта
недопустим. Когда указатель окажется в области панели, он примет вид небольшой стрелки с квадратом. Теперь кнопку мыши можно отпустить, и
надпись на панели сразу изменится на Edit1.
Пример. Перемещение кнопки по форме
Для того, чтобы с помощью мыши можно было перемещать компонент,
значение свойства DragMode должно быть равно dmAutomatic. В противном
случае Перемещение объектов мышью может быть выполнено только в том
случае, если значение свойства DragKind равно dkDrag.
1. Для объекта Button1 создается обработчик нажатия кнопки мыши, в ко-
тором начинается процесс перетаскивания кнопки.
procedure TForm1. Button1MouseDown (Sender: TObject; Button: TMouseButton;
Shift: TShift State; X, Y: Integer);
begin
if Button = mbLeft then
Button1. BeginDrag (false);
end;
2. Правом «принимать» кнопку должна обладать сама форма. Для этого
она должна обрабатывать событие OnDragOver, чтобы разрешить прием кнопок.
procedure TForm1. FormDragOver (Sender, Source: TObject; X, Y: Integer;
State: TDragState; var Accept: Boolean);
begin
Accept: = (Source is TButton)
end;
100
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
