Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.12.2008, 10:57   #1
maddamo4ka
 
Регистрация: 25.11.2008
Сообщений: 4
Вопрос начало второй нарисованной линии должно передвинутся к началу первой. Delphi

Вот код программы
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  Image1: TImage;
    Label3: TLabel;
    StringGrid1: TStringGrid;
    Button1: TButton;
    BitBtn1: TBitBtn;
  procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Image1:TImage;
  X, N:Integer;
  Y:Integer;
  s:string;
  Origin,  MovePt: TPoint;
  Drawing: boolean;

implementation

{$R *.dfm}

procedure DrawShape(TopLeft, BottomRight:TPoint;AMode:TPenMode);
begin
with Form1.Image1.Canvas do begin
Pen.Mode :=AMode;
MoveTo(TopLeft.X, TopLeft.Y);
LineTo(BottomRight.X,BottomRight.Y);
end;
end;
procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
if Drawing=true then begin
DrawShape(Origin, MovePt, pmNotXor);
MovePt := Point(X, Y);
DrawShape(Origin, MovePt, pmNotXor);
end;
end;
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
N:=N+1;
str(N,s);
StringGrid1.RowCount:=N;
if Button<>mbLeft then Exit;
Image1.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
Drawing := true;
StringGrid1.RowCount:= N+1;
StringGrid1.Cells[0,0]:='Название вектора';
StringGrid1.Cells[1,0]:='x1';
StringGrid1.Cells[2,0]:='y1';
StringGrid1.Cells[3,0]:='x2';
StringGrid1.Cells[4,0]:='y2';
StringGrid1.Cells[0,N]:='Вектор № '+ s;
StringGrid1.Cells[1,N]:= Format('%d',[x]);
StringGrid1.Cells[2,N]:= Format('%d',[y]);
end;
procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
StringGrid1.Cells[3,N]:= Format('%d',[x]);
StringGrid1.Cells[4,N]:= Format('%d',[y]);
Drawing := false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
xx1, xx2, xx4, yy1, yy2:integer;
yy4, code:integer;
xxs1, xxs2, xxs4, yys1, yys2, yys4:string;
begin
xxs1:=StringGrid1.Cells[1,1];
xxs2:=StringGrid1.Cells[1,2];
val (xxs1, xx1, code);
val (xxs2, xx2, code);
yys1:=StringGrid1.Cells[2,1];
yys2:=StringGrid1.Cells[2,2];
val (yys1, yy1, code);
val (yys2, yy2, code);
repeat
if (yy1>yy2) and (xx1>xx2) then
begin
yy2:=yy2+5;
yys4:=StringGrid1.Cells[4,2];
val(yys4, yy4, code);
yy4:=yy4+5;
xx2:=xx2+5;
xxs4:=StringGrid1.Cells[3,2];
val(xxs4, xx4, code);
xx4:=xx4+5;
end else
begin
yy2:=yy2-5;
yys4:=StringGrid1.Cells[4,2];
val (yys4, yy4, code);
yy4:=yy4-5;
xx2:=xx2-5;
xxs4:=StringGrid1.Cells[4,2];
val(xxs4, xx4, code);
xx4:=xx4-5;
end;
if ((yy1-yy2)<5) or ((yy1-yy2)>-5) and ((xx1-xx2)<5) or ((xx1-xx2)>-5) then
begin
yy2:=yy1;
yy4:=yy4+(yy1-yy2);
xx2:=xx1;
xx4:=xx4+(xx1-xx2);
end;
with Form1.Image1.Canvas do begin
{Pen.Mode :=AMode;}
MoveTo(xx2, yy2);
LineTo(xx4, yy4);
end;
until (yy1=yy2) and (xx1=xx2);
end;
end.
Вобщем должно получится так, что начало второй нарисованной линии должно передвинутся к началу первой. У меня получается так что линия перемещается в другое место и под другим углом, либо получается так, что рисуется совсем другая линия (длинее чем я рисовала) . Подскажите, что сделать и что не так. Очень нужна помощь
maddamo4ka вне форума Ответить с цитированием
Старый 04.12.2008, 13:59   #2
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию

Хотите сказать новые линии должны рисоваться от начала предъыдущей? По mousedown тогда нужно задать начало вектора с координатами предъыдущей линии...
knight вне форума Ответить с цитированием
Старый 05.12.2008, 08:10   #3
maddamo4ka
 
Регистрация: 25.11.2008
Сообщений: 4
По умолчанию

получается надо присвоить значение, которое появится в ячейке с координатой начала первой линии? если не сложно напишите как это будет выглядеть? Просто Delphi у нас преподают всего несколько месяцев, а требуют чтобы мы писали программы. А в Delphi я плохо понимаю

Тут еще и такая загвоздка, что после перемещения линии от конца одной линии к концу другой должна провеститись и третья линия это называется программа по умножению векторов

Последний раз редактировалось SuperVisor; 05.12.2008 в 14:28.
maddamo4ka вне форума Ответить с цитированием
Старый 05.12.2008, 14:11   #4
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию

Код:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin

//Найдем начало предъидущего
if (N>=1) then
 begin
    x := StrToInt(StringGrid1.Cells[1,N]);
    y := StrToInt(StringGrid1.Cells[2,N]);
 end;

N:=N+1;
str(N,s);
StringGrid1.RowCount:=N;
if Button<>mbLeft then Exit;
Image1.Canvas.MoveTo(X, Y);
Origin := Point(X, Y);
MovePt := Origin;
Drawing := true;



StringGrid1.RowCount:= N+1;
StringGrid1.Cells[0,0]:='Название вектора';
StringGrid1.Cells[1,0]:='x1';
StringGrid1.Cells[2,0]:='y1';
StringGrid1.Cells[3,0]:='x2';
StringGrid1.Cells[4,0]:='y2';
StringGrid1.Cells[0,N]:='Вектор № '+ s;


StringGrid1.Cells[1,N]:= Format('%d',[x]);
StringGrid1.Cells[2,N]:= Format('%d',[y]);

end;
Так? А потом соединить?
knight вне форума Ответить с цитированием
Старый 05.12.2008, 14:43   #5
maddamo4ka
 
Регистрация: 25.11.2008
Сообщений: 4
По умолчанию

Нет..не то линии должны быть в разных местах области рисования, а потом одна передвигается ко второй и они соединяются третьей вот так
maddamo4ka вне форума Ответить с цитированием
Старый 05.12.2008, 15:16   #6
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Т.е. вы имеете ввиду, что у вас есть 2 заданные в гриде линии, так? Они должны прорисоваться из одной точки, а именно начало первой линии должно совпасть с началом второй линии?
Если да, то нет ничего проще: мы знаем начало первой (0,0) и ее конец (2,3), так же второй -(4,5) и (6,5) соответственно. Смещаем вторую линию на 4 влево и 5 вниз - получаем ее новые координаты: (0,0) и (2,0) соответственно. Теперь мы знаем координаты третьей, нужной нам (2,3) и (2,0).
С кодом разберетесь - там ничего сложного.
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 05.12.2008, 18:47   #7
maddamo4ka
 
Регистрация: 25.11.2008
Сообщений: 4
По умолчанию

они не заданы)как только линия нарисовалась мышкой ее координаты записываются в грид, также и со второй. Т.е. заранне мы не знаем координаты
maddamo4ka вне форума Ответить с цитированием
Старый 08.12.2008, 19:19   #8
knight
Дон Кихот
Форумчанин
 
Аватар для knight
 
Регистрация: 17.01.2008
Сообщений: 130
По умолчанию

Да тяжко с объяснением.... Тогда нарисуйте (подробно с координатами, пошагам)... Может быстрее поймем
knight вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удалить из второй строки те слова, которые есть в первой строке innaa639 Паскаль, Turbo Pascal, PascalABC.NET 2 26.11.2008 15:43
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45
Второй монитор из Delphi Sion Win Api 1 22.11.2006 20:08