问题解决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.