Показать сообщение отдельно
  #9  
Старый 26.12.2008, 14:51
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

DrawShape - это простая твоя процедура рисования линии. И, кстати, в этой процедуре у тебя задается параметр типа TPenMode, и стоит значение pmNotXor что означает: рисуем черную линию, если линия пересекает другую линию или другой графический объект, то цвет ее инвертируется, т.е. становится белый. Значит дополнительный параметр: AColor: TColor, можно не ставить, т.к. цвет автоматически заменится на белый если провести линию в том же месте где раньше находилась. Как ты, наверное уже заметила, в эту функцию параметр цвета я задаю постоянно черный, т.е. его не меняю, потому что он там и не нужем. Мне просто лень стало переделывать DrawShape.
Так вот в обработчике таймера то бишь в Timer1Timer я просто прорисовываю линию сначало где была, т.е. цвет меняется на белый (линия изчезает), а потом прорисовываю линию со смещенными координатами, смотри пояснения в данном коде. Переменная iArr - счетчик шагов, костанта Delta - количество шагов. Алгоритм перемещения таков: расстояние между двумя линиями я делю на Delta отрезков и через iArr я перемещаю линию то отрезкам. Я думаю ты поняла. А вообще лучше очисти свой код от мусора и попробуй изучить его, тогда будет все ясно

Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (not Moving) then exit
else
begin
{Рисую новую линию в "старом месте", т.е. она исчезает}
 DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)),
Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)),
pmNotXor, clBlack);
Inc(iArr);{Увеличиваю количество шагов на 1}
{Рисую новую линию со смещенным шагом}
 DrawShape(Point(Round(OldPTop.X + iArr * dx), Round(OldPTop.Y + iArr * dy)),
Point(Round(OldPBottom.X + iArr * dx), Round(OldPBottom.Y + iArr * dy)),
pmNotXor, clBlack);
if iArr >= Delta then {если количество шагов достигла предела то}
begin
Moving:= false;
with StringGrid1 do
begin
{Рисую линию соединяющую нижние концы линий}
 DrawShape(Point(Round(OldPBottom.X + Delta * dx), Round(OldPBottom.Y + Delta * dy)),
Point(StrToInt(Cells[1, 1]), StrToInt(Cells[2, 1])),
pmNotXor, clBlack);
{Рисую линию соединяющую верхние концы линий}
 DrawShape(Point(Round(OldPTop.X + Delta * dx), Round(OldPTop.Y + Delta * dy)),
Point(StrToInt(Cells[3, 1]), StrToInt(Cells[4, 1])),
pmNotXor, clBlue);

{Почему 2 линии? Потому что, я не знаю какие концы соединились, 
 верхние или нижние, поэтому одна из линий превратится в точку, что я 
 думаю не так уж важно}

end;
Ответить с цитированием