Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TCanvas


Автор: Bacardi 15.4.2005, 22:35
Господа, мне нужно ввести данные: линию (начальные и конечные координаты) и точки. Координаты точек я записываю в StringGrid, один столбец которого сохраняет координаты Х, другой -- У.
Дело в другом. Моя задумка такая: юзер выбирает в rgInputData: TRadioGroup тип вводимых данных (Item[0]=Линия, Item[1]=Точка). И я хочу, чтобы линия воодилась так: нажал на области - записались координаты линии начальные (xn, yn)... далее ведя по области (Drag), держа мышь нажатой, передвигал и линию, затем когда отпускает левую кн. мыши - записывались xk, yk...
Не выходит закрашивать линию. Посоветуйте плз. smile

Код

procedure TfProcessing.Image1MouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if rgInputData.ItemIndex=0                {если выбран ввод линии}
  then
    begin
    Image1.Canvas.MoveTo(X,Y);
    xn:=X;
    yn:=Y;
    xm:=X;
    ym:=Y;
    sbStatus.Panels[0].Text:='Совет: поставьте конечную точку линии';
    CanDrag:=True;
    end
  else                                                {если выбран ввод точки}
    begin
    sgT.RowCount:=sgT.RowCount+1;
    sgT.Cells[0,count]:=IntToStr(count);
    Image1.Canvas.Brush.Color:=clBlack;
    Image1.Canvas.MoveTo(X,Y);
    Image1.Canvas.LineTo(X,Y);
    end;
end;

procedure TfProcessing.Image1MouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
if (rgInputData.ItemIndex=0) and CanDrag          {если выбран ввод линии и мышь была нажата}
  then
    begin
    with Image1.Canvas do
      begin
      Brush.Color:=clWhite;                                   {пытаюсь закрасить старую линию}
      LineTo(xm,ym);
      MoveTo(xn,yn);
      Brush.Color:=clBlack;
      LineTo(X,Y);
      xm:=X;                                                            {сохраняю координаты для закрашивания}
      ym:=Y;
      end;
    end;
end;

procedure TfProcessing.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
if rgInputData.ItemIndex=0
  then
    begin
    sbStatus.Panels[0].Text:='Совет: измените тип вводимых данных';    
    Image1.Canvas.LineTo(X,Y);
    xk:=X;                                                                 {конечные координаты линии}
    yk:=Y;
    CanDrag:=False;
    end;
end;


собственно в итоге водя по канвасу несколько раз вокруг - канва закрашивается в черный цвет.

Автор: fess 16.4.2005, 11:25
Вот, посмотри пример (кидаешь на форму Timage и TRadioGroup с двуя Items'ами) :

Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    RadioGroup1: TRadioGroup;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure FormCreate(Sender: TObject);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MDown:boolean;
  XBegin,YBegin, TempX,TempY :integer;

implementation

{$R *.dfm}

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  {Определяем, что мыша нажата и запоминаем начальные координаты}
  MDown:=true;
  XBegin:=X;
  YBegin:=Y;
  TempX:=X;
  TempY:=Y;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MDown:=false;
  Image1.Canvas.Pen.Color:=clBlack;
end;

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

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if MDown      // если мыша нажата
  then  begin


    if RadioGroup1.ItemIndex=1 // если выбрано линия из точек,
    then Image1.Canvas.Pen.Style:=psDot
    else  Image1.Canvas.Pen.Style:=psSolid; //    Сплошная линия


    {очистка Image1, в том числе стираются и все страрые линии}
    {тебе их придётся заново рисовать, но это не сложно, т.к. они у  тебя есть в StringGrid'е }
    Image1.Canvas.Rectangle(-1,-1, Image1.Width+1,Image1.Height +1);
    {Рисование линии}
    Image1.Canvas.MoveTo(XBegin,YBegin);
    Image1.Canvas.LineTo(X,Y);
//    Если тебя не устраивает, что стираются предыдущие линии, то
//    закоментирую предыдущие три строки  и расскоментируй всё что ниже
//    Image1.Canvas.Pen.Color:=clWhite;
//    Image1.Canvas.MoveTo(XBegin,YBegin);
//    Image1.Canvas.LineTo(TempX,TempY);
//
//    Image1.Canvas.Pen.Color:=clBlack;
//    Image1.Canvas.MoveTo(XBegin,YBegin);
//    Image1.Canvas.LineTo(X,Y);
//    TempX:=X;
//    TempY:=Y;
  end;

end;

end.

Автор: Bacardi 16.4.2005, 20:56
спасибо, фесс
щас опробую!

Автор: Bacardi 17.4.2005, 13:46
Круто! работает! спасибо smile

smile

Автор: fess 17.4.2005, 14:34

Цитата
Круто! работает! спасибо :smile


Я рад, что помогло smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)