转载于万一的博客https://www.cnblogs.com/del/archive/2009/10/13/1582789.html

class helper 可能是从 Delphi 2007 增加的新语法, 因为感觉不太实用, 直到今天才测试了一下.
试过之后才知道: 挺有意思的! 基本功能就是修改已存在的类.

  1. Txxx = class helper for T... {T... 表示已存在的类}
  2. {可以替换已存在的方法}
  3. {也可以有新的方法、成员}
  4. end;
  5.  
  6. //这之后再使用 T... 类及其子孙类时, 都会优先使用 Txxx 的修改

例一:

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. procedure Button1Click(Sender: TObject);
  13. end;
  14.  
  15. TMyClass = class
  16. function func1: string;
  17. function func2: string;
  18. end;
  19.  
  20. TMyClassHelper = class helper for TMyClass
  21. function func1: string; {将把 TMyClass 的同名方法替换掉}
  22. function func3: string; {将为 TMyClass 及其子类增加这个方法}
  23. end;
  24.  
  25. var
  26. Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. {$R *.dfm}
  31.  
  32. { TMyClass }
  33.  
  34. function TMyClass.func1: string;
  35. begin
  36. Result := 'TMyClass.func1';
  37. end;
  38.  
  39. function TMyClass.func2: string;
  40. begin
  41. Result := 'TMyClass.func2';
  42. end;
  43.  
  44. { TMyClassHelper }
  45.  
  46. function TMyClassHelper.func1: string;
  47. begin
  48. Result := 'TMyClassHelper.func1';
  49. end;
  50.  
  51. function TMyClassHelper.func3: string;
  52. begin
  53. Result := 'TMyClassHelper.func3';
  54. end;
  55.  
  56. //测试
  57. procedure TForm1.Button1Click(Sender: TObject);
  58. var
  59. obj: TMyClass;
  60. begin
  61. obj := TMyClass.Create;
  62.  
  63. ShowMessage(obj.func1); {TMyClassHelper.func1}
  64. ShowMessage(obj.func2); {TMyClass.func2}
  65. ShowMessage(obj.func3); {TMyClassHelper.func3}
  66.  
  67. obj.Free;
  68. end;
  69.  
  70. end.

例二: 本例为 TControl 类增加了一个方法, 之后 TControl 及其所有子孙类就都拥有了这个方法.

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. procedure Button1Click(Sender: TObject);
  13. end;
  14.  
  15. TMyClassHelper = class helper for TControl
  16. procedure MyMsg;
  17. end;
  18.  
  19. var
  20. Form1: TForm1;
  21.  
  22. implementation
  23.  
  24. {$R *.dfm}
  25.  
  26. { TMyClassHelper }
  27.  
  28. procedure TMyClassHelper.MyMsg;
  29. begin
  30. ShowMessageFmt('%s 的类名是 %s', [Name,ClassName]);
  31. end;
  32.  
  33. //测试: 这里测试了当前窗体和当前按钮, 它们都是从 TControl 继承来的
  34. procedure TForm1.Button1Click(Sender: TObject);
  35. begin
  36. Self.MyMsg; {Form1 的类名是 TForm1}
  37. TButton(Sender).MyMsg; {Button1 的类名是 TButton1}
  38. end;
  39.  
  40. end.

 菜根大神的方法

  1. type
  2. TMyObject = class
  3. private
  4. FX : Integer;
  5. public
  6. property X: Integer read FX write FX;
  7. end;
  8.  
  9. type
  10. TMyObjectHelper = class helper for TMyObject
  11. type
  12. PMyObjHelperData = ^TMyObjHelperData;
  13. TMyObjHelperData = record
  14. public
  15. FY: Integer;
  16. end;
  17. private
  18. class constructor Create;
  19. public
  20. function GetData: PMyObjHelperData;
  21. function GetXYValue : Integer;
  22. procedure SetY(Y: Integer);
  23. end;
  24.  
  25. class constructor TMyObjectHelper.Create;
  26. var
  27. P: Pointer;
  28. ASize: Integer;
  29. T: NativeUInt;
  30. begin
  31. P := PByte(TMyObject) + vmtInstanceSize;
  32. ReadProcessMemory(GetCurrentProcess, P, @ASize, SizeOf(ASize), T);
  33. Inc(ASize, SizeOf(TMyObjHelperData));
  34. WriteProcessMemory(GetCurrentProcess, P, @ASize, SizeOf(ASize), T);
  35. end;
  36.  
  37. function TMyObjectHelper.GetData: PMyObjHelperData;
  38. begin
  39. Result :=
  40. Pointer(PByte(Self) + InstanceSize - hfFieldSize + hfMonitorOffset - SizeOf(TMyObjHelperData));
  41. end;
  42.  
  43. function TMyObjectHelper.GetXYValue : Integer;
  44. var
  45. AData: PMyObjHelperData;
  46. begin
  47. AData := GetData;
  48. Result:= FX + AData.FY;
  49. end;
  50.  
  51. procedure TMyObjectHelper.SetY(Y: Integer);
  52. var
  53. AData: PMyObjHelperData;
  54. begin
  55. AData := GetData;
  56. AData.FY := Y;
  57. end;
  58.  
  59. procedure TForm1.Button5Click(Sender: TObject);
  60. var
  61. AObj: TMyObject;
  62. begin
  63. AObj := TMyObject.Create;
  64. AObj.X := 200;
  65. AObj.SetY(100);
  66. ShowMessage(AObj.GetXYValue.ToString);
  67. AObj.Free;
  68. end;

  

关于 class helper for ... 语法的更多相关文章

  1. Razor语法大全

    本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078.html Razor是基于framewor4以上写的一个开源项目:https://githu ...

  2. Razor语法大全(转)

    Razor语法大全 因为最近在看mvc的时候在学习Razor的发现了这个不错的博文,故转之. 本文页面来源地址:http://www.cnblogs.com/dengxinglin/p/3352078 ...

  3. mvc 4 Razor (@html.xx)语法大全以及应用

    Razor语法大全  @Html ASP.NET MVC 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction差别 对这 ...

  4. 【Razor语法规则小手册....】

    在经过长达半年的Windows开发后,Razor的一些语法有些生疏了.搜集些,再熟悉下.呵呵,甚是怀念以前做web 项目的时候,基于动软代码生成器自定义T4模板,后来vs2010后开始支持T4模板. ...

  5. MVC+EF Core 完整教程20--tag helper详解

    之前我们有一篇:“动态生成多级菜单”,对使用Html Helper做了详细讲述,并且自定义了一个菜单的 Html Helper: https://www.cnblogs.com/miro/p/5541 ...

  6. Razor标记语言介绍

    什么是Razor?   Razor的中文意思是"剃刀",它不是编程语言,只是一种服务器段的标记语言,与PHP和ASP类似   Razor允许你向网页中嵌入基于服务器的代码(Visu ...

  7. ASP.NET MVC 3和Razor中的@helper 语法

    原文:http://kb.cnblogs.com/page/102191/ ASP.NET MVC 3支持一项名为"Razor"的新视图引擎选项(除了继续支持/加强现有的.aspx ...

  8. delphi xe3的helper语法 good

    在C#中有一个很有用的helper保留字,它可以让我们对已有的类添加额外功能,当时就在想delphi有这个保留字就好了,这样许多控件就不需要继承重写了.后来delphi 果然有了这个语法,到delph ...

  9. (转)ASP.NET MVC 3和Razor中的@helper 语法

    转自:http://kb.cnblogs.com/page/102191/ ASP.NET MVC 3支持一项名为“Razor”的新视图引擎选项(除了继续支持/加强现有的.aspx视图引擎外).当编写 ...

随机推荐

  1. Android的onCreateOptionsMenu()创建菜单Menu

    android一共有三种形式的菜单:             1.选项菜单(optinosMenu)             2.上下文菜单(ContextMenu)             3.子菜 ...

  2. iphone精简教程

    那么教程开始 首先讲一下到底什么是精简 精简,就是把iphone4里面没用的自带软件和一些没用的东西删除 比如说股票,facetime,itunes store这些从来不用的东西,把这些东西删除从而使 ...

  3. 转:java 委托

    委托模式是软件设计模式中的一项基本技巧.在委托模式中,有两个对象参与处理同一个请求,接受请求的对象将请求委托给另一个对象来处理.委托模式是一项基本技巧,许多其他的模式,如状态模式.策略模式.访问者模式 ...

  4. linux在当前目录下根据文件名查找文件

    grep -rl "python" ./ 查找./目录下文件名中包含python的文件 find | grep luoluo将当前目录下(包括子目录)的文件名中含有luoluo的文 ...

  5. Oracle恢复删除数据

    可以通过SCN和时间戳两种方法来恢复. 一.通过SCN恢复删除且已经提交的数据 查询当前SCN select current_scn from v$database; 如图: 缩小范围进行查询 查询到 ...

  6. Linux setenforce命令详解[SeLinux操作]

    SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统. 关闭SELinux 临时生效: 命令临时 ...

  7. Docker 命令总结

    1 启动镜像 docker run -i -t centos /bin/bash

  8. iPhone/android的viewport 禁止页面自动缩放

    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scal ...

  9. #002 Emmet完整API

    介绍 这里包含了,所有的Emmet API,非常的详细,但是有一点详细过头了,如果只想快速上手,那么推荐<#001 Emmet的API图片> Emmet (前身为 Zen Coding) ...

  10. php实现随机数字、字母的验证码

     php实现随机数字.字母的验证码 可自定义生成验证码文字的大小.数量.干扰项等等,也可以自定义验证文字的字体... 废话不多说,直接上代码: 1.classgd.class.php <?php ...