Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа5.doc
Скачиваний:
9
Добавлен:
06.11.2018
Размер:
329.73 Кб
Скачать
    1. Способы перемещения

Популярная технология перетаскивания (drag and drop- тащи и бросай) позволяет зацепить мышью визуальный объект на экране и перетащить его в другое место. Таким образом, вы перетаскиваете окно формы, зацепив его за заголовок, перемещаем файлы из одной папки в другую, собираем лото или другие фигуры.

Для этого в Delphi имеются стандартные средства для осуществления технологии перетаскивания, связанные

  1. с событиями OnMouseDown, OnMouseUp, OnMouseMove,

  2. с событиями OnDragDrop, OnDragOver, OnStartDrag, OnEndDrag, (Drag&Drop – перетащи и бросай)

  3. с событиями OnDockDrop, OnDockOver OnStartDock, OnEndDock (Drag&Dock-перетащи и причаль).

Рассмотрим реализацию первого способа на примере «фоторобота». Задача состоит в том, чтобы собрать части лица в одно целое. Для этого на форме нарисуем части лица, используя компоненты класса TShape и меняя их свойство Shape (stCircle, stRectangle).

Базовый прямоугольник, ограничивающий первую фигуру Shape1, задается координатами левого верхнего угла (Left,Top) и геометрическими размерами ширины Width и высоты Height. Начало системы координат самого Shape так же как и формы организуется по принципу: начало координат в левом верхнем углу, ось Х направлена слева направо, а ось Y – сверху вниз.

Запишем обработчики событий OnMouseDown, OnMouseUp, OnMouseMove для одной фигуры Shape1:

Var X0, Y0:integer;

Drag:Boolean=false;

...

Procedure TForm1.Shape1MouseDown(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y:Integer);

Begin

//запомним первоначальные координаты курсора мыши

X0:=X; Y0:=Y;

Drag:=true; //начинаем перетаскивать

End;

Procedure TForm1.Shape1MouseUp(Sender: TObject;

Button: TMouseButton; Shift: TShiftState; X, Y:Integer);

Begin

Drag:=false; //закончили перетаскивать

End;

Procedure TForm1.Shape1MouseMove(Sender: TObject;

Shift: TShiftState; X, Y:Integer);

Begin

If drag then

With Shape1 do

Begin

Left:=left+X-X0;

Top := Top+Y-Y0;

End;

End;

Здесь в параметрах процедур X,Y – координаты текущего положения мыши. Параметр Shift служит для контроля нажатия управляющих клавиш Ctrl, Alt, Shift на клавиатуре, а также правой, левой или средней клавиши мыши.

Но эти процедуры будут работать только для одной фигуры. Чтобы применить эти же события на все оставшиеся фигуры робота можно переписать коды обработчиков для каждого Shape’a. Итак, если фигур 6 и обработчиков для каждой фигуры 3, то получим 6*3=18 обработчиков!

Чтобы применить один обработчик на все фигуры нужно в окне Инспектора объектов переключиться на вкладку Events (события) и для остальных фигур выбрать из списка напротив события, например, OnMouseDown обработчик Shape1MouseDown, для OnMouseUp - Shape1MouseUp, для OnMouseMove- Shape1MouseMove. Это называется делегированием.

Но это еще не все. Нужно в коде программы Shape1MouseMove обобщить посылаемый на обработку объект Sender на все объекты класса TShape. Для этого вместо строки

With Shape1 do

запишем

With (Sender as TShape) do

или

With TShape(Sender) do

Тогда наша программа будет работать и для других Shape’ов.

С помощью этого метода можно рисовать мышью на форме.

Рассмотрим реализацию второго способа на этом же примере. В свойстве DragMode (режим перетаскивания) для фигур установим dmAutomatic (автоматический). Это снимает фигуру с якоря во время исполнения программы и позволяет ей свободно перемещаться по форме.

Для этого приема нам понадобиться события OnDragOver и OnDragDrop для Form1. Первый обработчик реагирует на событие, когда над объектом формы обнаруживается перетаскиваемый объект. Тогда мы его «принимаем» на новое место жительства:

procedure TForm1.Form1DragOver(Sender, Source: TObject;

X, Y: Integer;State: TDragState; var Accept: Boolean);

begin

Accept:= true;

end;

Второй обработчик выполняет необходимые действия по перемещению при завершении перетаскивания:

procedure TForm1.Form1DragDrop(Sender, Source: TObject;

X, Y: Integer);

begin

With Source as TShape do

Begin

Parent:=Pointer(Sender);

Left:=X;

Top:=Y;

End;

End;

Здесь Sender- компонент, на который опускается объект Source, Parent- указатель на родительский объект. Параметр Shift может принимать следующие значения:

  • ssShift – нажата клавиша Shift

  • ssAlt – нажата клавиша Alt

  • ssCtrl – нажата клавиша Ctrl

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

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

  • ssDouble – выполнен двойной щелчок левой кнопкой мыши

Рассмотрим реализацию третьего способа на этом же примере. В свойстве DragMode (режим перетаскивания) для фигур установим dmAutomatic (автоматический). Для формы и фигур в свойстве DragKind установим тип использования мыши при перетаскивании dkDock (в предыдущем примере оно было по умолчанию установлено в dkDrag). Для приемника, т.е. для формы, установим свойство DockSite в True. Применим обработчик события OnEndDock

procedure TForm1.Shape1EndDock(Sender, Target: TObject; X, Y: Integer);

begin

with sender as TShape do begin

parent:=pointer(Target);

left:=X;

Top:=y;

end;

end;

Здесь Target – приемник, т.е. форма. Зададим этот обработчик на все остальные фигуры и запустим программу на выполнение.