Delphi中的一种简单重载

背景 

问题:如何重载控件的一个方法( 积分: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
这种东西只能说收藏起来才行

 

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月巴月巴白勺合鸟月半

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值