自定义了一个三角形控件,在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.
现在的问题是:在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.
begin
fp1.X:=value.X;
fp1.y:=value.y;
Invalidate;
end;
用invalidate时,当windows有空的时候,才去刷新。也就是当Application.ProcessMessages被调用时。
用refresh,是立即刷新的。
我现在去改成record试试看去。
用record,没有在属性列表里列出来。因为要放到属性列表里面,要把属性放到published权限下,在record的定义中没有这种权限。
我感觉还是得用class
可能是由于两条子属性(x,y)在一个类下TXy下,修改x,y后不能触发setpx,这个过程。
如果setpx这个过程能触发,肯定能重画出来。
————————————————————————
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;