如何重载控件的一个方法(100)

  • 主题发起人 主题发起人 adnim
  • 开始时间 开始时间
A

adnim

Unregistered / Unconfirmed
GUEST, unregistred user!
我要画一个圆角矩形的shape。但是shape圆角的角度是随shape的大小变化的。我想重载shape的print方法。让这个角度定死。查了一些资料。没找到解决方法。特来请教。谢谢。
 
TMYShape=Class(TShape) protected procedure Paint; override; End;{ TMYShape }procedure TMYShape.Paint;begin inherited; 、、参考ExtCtrls的1124行(DELPHI7)中的代码,自己绘制图形end;
 
这些代码应该放在那里?能给我发一下窗体的整个UNIT文件么?TMYShape类应该在那里声明?需要另建一个文件还是可以写在窗体的UNIT里?
 
如果是共用,请将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
 
不需要 那么 麻烦unit Unit1;interfaceuses 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.
 
我以前 经常 这么 干(*^__^*) 嘻嘻……
 
问题解决znxia的方法是教科书式的。完全子类化了一个控件。如果想正常使用需要很多代码。hfghfghfg比较实用。但是不太明白。1、重载后print方法中。shape的Canvas属性是不是已经继承并封装好。不需要再对pen等进行指向了。因为只有修改才可以运行。2、这种方法该怎么称呼。或者说这种方法用了什么技术?为什么在窗体里必须用和原来类一样的类名称(TShape)才可以。而用其他的名称(TMYShape)就不可以?我从两者的方法中都学到了东西。感谢两位。解决:unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs,ExtCtrls;//这里需要uses ExtCtrlstype TShape = class(ExtCtrls.TShape)//为什么一定要用一样的类名? protected procedure Paint; override; end; TForm1 = class(TForm) Shape1: TShape; private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}{ TShape }procedure TShape.Paint;var X, Y, W, H, S: Integer;begin //inherited;{这里就不需要继承了。否则会画两次} 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 Shape in [stSquare, stRoundSquare, stCircle] then begin Inc(X, (W - S) div 2); Inc(Y, (H - S) div 2); W := S; H := S; end; case Shape of stRectangle, stSquare: Rectangle(X, Y, X + W, Y + H); stRoundRect, stRoundSquare: RoundRect(X, Y, X + W, Y + H, 100, 100); stCircle, stEllipse: Ellipse(X, Y, X + W, Y + H); end; end;end;end.
 
偷梁换柱的方式,妙!DELPHI编译的时候,由于当前单元定义了一个TShape类型的变量Sharp1,它就需要寻找TShape的定义,先从本单元查找,如果本单元没有定义,那么它就到其它单元查找,所以楼上那位高手就继续使用了原类名,用D九年了,还真没想到过这步妙棋。Canvas是在ExtCtrls单元的TShape类中就封装好了,本处可以直接使用。
 
知其然知其所以然。再次感谢。
 
这种东西只能说收藏起来才行
 
后退
顶部