Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.15;
Скачать: CL | DM;

Вниз

Рисование линий на TImage   Найти похожие ветки 

 
Alll   (2007-03-28 16:46) [0]

Добрый день. подскажите что нужно подправить в этом коде(у меня есть разметка на Timage точки через каждые десять пикселей подобно тому как выглядит форма делфи на этапе конструирования и линии  рисуется у меня рывками от точки к точке) но мне нужно чтобы линии рисовались
также только чтобы они рисовались вертикально и горизотально, а не от любой точке к точке. Подскажите пожалуйста.
var
sl,st:string;
  X0,Y0,X1,Y1:integer;
  kx,ky:integer;
```````````````````````````````````````````
procedure TForm1.PoligonMouseDown(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
with Poligon.Canvas do begin
sl:=IntToStr(X div 10)+"0";
st:=IntToStr(Y div 10)+"0";
  X0:=StrToInt(sl);
  Y0:=StrToInt(st);
if CompliteButton.Down then begin
{режим линии}
  X1:=StrToInt(sl);
  Y1:=StrToInt(st);
  Pen.Mode:=pmNotXor;
  Pen.Color:=clblack;
 end;
end;

end;

procedure TForm1.PoligonMouseMove(Sender: TObject; Shift: TShiftState; X,
 Y: Integer);
var
Xd,Yd:integer;
begin
sl:=IntToStr(X div 10)+"0";
st:=IntToStr(Y div 10)+"0";

Xd:=StrToInt(sl);
Yd:=StrToInt(st);
kx:=x; ky:=y;
if not (ssLeft in Shift) then exit;
if CompliteButton.Down then begin
if not (ssLeft in Shift) then exit;
  X:=StrToInt(sl);
  Y:=StrToInt(st);
{режим линии}
with Poligon.Canvas do begin
{стирание прежней линии}
 MoveTo(X0,Y0);
 LineTo(X1,Y1);
{рисование новой линии}
 MoveTo(X0,Y0);
 LineTo(X,Y);
{запоминание новых координат конца линии}
 X1:=X;
 Y1:=Y;
end;
end;
end;

procedure TForm1.PoligonMouseUp(Sender: TObject; Button: TMouseButton;
 Shift: TShiftState; X, Y: Integer);
begin
if CompliteButton.Down then begin
with Poligon.Canvas do begin
sl:=IntToStr(X div 10)+"0";
st:=IntToStr(Y div 10)+"0";
X:=StrToInt(sl);  Y:=StrToInt(st);
MoveTo(X0,Y0);
LineTo(X1,Y1);
Pen.Mode:=pmCopy;
MoveTo(X0,Y0);
LineTo(X,Y);
end;
end;
end;


 
Сергей М. ©   (2007-03-28 17:01) [1]


> только чтобы они рисовались вертикально и горизотально


А ты не дергай мыша никуда в иные направления, кроме вертикального и горизонтального, тогда и  будет тебе "только ... вертикально и горизотально"


 
Alll   (2007-03-28 17:05) [2]

Спасибо вам за мудрый совет, а вдруг рука дрогнет?


 
Leonid Troyanovsky ©   (2007-03-28 18:05) [3]


> Alll   (28.03.07 17:05) [2]

> Спасибо вам за мудрый совет, а вдруг рука дрогнет?

Надо меньше пить.
Наконец, ты ж не нейрохирург.

--
Regards, LVT.


 
Alll   (2007-03-28 18:22) [4]

Ну подскажите как сделать !!!


 
TRUNK ©   (2007-03-28 18:59) [5]

> [4] Alll   (28.03.07 18:22)

Сначала переделай вот это:

sl:=IntToStr(X div 10)+"0";
st:=IntToStr(Y div 10)+"0";
X0:=StrToInt(sl);
Y0:=StrToInt(st);

чтоб людей не пугать.


 
Alll   (2007-03-28 21:46) [6]

Если бы я знал как то бы неприменно переделал. Подскажите как плиз ну плиз


 
RASkov   (2007-03-28 21:53) [7]

X0 = X-(x mod 10)


 
Alll   (2007-03-28 22:24) [8]

Заменил я это всё на ваше выражение(работает всё так же), а как же
всё таки сделать чтобы как я задавал в вопросе. Может вы не поняли вопрос
нужно чтобы было так: (к примеру 1)начинаю римсовать линию с точки
[10,10] 2) веду эту линию и если курсор в точке(100,99 и меньше) то линия рисуется горизонтально а если (99 и меньше, 100) то линия рисуется вертикально


 
Virgo_Style ©   (2007-03-28 22:38) [9]

if |deltaX|>|deltaY| then горизонтально else вертикально, я так понимаю


 
Alll   (2007-03-28 22:52) [10]

Я тоже так понимаю, но в силу не очень глубокого знания программирования не знаю как это сделать


 
RASkov   (2007-03-28 23:11) [11]

> [8] Alll   (28.03.07 22:52)

Диагональных лини не должно быть или как? Я вот вообще не понял, что в итоге у тебя должно получится

Т.е. можно так:
|
|
|
|___________

и нельзя так

\
\
 \
  \
   \__________

Так ли это?


 
Alll   (2007-03-29 01:11) [12]

Да да именно так


 
RASkov   (2007-03-29 01:43) [13]

> [12] Alll   (29.03.07 01:11)

type
 TForm1 = class(TForm)
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 XCen, YCen, OldX, OldY: Integer;

const CELLSIZE = 10;

implementation

{$R *.dfm}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if Button<>mbLeft then Exit;
 XCen:=X-(X mod CELLSIZE);
 YCen:=Y-(Y mod CELLSIZE);
 OldX:=XCen;
 OldY:=YCen;
 Canvas.Pen.Mode:=pmNotXor;
 Canvas.Ellipse(XCen-2, YCen-2, XCen+2, YCen+2);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var X1, Y1: Integer;
begin
 if not (ssLeft in Shift) then Exit;
 Canvas.MoveTo(XCen, YCen);
 Canvas.LineTo(OldX, OldY);
 X1:=X-(X mod CELLSIZE);
 Y1:=Y-(Y mod CELLSIZE);
 Canvas.MoveTo(XCen, YCen);
 if ABS(XCen-X1)<ABS(YCen-Y1) then begin
  Canvas.LineTo(XCen, Y1);
  OldX:=XCen;
  OldY:=Y1;
 end else begin
  Canvas.LineTo(X1, YCen);
  OldX:=X1;
  OldY:=YCen;
 end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var X1, Y1: Integer;
begin
 if Button<>mbLeft then Exit;
 Canvas.Ellipse(XCen-2, YCen-2, XCen+2, YCen+2);
 Canvas.MoveTo(XCen, YCen);
 Canvas.LineTo(OldX, OldY);
 X1:=X-(X mod CELLSIZE);
 Y1:=Y-(Y mod CELLSIZE);
 Canvas.Pen.Mode:=pmCopy;
 Canvas.MoveTo(XCen, YCen);
 if ABS(XCen-X1)<ABS(YCen-Y1) then Canvas.LineTo(XCen, Y1) else Canvas.LineTo(X1, YCen);
end;


 
Alll   (2007-03-29 02:28) [14]

Спасибо


 
RASkov   (2007-03-29 03:07) [15]

Блин, зажгло :)

type
 TForm1 = class(TForm)
   procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
     Y: Integer);
   procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
     Shift: TShiftState; X, Y: Integer);
   procedure FormPaint(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 XCen, YCen, OldX, OldY: Integer;

const CELLSIZE = 10;
     HALFCELLSIZE = CELLSIZE div 2;

implementation

{$R *.dfm}

procedure CorrectXY(const FromX, FromY: Integer; var ToX, ToY: Integer; const Diag: Boolean=False);
var CorrectX, CorrectY: Integer;
begin
 CorrectX:=(FromX mod CELLSIZE);
 CorrectY:=(FromY mod CELLSIZE);
 ToX:=FromX-CorrectX; if CorrectX>HALFCELLSIZE then INC(ToX, CELLSIZE);
 ToY:=FromY-CorrectY; if CorrectY>HALFCELLSIZE then INC(ToY, CELLSIZE);
 if Diag then if ABS(XCen-ToX) > ABS(YCen-ToY) then ToY:=YCen else ToX:=XCen;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if Button<>mbLeft then Exit;
 CorrectXY(X, Y, XCen, YCen, True);
 OldX:=XCen; OldY:=YCen;
 Canvas.Pen.Mode:=pmNotXor;
 Canvas.Ellipse(XCen-HALFCELLSIZE, YCen-HALFCELLSIZE, XCen+HALFCELLSIZE, YCen+HALFCELLSIZE);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
 if not (ssLeft in Shift) then Exit;
 Canvas.MoveTo(XCen, YCen);
 Canvas.LineTo(OldX, OldY);
 CorrectXY(X, Y, X, Y, True);
 Canvas.MoveTo(XCen, YCen);
 Canvas.LineTo(X, Y);
 OldX:=X; OldY:=Y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
 if Button<>mbLeft then Exit;
 Canvas.Ellipse(XCen-HALFCELLSIZE, YCen-HALFCELLSIZE, XCen+HALFCELLSIZE, YCen+HALFCELLSIZE);
 Canvas.MoveTo(XCen, YCen);
 Canvas.LineTo(OldX, OldY);
 CorrectXY(X, Y, X, Y, True);
 Canvas.Pen.Mode:=pmCopy;
 Canvas.Pen.Width:=2;
 Canvas.MoveTo(XCen, YCen);
 Canvas.LineTo(X, Y);
 Canvas.Pen.Width:=1;
end;

procedure TForm1.FormPaint(Sender: TObject);
var W, H: Integer;
begin
 for W :=0 to ClientWidth do
  for H := 0 to ClientHeight do
   if ((W mod CELLSIZE)=0) and ((H mod CELLSIZE)=0) then Canvas.Pixels[W, H]:=clBlack;
end;



Страницы: 1 вся ветка

Текущий архив: 2007.04.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.033 c
6-1161713578
Amt2001
2006-10-24 22:12
2007.04.15
Indy FTPServer и потоки


15-1174479953
ilopX
2007-03-21 15:25
2007.04.15
Delphi не для ПК


2-1174405904
quott
2007-03-20 18:51
2007.04.15
TDateTime


3-1169787958
Шмфтнср
2007-01-26 08:05
2007.04.15
сортировка в SQL по нескольким параметрам, поможите


2-1174459124
Kolan
2007-03-21 09:38
2007.04.15
Люди, помогите отладить &amp;laquo;List out of bounds&amp;raquo; :)