Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.12.2008, 09:38
maddamo4ka maddamo4ka вне форума
Прохожий
 
Регистрация: 13.10.2008
Сообщения: 42
Репутация: 10
Вопрос Срочно нужна помощь!

Я наверно на форуме достала уже со своей программой, но помощь мне нужна очень. Суть программы состоит в том, что рисуем две линии в разных областях Image1, и вторая линия должна передвинутся к первой(т.е. соединяуются только началом), и затем рисуется третья линия. И как мне сделать так, чтобы линии которые показывают передвижение убирались с экрана, но при этом было видно, что линиия двигается? Вот выкладываю архив программы! Помогите кто чем может
Вложения
Тип файла: rar Delphi.rar (9.6 Кбайт, 11 просмотров)
Ответить с цитированием
  #2  
Старый 24.12.2008, 16:50
Аватар для VVM
VVM VVM вне форума
Прохожий
 
Регистрация: 23.11.2008
Сообщения: 1
Репутация: 10
По умолчанию

Вот тут реализовано движение линии по TImage со стиранием.

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormShow(Sender: TObject);
  private
    A, B: TPoint;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
const
  Dist = 5;
begin
  with Image1.Canvas do
  begin
    Pen.Color := clWhite;
    MoveTo(A.X, A.Y);
    LineTo(B.X, B.Y);
    case Key of
      VK_UP:
        begin
          A.Y := A.Y - Dist;
          B.Y := B.Y - Dist;
        end;
      VK_DOWN:
        begin
          A.Y := A.Y + Dist;
          B.Y := B.Y + Dist;
        end;
      VK_LEFT:
        begin
          A.X := A.X - Dist;
          B.X := B.X - Dist;
        end;
      VK_RIGHT:
        begin
          A.X := A.X + Dist;
          B.X := B.X + Dist;
        end;
    end;
    Pen.Color := clBlack;
    MoveTo(A.X, A.Y);
    LineTo(B.X, B.Y);
  end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  A.X := 30;
  A.Y := 30;
  B.X := 50;
  B.Y := 50;
end;

end.
Ответить с цитированием
  #3  
Старый 25.12.2008, 05:12
maddamo4ka maddamo4ka вне форума
Прохожий
 
Регистрация: 13.10.2008
Сообщения: 42
Репутация: 10
По умолчанию

А как это можно вставить в мою работу?
Ответить с цитированием
  #4  
Старый 25.12.2008, 10:45
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

maddamo4ka в архиве есть некоторое решение твоей задачи, можно сказать новогодний подарок. Реализовано движение линии. Я основывался на твою форму, т.е. исходником была твоя форма. Я туда еще добавил еще один Button, который очищает канву. Чесно говоря, алгоритм у тебя никакой, извини если обидел, я на нажатие кнопки Button1 изменил алгоритм. Все намного проще чем ты думаешь. Надо было по другому подойти к поставленной цели. Кое какое описание есть в исходнике. Ну а если что спрашивай. Держи архив. Единственый косяк это то что при начинании движения линии конечные точки двигаемой линии остаются, но я думаю ты с этим справишься
Вложения
Тип файла: rar Delphi_1.rar (13.0 Кбайт, 9 просмотров)

Последний раз редактировалось Ama, 25.12.2008 в 11:30.
Ответить с цитированием
  #5  
Старый 25.12.2008, 16:33
maddamo4ka maddamo4ka вне форума
Прохожий
 
Регистрация: 13.10.2008
Сообщения: 42
Репутация: 10
По умолчанию

Спасибо за такой новогодний подарок!Ты просто спас мою надежду на получение автомата по экзамену А то что код никакой спасибо преподавателю..это он мне помог так Единственная проблема не могу сообразить как после передвижения нарисвать третию линию которая соединяла бы концы этих двух линий я пробовала сделать следующим образом:
Код:
with Form1.Image1.Canvas do begin
  Pen.Color:=clBlack;
 MoveTo(PTop1.X, PTop1.Y);
 LineTo(PTop2.X, PTop2.Y);
end;
но как-то она не рисуется. Если можешь выручи еще раз
И еще вопрос почему закомментированно вот это:
Код:
begin
 if (not Moving) or (iArr >= Delta) then exit;

 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);

{ OldPTop.X:= Round(OldPTop.X + iArr * dx);
 OldPBottom.X:= Round(OldPBottom.X + iArr * dx);
 OldPTop.Y:= Round(OldPTop.Y + iArr * dy);
 OldPBottom.Y:= Round(OldPBottom.Y + iArr * dy);}
Ответить с цитированием
  #6  
Старый 25.12.2008, 17:40
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Во первых тебе нужно переделать процедуру Timer1Timer вот код:
Код:
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);

   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, clBlack);
      end;
     Timer1.Enabled:= false;
    end;
  end;

А во вторых указанный коментарий можешь убрать, это следы моей работы
Ответить с цитированием
  #7  
Старый 25.12.2008, 18:26
maddamo4ka maddamo4ka вне форума
Прохожий
 
Регистрация: 13.10.2008
Сообщения: 42
Репутация: 10
Хорошо

Спасибо тебе огромнейшее прям не знаю как и благодарить а то я вообще уже была на грани нервного срыва все получилось
Ответить с цитированием
  #8  
Старый 26.12.2008, 08:39
maddamo4ka maddamo4ka вне форума
Прохожий
 
Регистрация: 13.10.2008
Сообщения: 42
Репутация: 10
По умолчанию

у меня тут еще вопрос возник объясни мне пожалуйста про каждый DrawShape в процедуре Timer1Timer
Код:
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);
 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);
end;
Ответить с цитированием
  #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;
Ответить с цитированием
  #10  
Старый 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;
Ответить с цитированием
  #11  
Старый 26.12.2008, 15:25
Ama Ama вне форума
Активный
 
Регистрация: 15.07.2008
Сообщения: 260
Репутация: 23
По умолчанию

Че-то один раз ответил получилось два одинаковых ответа.
Ответить с цитированием
  #12  
Старый 27.12.2008, 15:46
maddamo4ka maddamo4ka вне форума
Прохожий
 
Регистрация: 13.10.2008
Сообщения: 42
Репутация: 10
По умолчанию

спасибо большое все поняла
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter