Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Золотые обручальные кольца
Сейчас на сайте
Гостей: 18
На сайте нет зарегистрированных пользователей

Пользователей: 13,372
новичок: vausoz
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Диплом RSA, ЭЦП, сертификаты, шифрование на C#
Программа тестирования и обучающая программа по математике на Turbo Pasc...
Обучающая и тестирующая программа по здаче экзамена ПДД на Turbo Pascal ...

ПЕРЕТАСКИВАНИЕ КОМПОНЕНТОВ В ОКНЕ ПРИЛОЖЕНИЯ
Часто возникает задача перемещения некоторого объекта (одного
или нескольких) по форме. Технология перетаскивания (drag and drop
– перетащи и оставь) позволяет зацепить мышью визуальный объект
на экране и перетащить его в другое место. Решить задачу перемеще-
ния можно несколькими способами.
Способ первый. Его суть заключается в том, что свойства Left и
Top объекта изменяются на разницу между начальными и конечными
координатами (нажатия и отпускания мыши соответственно, рис. 1.3).
Этот способ самый простой и надежный, но у него есть один недоста-
ток: Left и Top изменяются по очереди, что приводит к заметному
мерцанию.
Положение курсора мыши в координатной системе объекта
Рис. 1.3. Положение курсора мыши в координатной системе объекта
Начнем создавать приложение, в котором будем перемещать два
объекта Image по форме.

Разместим на форме два компонента Image и вставим в них разные
картинки (рис. 1.4). Для адекватного отображения картинок свойство
Proportional компонентов Image установим в значение true.
 Два компонента Image размещены на форме
Рис. 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. Появится шаблон процедуры:
procedure TForm1.Image1MouseDown(Sender: TObject;
Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
end;



Рассмотрим входные параметры этой процедуры. Объект, на кото-
ром была нажата клавиша мыши, представлен параметром 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 должен со-
держать всего один оператор:
procedure TForm1.Image1MouseUp(Sender: TObject; Button:
TMouseButton; Shift: TShiftState; X, Y:
Integer);
begin
drag:=false;
end;



Этот оператор указывает приложению на конец буксировки. Тогда
при последующих событиях 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
спасибо автор) наконец то доступно объяснилиsmileysmileysmiley
GAFU December 08 2011 20:18:01
DA AVTOR smileyMOLODES!!!!!!!!!!
Archer White February 18 2012 18:26:26
Спасибо, мощно помогло!!!
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Binary2XMLDemo (Р...
Microsoft Press -...
PrevInst
Шейдеры в Delphi
Современное проек...
Мод "проверочный ...
Task Shedule
PDF
Файловый менеджер
Правила программи...
CS:Source - монит...
JBlabel3D
База для Allsubmi...
Dbgridpack
Усложнённый кальк...
БД сеть компьютер...
ScrollCredit
Fig [Исходник на ...
Цветной Grid
Редактор текста (...

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14238
Borland Delphi ... 10373
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Возможность исполь...
Объектно-ориентиро...
Конфигурируя бранд...
Защита учетной зап...
Цена халявы, или т...
10.1. Массив точек
Достаточность
Содержание
Компонент метка
Как играть в казин...
Оптимизация форума...
Строковые литералы...
Строки в стиле С++
Учетные записиполь...
TMemoryStream
Игровые автоматы б...
Шаблоны и дружеств...
Реагирование на со...
Рекурсивное постро...
Задачи, решаемые н...
УНАСЛЕДОВАТЬ, ВКЛЮ...
Любителям острых о...
Язык С: перечислим...
Операции над множе...
Например, во время...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?