做一个画三角形的组件。通过输入三个顶点的坐标,控制三角形的三个顶点的相对位置。
为了描述点的位置,定义了一个TXY类,包括两个字段fx,fy,表示一个点的(x,y)坐标。
在我的三角形控件内,我声明了三个TXY类型的变量fp1,fp2,fp3。
拖入一个三角形控件后,在属性列表里这样显示:
-P1
  X
  Y
-P2
  X
  Y
-P3
  X
  Y
现在问题是更改点的属性后,图形没有更新,如果接着修改其他属性比如left,height,brush,pen等,图形能把修改的点更新,问题在哪里呢?
 
 TXY=class(Tpersistent)
  private
    Fx:integer;
    Fy:integer;
    procedure set_x(value:integer);
    procedure set_y(value:integer);
  public
    constructor create;
    destructor destroy;override;
  published
    property X:integer read Fx write set_x ;
    property Y:integer read Fy write set_y ;
  end;
Imlementation
constructor TXY.create;
begin
  Fx:=0;
  Fy:=0;
end;
destructor TXY.destroy;
begin
  inherited;
end;
procedure  TXY.set_x(value:integer);
begin
 fx:=value;
end;
procedure  TXY.set_y(value:integer);
begin
 fy:=value;
end;

解决方案 »

  1.   

    附:三角形的代码,麻烦高手帮忙看一下unit TriangleX;interfaceuses
      SysUtils, Classes, Controls, RectX,MyBasePic;type
      TTriangle = class(TRectXY)//TRectXY是自定义的类
      private
      FP1:TXY;
      FP2:TXY;
      FP3:TXY;
      FOnChange:TNotifyEvent;
      procedure setp1(value:TXY);
      procedure setp2(value:TXY);
      procedure setp3(value:TXY);
        { Private declarations }
      protected
      procedure paint;override;
      procedure DoChange;virtual;
        { Protected declarations }
      public
      constructor create(Aowner:Tcomponent);override;
        { Public declarations }
      published
      property P1:TXY read fp1 write setp1;
      property P2:TXY read fp2 write setp2;
      property P3:TXY read fp3 write setp3;
       property OnChange:TNotifyEvent read FOnChange write FOnChange;
        { Published declarations }
      end;procedure Register;implementationconstructor TTriangle.create(Aowner:Tcomponent);
    begin
      inherited create(Aowner);
      fp1:=TXY.create;
      fp2:=TXY.create;
      fp3:=TXY.create;
      height:=100;
      width:=100;
      fp1.X:=50;fp1.Y:=10;
      fp2.X:=10;fp2.Y:=90;
      fp3.X:=90;fp3.Y:=90;
    end;
    procedure TTriangle.DoChange;
    begin
      if assigned(Fonchange)then Fonchange(self);
    end;
    procedure TTriangle.setp1(value:TXY);
    begin
      if Assigned(fp1) then
      fp1.Free;
      fp1:=value;
      invalidate;
    end;
    procedure TTriangle.setp2(value:TXY);
    begin
      fp2:=value;
      refresh;
      dochange;
    end;
    procedure TTriangle.setp3(value:TXY);
    begin
      fp3:=value;
      invalidate;
      dochange;
    end;procedure TTriangle.paint;
    begin
      inherited;  with canvas do
      begin  canvas.Polygon([Point(p1.X,p1.Y),Point(p2.X,p2.Y),Point(p3.X,p3.Y)]);
      end;
    end;
    procedure Register;
    begin
      RegisterComponents('User', [TTriangle]);
    end;end.
      

  2.   

     TXY=class(Tpersistent)
      private
        Fx:integer;
        Fy:integer;
        procedure set_x(value:integer);
        procedure set_y(value:integer);
      public
        constructor create;
        destructor destroy;override;
      published
        property X:integer read Fx write set_x ;
        property Y:integer read Fy write set_y ;
      end;
    Imlementation
    constructor TXY.create;
    begin
      Fx:=0;
      Fy:=0;
    end;
    destructor TXY.destroy;
    begin
      inherited;end;
    procedure  TXY.set_x(value:integer);
    begin
     fx:=value;
     invalidate;
    end;
    procedure  TXY.set_y(value:integer);
    begin
     fy:=value;
     invalidate;
    end;
      

  3.   

    不要從 Tpersistent 繼承,最好從:TControl  繼承。 做完屬性的設置後執行下: Invalidate