Часто возникает задача перемещения некоторого объекта (одного
или нескольких) по форме. Технология перетаскивания (drag and drop
– перетащи и оставь) позволяет зацепить мышью визуальный объект
на экране и перетащить его в другое место. Решить задачу перемеще-
ния можно несколькими способами. Способ первый. Его суть заключается в том, что свойства Left и
Top объекта изменяются на разницу между начальными и конечными
координатами (нажатия и отпускания мыши соответственно, рис. 1.3).
Этот способ самый простой и надежный, но у него есть один недоста-
ток: Left и Top изменяются по очереди, что приводит к заметному
мерцанию.
Рис. 1.3. Положение курсора мыши в координатной системе объекта Начнем создавать приложение, в котором будем перемещать два
объекта Image по форме.
Разместим на форме два компонента Image и вставим в них разные
картинки (рис. 1.4). Для адекватного отображения картинок свойство
Proportional компонентов Image установим в значение true.
Рис. 1.4. Два компонента Image размещены на форме
Для начала необходимо объявить глобальные переменные (они
объявляются в разделе Implementation) x0, y0: integer - они будут
запоминать координаты начального положения перемещаемой картин-
ки. И еще нам понадобится переменная drag типа boolean, чтобы нам
отличать перемещение мыши над картинкой, от попытки ее сдвинуть:
implementation {$R *.dfm}
var
x0, y0: integer; //начальные координаты картинки
drag: boolean = false;//определяет режим буксировки
//она будет устанавливаться в True
//вначале и в False в конце
Далее необходимо определиться с тем, каким образом пользова-
тель будет перемещать объект по форме. Предположим, что рисунки
должны перемещаться по форме, если нажата левая кнопка мышки.
О том, что на Image щелкнули мышью, можно узнать, например,
обрабатывая событие OnMouseDown, возникающее при опускании вниз
кнопки мыши. Для этого в инспекторе объектов компоненты Image1
откроем вкладку Events и два раза щелкаем мышью в пустом поле On-
MouseDown. Появится шаблон процедуры:
Рассмотрим входные параметры этой процедуры. Объект, на кото-
ром была нажата клавиша мыши, представлен параметром Sender. Это
имя предлагает Delphi, сгенерировав заготовку процедуры. Sender1 –
объект, пославший системе сообщение, что на нем щелкнули мышью
(в нашем случае Image1). Параметры Shift и Button служат соответ-
ственно для контроля нажатия управляющих клавиш клавиатуры Ctrl,
Alt, Shift, и левой, правой, средней (колесика) клавиш мыши. Список
входных параметров процедуры завершают координаты X и Y курсора
мыши внутри компоненты Sender. На рис. 1.3 показано положение
курсора мыши в координатной системе фигуры.
В появившемся обработчике необходимо разрешить перемещение,
если была нажата левая кнопка мыши, а также запомнить первона-
чальные координаты курсора мыши:
if Button=mbLeft
then begin //если нажата левая кнопка мыши
x0:=x; //запоминаем первоначальные
y0:=y; //координаты курсора
drag:=true; //перемещение началось
//методом BringToFront выдвигаем компонент
//в котором произошло событие не передний план
(Sender as TImage).BringToFront;
end
else //если нажата не левая кнопка мыши
drag:=false; //нет перемещения
В обработчике проверяется, нажата ли именно левая кнопка мыши,
затем запоминаются координаты мыши именно в этот момент. Задает-
ся режим буксировки – переменная drag:=true. Инструкция (Sender
as TImage).BringToFront выдвигает методом BringToFront компо-
нент, в котором произошло событие, на передний план. Это позволит
ему в дальнейшем перемещаться поверх других аналогичных компо-
нентов.
Используемый здесь знак операции Sender as TImage называется
приведением объекта Sender к типу TImage. Ее можно записать по-
другому: TImage(Sender). Если в этом обработчике использовать вме-
сто Sender вполне конкретный компонент Image1 (поскольку созда-
ваемая процедура обрабатывает нажатие мыши на Image1), то ее нель-
зя будет использовать для обработки нажатия клавиши мыши, когда
курсор расположен над Image2. Но при нажатии мыши на обоих ком-
понентах (Image1 и Image2) должно произойти одно и то же, поэтому
используем обобщенный описатель Sender, представляющий объект,
на котором щелкнули мышью.
После создания процедуры TForm1.Image1MouseDown необходимо
настроить на нее обработчик нажатия клавиши мыши для компонента
Image2. Для этого в инспекторе объектов компоненты Image2 откроем
вкладку Events и из раскрывающегося списка напротив события On-
MouseDown выбираем созданный обработчик Image1MouseDown.
Во время перетаскивания компонента над формой (или над другим
компонентом), а также при отпускании кнопки, у формы (или другого
компонента) возникает событие: OnDragOver, в котором мы должны
указать форме (или другому компоненту), принимать ли нет компо-
нент, находящийся над ней (в нашем случае Image).
Создадим для формы обработчик событий OnDragOver и в нем
разрешим принимать только компонент Image, написав такую строку:
//разрешаем принимать только компонент Image
Accept:=Source is TImage;
При буксировке объекта удобно наблюдать его перемещение вслед
за курсором мыши. Для реализации изменения положения компонента
Image1 при каждом изменении положения курсора воспользуемся
обработчиком события перемещения мыши onMouseMove.
В инспекторе объектов компоненты Image1 откроем вкладку
Events и два раза щелкаем мышью в пустом поле onMouseMove. Поя-
вившийся шаблон процедуры заполним следующим образом:
procedure TForm1.Image1MouseMove(Sender: TObject; Shift:
TShiftState; X, Y: Integer);
begin
if drag
then
with TImage(Sender) do
begin
Left:=Left+x-x0;
Top:=Top+y-y0
end
end;
Вместо двух инструкций Left:=Left+x-x0; Top:=Top+y-y0
можно было обойтись одно командой: SetBounds(Left + X - X0,
Top + Y - Y0, Width, Height). Метод SetBounds изменяет коорди-
наты левого верхнего угла на величину сдвига курсора мыши (X - X0
для координаты X и Y - Y0 для координаты Y). Тем самым поддержи-
вается постоянное расположение точки курсора в системе координат
компонента, т.е. компонент перемещается вслед за курсором. Ширина
Width и высота Height компонента остаются неизменными.
После создания процедуры TForm1.Image1MouseMove необходимо
настроить на нее обработчик перемещения мыши над компонентом
Image2. Для этого в инспекторе объектов компоненты Image2 откроем
вкладку Events и из раскрывающегося списка напротив события On-
MouseMove выбираем созданный обработчик Image1MouseMove.
По окончании буксировки, когда пользователь отпустит кнопку
мыши, наступит событие, обработчик которого onMouseUp должен со-
держать всего один оператор:
Этот оператор указывает приложению на конец буксировки. Тогда
при последующих событиях onMouseMove их обработчик перестанет
изменять координаты компонента.
После создания процедуры TForm1.Image1MouseUp необходимо
настроить на нее обработчик отцепления мыши над компонентом Image2.
Опубликовал Kest
December 08 2009 14:10:47 ·
4 Комментариев ·
18660 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Андрей August 25 2010 08:45:43
Спасибо) Очень помагли.Автору респект:)
Алексей January 03 2011 20:19:45
спасибо автор) наконец то доступно объяснили
GAFU December 08 2011 20:18:01
DA AVTOR MOLODES!!!!!!!!!!
Archer White February 18 2012 18:26:26
Спасибо, мощно помогло!!!
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.