自定义了一个三角形控件,在canvas上通过制定三个点的坐标绘出三角形。
现在的问题是:在object inspector窗口中对P1,P2,P3(三个顶点的坐标)赋值后,控件没有立刻更新,切换一下设计窗口后,就更新了。我该怎么修改一下呢?
下面附程序
————————————————————————————————————————————————————————
unit TriangleX;interfaceuses
  SysUtils, Classes, Controls, RectX,MyBasePic;type
  TTriangle = class(TRect)//TRect 是我自己定义的类,继承自Tgraphiccontrol,跟graphics里面的类同名,后面我会改掉的。
  private
  FP1:TXY;                //TXY 自定义类,主要为了输入坐标方便x,y分成两行输入。这里用TPoint好像不行。
  FP2:TXY;
  FP3:TXY;
  procedure setp1(value:TXY);
  procedure setp2(value:TXY);
  procedure setp3(value:TXY);
  protected
  procedure paint;override;
  public
  constructor create(Aowner:Tcomponent);override;
  published
  property P1:TXY read fp1 write setp1;
  property P2:TXY read fp2 write setp2;
  property P3:TXY read fp3 write setp3;
  end;procedure Register;implementation
constructor 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.setp1(value:TXY);
begin
  fp1.X:=value.X;
  fp1.y:=value.y;
  refresh;end;
procedure TTriangle.setp2(value:TXY);
begin
  fp2:=value;
  refresh;
end;
procedure TTriangle.setp3(value:TXY);
begin
  fp3:=value;
  refresh;
end;
procedure TTriangle.paint;
begin
  inherited;
  with canvas do
  begin
  canvas.Polygon([Point(fp1.X,fp1.Y),Point(fp2.X,fp2.Y),Point(fp3.X,fp3.Y)]);
  end;
end;
procedure Register;
begin
  RegisterComponents('User', [TTriangle]);
end;end.

解决方案 »

  1.   

    procedure TTriangle.setp1(value:TXY); 
    begin 
      fp1.X:=value.X; 
      fp1.y:=value.y; 
      Invalidate;
    end; 
      

  2.   

    用Invalidate肯定是对的把你的tXY改成record型试试
      

  3.   

    关于refresh和invalidate,看有人这样说:
    用invalidate时,当windows有空的时候,才去刷新。也就是当Application.ProcessMessages被调用时。
    用refresh,是立即刷新的。
    我现在去改成record试试看去。
      

  4.   

    使用class应该没有问题吧,Tpen这样的也是类。
    用record,没有在属性列表里列出来。因为要放到属性列表里面,要把属性放到published权限下,在record的定义中没有这种权限。
    我感觉还是得用class
      

  5.   

    setp1,setp2,setp3不能自动执行,问题出在这里。
    可能是由于两条子属性(x,y)在一个类下TXy下,修改x,y后不能触发setpx,这个过程。
    如果setpx这个过程能触发,肯定能重画出来。
      

  6.   

    TXY的定义是不是有问题
    ————————————————————————
    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;
    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;