Лабы IT / ЛабаDelphi3
.docЛабораторная работа №3. Работа в DELPHI
Перемещение мышью панели, работа с таймером.
Во многих оконных Windows – приложениях очень часто требуется перемещать мышкой панель с расположенными на ней кнопками, пиктограммами и т.д. При этом часто этих панелей бывает несколько. Поэтому разберемся, каким образом происходит такое перемещение. В данном случае программный код и основные действия будут аналогичны программированию рисования мышкой на форме.
Задание 1 Реализуем технологию Drag and Drop для перемещения мышкой панели.
Создайте новый проект. Поместите на форму компонент Panel1 из палитры Standard.
Задача разбивается на 3 этапа: щелкаем мышью на панели,
не отпуская кнопки мыши двигаем панель,
отпускаем мышь.
Объявите глобальными переменные Xset, Yset:integer; Drug:Boolean;
Присвойте начальное значение Drug:=False; в обработчике события onCreate формы.
Этап первый - щелкаем мышью на панели (на рис.1 место щелчка отмечено точкой). Зайдите в обработчик события onMouseDown компонента Panel1. Допишите туда текст который должен выглядеть так:
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Drug:=true;
Xset:=X;
Yset:=Y;
SetCapture(Form1.Handle);
end;
В данном случае переменным Xset и Yset присваиваем координаты указателя мыши относительно компонента Panel1.
Обратите внимание, что в данном обработчике
procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
уже имеются координаты указателя мыши относительно компонента Panel1 обозначенные просто как X, Y: Integer вот эти значения мы и присваиваем глобальным переменным Xset и Yset.
Оператор SetCapture(Form1.Handle) устанавливает перехват всех событий, сообщений и перенаправляет их от всех компонентов к форме Form1, чтобы только форма реагировала на эти события, поэтому уже движение мыши (хоть указатель мыши и находится на Panel1) будет относиться уже не Panel1, а к форме и все события будут обрабатываться именно формой, а не любым другим компонентом.
Этап второй - не отпуская кнопки мыши двигаем панель,
Но теперь мы должны знать координаты указателя мыши относительно формы, и панель также мы двигаем по форме, поэтому мы должны перейти в обработчик события onMouseMove движения мыши для формы Form1
Напишите в этом обработчике:
If Drug=true then begin // проверка на нажатость кнопки мыши для движения
Panel1.left:=X-Xset;
Panel1.top:=Y-Yset;
end;
В данном обработчике X и Y это координаты указателя мыши уже относительно Form1, так как форма перехватывает все события. Таким образом, мы легко вычисляем координаты Panel1 относительно формы Panel1.left и Panel1.top.
Этап третий – отпускаем кнопку мыши.
Зайдите в обработчик события onMouseUp формы, напишите там следующее:
Drug:=False;
ReleaseCapture;
Здесь оператор ReleaseCapture возвращает нормальный режим обработки событий.
Запустите программу. Убедитесь в правильности её работы. Перейдите назад в режим программирования.
В этом же проекте скиньте на форму кнопку SpeedButton1 из палитры Additional.
Напишите в обработчике щелчка:
SpeedButton1.Parent:=Panel1;
SpeedButton1.Left:=0;
SpeedButton1.top:=0;
В данном случае выражение SpeedButton1.Parent:=Panel1; определяет родительский компонент Panel1 который содержит в себе данную кнопку SpeedButton1, а затем устанавливаем координаты данной кнопки относительно Panel1.
Запустите программу. Убедитесь в правильности её работы. Перейдите в режим программирования.
Задание 2.1 Бильярд. Запрограммируем движение компонента Shape1 по форме так, чтобы он отталкивался от её краёв как бильярдный шарик.
Создайте новый проект. Добавьте компоненты Shape1 и timer1 на форму.
Измените значение свойства Shape компонента Shape1 на stCircle (рис. 2 )
Рис. 2 Приложение «Бильярд»
Определите глобальные переменные dX, dY:integer; Проинициализируете их начальными значениями в обработчике формы onCreate написав там: dX:=1; dY:=1;
Измените значение свойства interval компонента timer1 на 100.
Зайдите в обработчик таймера и напишите там код определяющий движение
по оси X:
Shape1.Left:=Shape1.Left+dx;
if (Form1.ClientWidth-Shape1.Left<=Shape1.Width)
or (Shape1.Left<=0) then dx:=-dx;
Выражение Shape1.Left:=Shape1.Left+dx; определяет изменение координаты по оси X компонента Shape1.
Form1.ClientWidth – ширина всей формы
Shape1.Left – координата X компонента Shape1 относительно формы, отсчитывается верхнего левого угла Shape1.
Shape1.Width – ширина Shape1.
Очевидно, что когда одно из условий отталкивания Shape1 от правого края (Form1.ClientWidth-Shape1.Left<=Shape1.Width) или левого края (Shape1.Left<=0) формы будут равны True, то следует просто сменить знак приращения dx (то есть умножить на
-1), чтобы значение Shape1.Left либо увеличивать, либо уменьшать.
Запустите программу. Убедитесь в правильности её работы. Вернитесь в режим программирования.
Задание 2.2 Зайдите снова в обработчик таймера и самостоятельно добавьте движение по оси Y.
Учитываете следующее:
Form1.ClientHeight – высота всей формы
Shape1.Top– координата Y компонента Shape1 относительно формы, отсчитывается верхнего левого угла Shape1
Shape1.Height – высота Shape1
Запустите программу. Убедитесь в правильности её работы. Вернитесь в режим программирования.
Задание 3. Ради интереса изменим надпись на кнопке «Пуск» основного меню Windows.
Сбросьте на форму Edit1 и Button1. Установите значения соответствующих свойств Text и Caption (рис. 3).
Рис. 3 Приложение, изменяющее надпись на стандартной
кнопке «Пуск» меню Windows
Обработчик щелчка на Button1 должен быть следующим:
procedure TForm1.Button1Click(Sender: TObject);
var
h, h1: hwnd; name:string;
begin
name:=edit1.Text;
h := findwindow('Shell_TrayWnd', nil);
h1 := findwindowex(h, 0, 'Button', nil);
setwindowtext(h1, PANSICHAR(name));
end;
Запустите программу. Напишите слово в поле Edit, нажмите вашу кнопку Button1, а затем подведите курсор мыши к кнопке ПУСК.
Перейдите назад в режим программирования.
автор и разработчик лабораторных
работ по Delphi
доцент кафедры Информационных технологий и систем
кандидат физ.-мат. наук
Санников Е.В.