Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение Image 
:(
    Опции темы
Poseidon
Дата 18.5.2005, 03:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: нет
Всего: 133



Многие, наверно, сталкивались с проблемой перемещения Image'a по форме. Решить ее можно тремя способами (может есть и больше, но я знаю только три). Способ первый. Его суть заключается в том, что свойства Left и Top картинки изменяются на разницу между начальными и конечными координатами (нажатия и отпускания мыши соответственно). Этот способ самый простой и надежный, но у него есть один недостаток: left и top изменяются по очереди, что приводит к заметному мерцанию картинки. Тем не менее мы этот способ рассмотрим. Не забудьте положить на форму Image и вставить в нее какую-нибудь картинку. Для начала необходимо объявить глобальные переменные (они объявляются в разделе Implementation) x0, y0:integer - они будут запоминать начальные координаты. И еще нам понадобится переменная move типа boolean, чтобы нам отличать перемещение мыши над картинкой, от попытки ее сдвинуть. Эти объявления делаются примерно так: 

Код
implementation 
{$R *.DFM} 

var 
  x0, y0: integer; 
  move: boolean; 

Теперь напишем обработчик OnMouseDown для нашей картинки: 

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer); 
begin 
  if button <> mbLeft then 
    move:=false //если нажали не левой кнопкой, то перемещать не будем! 
  else 
  begin 
    move:=true; 
    x0:=x; //запоминаем начальные координаты 
    y0:=y; //запоминаем начальные координаты 
  end; 
end; 


В этом участке кода проверяется какой кнопкой нажали на картинку. Если левой, то запоминаем координаты, а если любой другой, то перемещать нельзя. Теперь напишем обработчик OnMouseMove для нашей картинки: 

Код
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, 
Y: Integer); 
begin 
  if move then 
  begin 
    image1.Left:=image1.Left+x-x0; // Изменяем позицию левого края 
    image1.Top:=image1.Top+y-y0; // Изменяем позицию верхнего края 
  end; 
end; 


Ну и наконец обработчик OnMouseUp для нашей картинки будет таким: 

Код
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer); 
begin 
  move := false; 
end; 


Здесь все очень просто. Когда кнопка отпускается, то переменной move присваивается значение false, чтобы до следующего клика по картинке ее нельзя было сдвинуть. Этот способ довольно прост, как для понимания, так и для реализации. Но такой же алгоритм перемещения можно реализовать немного красивее. У некоторых компонентов, в том числе и Image, есть такая классная процедура SetBounds(Left,Top,Width,Height), которая может изменять сразу все четыре параметра. Таким образом событие OnMouseMove можно изменить так: 

Код
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, 
Y: Integer); 
begin 
  if move then 
    image1.SetBounds(image1.Left+x-x0, image1.Top+y-y0, 
    image1.width, image1.height); 
end; 


Но есть еще один очень интересный выход: по экрану можно перемещать не саму картинку, а только ее рамку, когда пользователь выберет место для картинки и отпустит кнопку - она туда переместиться. Для этого нам понадобится еще одна глобальная переменная: rec: TRect, которая будет хранить параметры картинки. Теперь слегка изменим обработчики событий для картинки. Таким образом все в целом будет выглядеть так: 

Код
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer); 
begin 
  if button<>mbLeft then 
    move:=false 
  else 
  begin 
    move:=true; 
    x0:=x; 
    y0:=y; 
    rec:=image1.BoundsRect; //запоминаем контур картинки 
  end; 
end; 

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, 
Y: Integer); 
begin 
  if move then 
  begin 
    Form1.Canvas.DrawFocusRect(rec); //рисуем рамку 
    with rec do 
    begin 
      left:=Left+x-x0; 
      top:=Top+y-y0; 
      right:=right+x-x0; 
      bottom:=bottom+y-y0; 
      x0:=x; 
      y0:=y; // изменяем координаты 
    end; 
    Form1.Canvas.DrawFocusRect(rec); // рисуем рамку на новом месте 
  end; 
end; 

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer); 
begin 
  Form1.Canvas.DrawFocusRect(rec); 
  with image1 do begin 
    setbounds(rec.left+x-x0,rec.top+y-y0,width,height); //перемещаем картинку 
    move:=false; 
  end; 
end; 


Поскольку DrawFocusRect рисует рамку методом Xor, то при повторном вызове этой функции с теми же параметрами, рамка стирается. Этот очень красивый метод добавит в ваши программы много интересного. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.