背景
问题:如何重载控件的一个方法( 积分:100, 回复:9, 阅读:49) 来自:adnim, 时间:2009-03-11 16:12, ID:3948143 |
我要画一个圆角矩形的shape。但是shape圆角的角度是随shape的大小变化的。我想重载shape的print方法。让这个角度定死。查了一些资料。没找到解决方法。特来请教。谢谢。 |
别人的回答
来自:znxia, 时间:2009-03-11 19:13, ID:3948181 |
如果是共用,请将TMYShape写在另外一个单元,如果只是当前界面使用,则可以写在窗体的unit单元中。 在type后面,implementation之前,写如下代码: TMYShape=Class(TShape) protected procedure Paint; override; End; 然后按Ctrl+Shift+C,就会在implementation后面自动生成下面的代码: { TMYShape } procedure TMYShape.Paint; begin inherited; end; 然后编写代码,下面的代码拷贝delphi7中的代码,其中变量S就是你需要设置的参数。 procedure TMYShape.Paint; var X, Y, W, H, S: Integer; begin with Canvas do begin Pen := FPen; Brush := FBrush; X := Pen.Width div 2; Y := X; W := Width - Pen.Width + 1; H := Height - Pen.Width + 1; if Pen.Width = 0 then begin Dec(W); Dec(H); end; if W < H then S := W else S := H; if FShape in [stSquare, stRoundSquare, stCircle] then begin Inc(X, (W - S) div 2); Inc(Y, (H - S) div 2); W := S; H := S; end; case FShape of stRectangle, stSquare: Rectangle(X, Y, X + W, Y + H); stRoundRect, stRoundSquare: RoundRect(X, Y, X + W, Y + H, S div 4, S div 4); stCircle, stEllipse: Ellipse(X, Y, X + W, Y + H); end; end; end; ---------------------------------- 下面你就可以测试了,但控件需要动态创建。 如果你想让它可以放到DELPHI控件栏中,请使用向导菜单: Component\New component |
俺的回答
来自:hfghfghfg, 时间:2009-03-14 16:31, ID:3948275 |
不需要 那么 麻烦 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type TShape = class(ExtCtrls.TShape) protected procedure Paint; override; end; TForm1 = class(TForm) Shape1: TShape; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // end; { TShape } procedure TShape.Paint; begin inherited; with Canvas do begin TextOut(1, 1, 'hfghfghfg'); end; end; end. |
网友的评价
来自:adnim, 时间:2009-03-14 21:11, ID:3948336 |
问题解决 znxia的方法是教科书式的。完全子类化了一个控件。如果想正常使用需要很多代码。 hfghfghfg比较实用。但是不太明白。1、重载后print方法中。shape的Canvas属性是不是已经继承并封装好。不需要再对pen等进行指向了。因为只有修改才可以运行。2、这种方法该怎么称呼。或者说这种方法用了什么技术?为什么在窗体里必须用和原来类一样的类名称(TShape)才可以。而用其他的名称(TMYShape)就不可以? 我从两者的方法中都学到了东西。感谢两位。 |
来自:znxia, 时间:2009-03-14 22:25, ID:3948350 |
偷梁换柱的方式,妙! DELPHI编译的时候,由于当前单元定义了一个TShape类型的变量Sharp1,它就需要寻找TShape的定义,先从本单元查找,如果本单元没有定义,那么它就到其它单元查找,所以楼上那位高手就继续使用了原类名,用D九年了,还真没想到过这步妙棋。 Canvas是在ExtCtrls单元的TShape类中就封装好了,本处可以直接使用。 |
来自:adnim, 时间:2009-03-14 22:53, ID:3948354 |
知其然知其所以然。再次感谢。 |
来自:amloy520, 时间:2009-03-15 22:18, ID:3948440 |
这种东西只能说收藏起来才行 |