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

Лабы IT / ЛабаDelphi3

.doc
Скачиваний:
64
Добавлен:
06.02.2015
Размер:
85.5 Кб
Скачать

Лабораторная работа №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, а к форме и все события будут обрабатываться именно формой, а не любым другим компонентом.

Frame1

Этап второй - не отпуская кнопки мыши двигаем панель,

Но теперь мы должны знать координаты указателя мыши относительно формы, и панель также мы двигаем по форме, поэтому мы должны перейти в обработчик события 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

доцент кафедры Информационных технологий и систем

кандидат физ.-мат. наук

Санников Е.В.

Соседние файлы в папке Лабы IT