当前位置: 首页 > news >正文

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
这种东西只能说收藏起来才行

 


http://www.mrgr.cn/news/14742.html

相关文章:

  • Datawhale AI夏令营 第五期 CV方向 Task2笔记
  • python-旋转木马(赛氪OJ)
  • LlamaIndex 实现 Agent
  • Android Launcher启动过程
  • Autosar(Davinci) --- 创建一个OS TASK
  • 数学建模之数据分析【八】:数据预处理之数据格式化
  • 2024年8月23日(docker 数据存储)
  • 深度学习500问——Chapter13:优化算法(2)
  • Git拉取某个分支的指定文件
  • Django 中render、redirect 和 HttpResponse的区别
  • 系统分析师5-数据库特训专题
  • 基于yolov8的行人跌倒检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • K8s之自动扩缩容
  • Git相关指令
  • BackdoorLLM:一个针对生成性LLMs后门攻击的全面基准测试
  • CMake编译指令极简说明
  • python之多线程和多进程以及threading和multiprocessing模块
  • 宠物空气净化器应该怎么选择?希喂、IAM、有哈哪款性价比高
  • linux neo4j 切换知识图谱
  • css之ShadowDOM