Как использовать существующие функции класса из класса TSelectionPoint, чтобы перерисовать линию между двумя фигурами? - PullRequest
0 голосов
/ 23 октября 2018

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

type
  Ttriangle_selection = class(TSelectionPoint)
    procedure Paint; override;
    function FOnChangeTrack:TOnChangeTracking;
  private
    { Private declerations }
  public
    { Public declerations }
  end;

Как видите, я также пытаюсь получить доступ к свойствуOnTrack с помощью метода FOnChangeTrack, как предлагается в документации.

Для контекста здесь приведен мой код того, что находится в моей форме:

Ttriangle_selection_form = class(TForm)
    Panel1: TPanel;
    Rectangle1: TRectangle;
    Image1: TImage;
    procedure FormCreate(Sender: TObject);
    procedure Rectangle1Paint(Sender: TObject; Canvas: TCanvas;
      const ARect: TRectF);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

Ниже приведены некоторые переменные, которые я используюпо всей программе:

var
  triangle_selection_form: Ttriangle_selection_form;
  new_triangle : Integer; //for paint function

  triangle_x: Ttriangle_selection;  //triangles to be created
  triangle_y: Ttriangle_selection;  //triangles to be created

   point_1, point_2:TPointF; //Points to connect line
implementation

{$R *.fmx}

Здесь я использую процедуру рисования TSelectionPoint, чтобы создать пути для точек, которые будут рисовать мои треугольники:

procedure Ttriangle_selection.Paint;
var
  path_data: TPathData;
  triangle_points: TPolygon;
  triangle_object: Tpath;
  triangle_size, triangle_location: Integer;
  category_label:TLabel;
  type_label:TLabel;

begin
  begin
    path_data := TPathData.Create();
    triangle_size := 30;

    SetLength(triangle_points, 3);
    triangle_points[0].X := 0;
    triangle_points[0].Y := 0;

    triangle_points[1].X := 3;
    triangle_points[1].Y := 0;

    triangle_points[2].X := 3;
    triangle_points[2].Y := -4;

    With path_data do
    begin
      MoveTo(triangle_points[0]);
      LineTo(triangle_points[1]);
      LineTo(triangle_points[2]);
      ClosePath;
    end;

    triangle_object := Tpath.Create(self);
    with triangle_object do
    begin
      Width := triangle_size * 3;
      Height := triangle_size * 4;
      Data := path_data;
      // Parent:=Rectangle1
      Position.X := 20 + new_triangle;
      Position.Y := 20;
    end;

    GripSize := 40;
    Scale.X := 10;
    Scale.Y := 10;
    new_triangle := new_triangle + 100;
    Canvas.DrawPath(triangle_object.Data, 2);
    path_data.Destroy;
  end;
end;

Затем я использую* * * * * * Форма OnCreate Метод рисования треугольников на моем прямоугольнике:

procedure Ttriangle_selection_form.FormCreate(Sender: TObject);
    var
      triangle_1:TPointF;
    begin
      triangle_x := Ttriangle_selection.Create(Rectangle1);
      triangle_x.Position.X := 20;
      triangle_x.Position.Y := 20;
      triangle_x.parent:=  Rectangle1;
      triangle_x.GripSize := 50;

      triangle_y :=  Ttriangle_selection.create(Rectangle1);
      triangle_y.Position.X := 20;
      triangle_y.Position.Y := 350;
      triangle_y.parent:=  Rectangle1;
      triangle_y.GripSize := 50;

      point_1 := triangle_x.Position.Point;
      point_2 := triangle_y.Position.Point;
    end;

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

procedure Ttriangle_selection_form.Rectangle1Paint(Sender: TObject;
  Canvas: TCanvas; const ARect: TRectF);
begin
  Canvas.DrawLine(point_1, point_2, 2);
end;

MyГлавная цель - иметь возможность перемещать мои треугольники на площади и постоянно соединять их линией.В другом проекте я создаю два TSelectionPoints и затем использую одно из событий OnTrack точки, чтобы перекрашивать Image1 каждый раз, когда я перемещаю одну из точек.Я хочу быть в состоянии сделать то же самое с треугольниками, которые я сделал, переопределяя исходные точки из TSelectionPoint.

1 Ответ

0 голосов
/ 23 октября 2018

Поскольку я не знал, как получить доступ к событию OnTrack в TSelectionPoint, я создал TSelectionPoint в своей форме.Затем я сделал triangle_x = для события OnTrack этого TSelectionPoint.

procedure Ttriangle_selection_form.Rectangle1Paint(Sender: TObject;
  Canvas: TCanvas; const ARect: TRectF);
begin
  point_1 := triangle_x.Position.Point;
  point_2 := triangle_y.Position.Point;
  Canvas.DrawLine(point_1, point_2, 2);
  triangle_x.OnTrack :=  SelectionPoint1Track;
end;

Теперь я могу использовать событие TSelectionPoint1Track, как если бы оно было свойством triangle_x

procedure Ttriangle_selection_form.SelectionPoint1Track(Sender: TObject; var X,
  Y: Single);
begin
   Rectangle1.Repaint;
end;

Теперь я могу перемещать свой треугольник вокруг моей формы, и он перерисовывается автоматически.

...