如何使用 TSelectionPoint class 中现有的 class 函数在两个形状之间重新绘制一条线?

How to use existing class functions from TSelectionPoint class to redraw a line between two shapes?

所以目前我正在覆盖 TSelectionPoint class 中的绘制程序来绘制一个三角形而不是它创建的原始小点。

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

如您所见,我也在尝试按照文档中的建议通过 FOnChangeTrack 方法访问 属性 OnTrack

对于上下文,这里是我的表单代码:

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;

我的主要 objective 是能够在正方形中四处移动我的三角形,并让它们始终由一条线连接。在另一个项目中,我创建了两个 TSelectionPoints,然后在每次移动其中一个点时使用其中一个点的 OnTrack 事件重新绘制 Image1。我希望能够通过覆盖 TSelectionPoint 中的原始点来对我制作的三角形执行相同的操作。

因为我不知道如何访问 TSelectionPoint 的 OnTrack 事件,所以我在我的表单上创建了一个 TSelectionPoint。然后我对那个 TSelectionPoint 的 OnTrack 事件做了 triangle_x =。

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;

现在我可以围绕我的表格移动我的三角形,它会自动重新绘制。