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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перемещение нарисованного обьекта 
:(
    Опции темы
MrDmitry
Дата 20.9.2015, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 556
Регистрация: 10.11.2006

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



Рисую на TImage эллипс, нужно при помощи мыши, перемещать его по Timage. У меня эллипс перемещается но оставляет за собой "След". Как от этого следа избавиться? Вот пример кода. 

PS Перерисовка всего image не подойдет т.к эллипсов будет несколько.
Код

var
MLeft:true;
X0,Y0:integer;

procedure TForm1.FormShow(Sender: TObject);
begin
Image1.Canvas.Ellipse(50, 50, 75, 75);
end;


function TForm1.GetPostion(X, Y: Integer): Boolean;
begin
  if (X > 50) and (X < 75) and
   (Y > 50) and (Y < 75) then
    result:=true
 else
  result:=false;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if (Button=mbLeft) and (GetPostion(X, Y)=true) then
  MLeft:=true;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
//Меняем стиль курсора
if GetPostion(X, Y)=true then
 image1.Cursor:=crHandPoint
else
 image1.Cursor:=crDefault;
//Перемещаем эллипс
if MLeft=true then
  DrawImage(X,Y,X0,Y0);
 X0:=X;
 Y0:=y;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if MLeft=true then
MLeft:=false;
end;

//Перерисовываем Image
Procedure TForm1.DrawImage(X,Y,X0,Y0:integer);
begin
 //Стираем
 image1.Canvas.Pen.Style:=psClear;
 image1.Canvas.Ellipse(X0,Y0,X0+25,Y0+25);
 //Рисуем
 image1.Canvas.Pen.Style:=psSolid;
 image1.Canvas.Ellipse(x, y, x + 25, y + 25);
end;


Это сообщение отредактировал(а) MrDmitry - 20.9.2015, 12:46
PM MAIL   Вверх
Poseidon
Дата 21.9.2015, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



MrDmitry, у тебя не верно определяются координаты X1 и Y1 (левый верхний угол элипса) в Image1MouseMove (там они у тебя обозначены как X0 и Y0). Т.е. получается, что пользователь жмет в ценр элипса что бы его перетянуть, а процедура определяет координаты мыши в этот момент как левый верхний угол элипса. Получается что "стирающий" элипс в DrawImage получает координаты мыши как левый верхний угол, а на самом деле это может быть центром элипса. Таким образом "стирающий" элипс смещен вправо и вниз по отношению к стираемому, соответственно стирается не все, вот и след. 

Тебе надо в процедуре Image1MouseMove передавать в X0 и Y0 не координаты мыши, а высчитывать левый верхний угол элипса, над которым находится мышь.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Агрох
Дата 21.9.2015, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Используй не тип линии, а цвет. Т.е. вместо
Код

image1.Canvas.Pen.Style := psClear;
image1.Canvas.Pen.Style := psSolid;

пиши
Код

image1.Canvas.Pen.Color := clWhite;
image1.Canvas.Pen.Color := clBlack;

--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
Poseidon
Дата 22.9.2015, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


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

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



Агрох, это не поможет.


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Агрох
Дата 22.9.2015, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 176
Регистрация: 6.4.2013
Где: Москва

Репутация: 1
Всего: 6



Цитата(Poseidon @  22.9.2015,  09:59 Найти цитируемый пост)
Агрох, это не поможет.


Поможет. Скопировал его код, заменил только начальное значение MLeft на false, сделал изменение цвета пера вместо его типа и всё работает. Из того, о чём ты говорил, остаётся только одна чёрточка из за неправильного определения координат в начале движения после захвата. Но шлейф от движения пропадает.
--------------------
Putin here, Putin there, Putin almost everywhere!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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