Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Содержание сайт... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Создание отчето... 65457
Модуль Forms 65217
Пример работы с... 64701
ТЕХНОЛОГИИ ДОСТ... 61904
Имитационное мо... 57784
Реклама
Сейчас на сайте
Гостей: 8
На сайте нет зарегистрированных пользователей

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

Моделирование работы класса персональных компьютеров на GPSS + Отчет + Б...
База данных студентов на Turbo Pascal (Списки) + Пояснительная записка
Моделирование интернет магазина (Apache, Php, Html) на GPSS + Блок схема

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
ПЕРЕТАСКИВАНИЕ КОМПОНЕНТОВ В ОКНЕ ПРИЛОЖЕНИЯ
Часто возникает задача перемещения некоторого объекта (одного
или нескольких) по форме. Технология перетаскивания (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 17:10:47 · 4 Комментариев · 15487 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Андрей August 25 2010 12:45:43
Спасибо) Очень помагли.Автору респект:)
Алексей January 03 2011 23:19:45
спасибо автор) наконец то доступно объяснилиsmileysmileysmiley
GAFU December 09 2011 00:18:01
DA AVTOR smileyMOLODES!!!!!!!!!!
Archer White February 18 2012 22: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...
Шаблон для новост...

Случайные загрузки
Род Стивенс. Delp...
AddPage [Исходник...
С# для профессион...
Дарахвелидзе П., ...
Swat [Исходник на...
Ics
Пример работы с р...
PHP 5
Шифрование по алг...
AntiRus
Globus VCL Extent...
Page Promoter 7.7...
CoolHints2k
ИНТЕРНЕТ ПРОГРАММ...
Пользовательская...
PHP 5 на примерах
Редактор текста (...
ScrollCredit
Трассировка прово...
Обучение Borland ...

Топ загрузок
Приложение Клие... 100470
Delphi 7 Enterp... 87090
Converter AMR<-... 20078
GPSS World Stud... 12851
Borland C++Buil... 11846
Borland Delphi ... 8604
Turbo Pascal fo... 7039
Visual Studio 2... 4999
Калькулятор [Ис... 4803
FreeSMS v1.3.1 3542
Случайные статьи
Свободныеадреса в ...
конфигурации компь...
2. Где применить О...
Статические поля-м...
Контейнеры и насле...
Попрактикуйтесь в ...
Терминалы телефонн...
5.4. Чтение файло...
Фантомные файлы. 2
Потоки ввода-вывода
Сроки службы серти...
Вкладка Configure ...
Используйте (ГАК д...
Параллельная магис...
Технология IEEE 80...
Применение модульн...
DO expected
Бип из системного ...
Примеры локальных ...
Удаленные клиенты ...
Время работы прогр...
Сервер эмуляции ло...
Как "оживить" Perl...
TGT для KDCw2k
Указатель "примеча...
Статистика



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


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