相信没有什么人对 MEMO 陌生了吧。尽管其组件的功能不错。但是,对它进行一些功能的改进,可以更好的使用。

有的时候,我们想要知道,当前的坐标是什么?甚至,想要在 滚动条滚动时触发一些事件。 但,TMemo 本身并没有这样的功能。那我们就要扩展它;

那我们现在就来作:

file -> new -> other -> package

在 dpk 窗口上, Add 。

New component 如下图:

完整的程序源代码如下:

  1. unit JoeMemo;
    1. interface
    2. uses
    3. Windows,Classes, Controls, StdCtrls,Messages ;
    4. type
    5. TJoeMemo = class(TMemo)
    6. private
    7. { Private declarations }
    8. FRow : LongInt;
    9. FCol : LongInt;
    10. FOnHScroll : TNotifyEvent;
    11. FOnVScroll : TNotifyEvent;
    12. procedure WMHScroll(var msg : TWMHScroll);message WM_HSCROLL;
    13. procedure WMVScroll(var msg : TWMVScroll);message WM_VSCROLL;
    14. procedure SetRow(value : LongInt);
    15. procedure SetCol(value : LongInt);
    16. function GetRow : LongInt;
    17. function GetCol : LongInt;
    18. protected
    19. { Protected declarations }
    20. procedure HScroll; dynamic;
    21. procedure VScroll; dynamic;
    22. public
    23. { Public declarations }
    24. property Row : LongInt read GetRow write SetRow;
    25. property Col : LongInt read GetCol write SetCol;
    26. published
    27. { Published declarations }
    28. property OnHScroll : TNotifyEvent read FOnHScroll write FOnHScroll;
    29. property OnVScroll : TNotifyEvent read FOnVScroll write FOnVScroll;
    30. end;
    31. procedure Register;
    32. implementation
    33. procedure Register;
    34. begin
    35. RegisterComponents('JoeTools', [TJoeMemo]);
    36. end;
    37. { TJoeMemo }
    38. function TJoeMemo.GetCol: LongInt;
    39. begin
    40. Result := Perform(EM_LINEINDEX,-1,0);
    41. end;
    42. function TJoeMemo.GetRow: LongInt;
    43. begin
    44. Result := Perform(EM_LINEFROMCHAR,-1,0);
    45. end;
    46. procedure TJoeMemo.HScroll;
    47. begin
    48. if Assigned(FOnHScroll) then FOnHScroll(Self);
    49. end;
    50. procedure TJoeMemo.SetCol(value: Integer);
    51. begin
    52. if FCol > value  then FCol :=value;
    53. SelStart := Perform(EM_LINEINDEX,GetRow,0)+FCol;
    54. end;
    55. procedure TJoeMemo.SetRow(value: Integer);
    56. begin
    57. SelStart := Perform(EM_LINEINDEX,value,0);
    58. FRow := SelStart;
    59. end;
    60. procedure TJoeMemo.VScroll;
    61. begin
    62. if Assigned(FOnVScroll)  then FOnVScroll(Self);
    63. end;
    64. procedure TJoeMemo.WMHScroll(var msg: TWMHScroll);
    65. begin
    66. inherited;
    67. HScroll;
    68. end;
    69. procedure TJoeMemo.WMVScroll(var msg: TWMVScroll);
    70. begin
    71. inherited;
    72. VScroll;
    73. end;
    74. end.

http://blog.csdn.net/aroc_lo/article/details/3075814

控件编写:增强 TMEMO (一)(增加对WM_HSCROLL消息的处理)的更多相关文章

  1. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  2. DevExpress WinForms v19.1新版亮点:Tree List等控件性能增强

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  3. DevExpress WinForms v19.1新版亮点:Spreadsheet/Sunburst控件功能增强

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  4. SharePoint用户控件编写的简单介绍

    转:http://www.it165.net/design/html/201204/1131.html 我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickP ...

  5. 【C#基础】CSA控件编写秘籍

    新建CSA控件 1.新建一个纯类,命名空间是: namespace SimPerfect.CSAControlLibrary.CSAControls 2.实现两个构造函数:无参和传Candy参数 pu ...

  6. SharePoint 用户控件编写的简单介绍

    我们开发中,通常需要写各种各样的部件来实现我们的展示或者功能,下面就介绍下刚刚接触的QuickPart+用户控件的方式,算是自己的学习笔记,也和大家交流下心得. 1. 新建Web应用程序 2. 在项目 ...

  7. DevExpress WPF v19.2图表图形控件功能增强?速速种草

    通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...

  8. DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强

    行业领先的.NET界面控件DevExpress 日前正式发布v19.1版本,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WPF v19.1中新增的一些控件及部 ...

  9. 扩展 easyui 控件系列:为datagrid 增加过滤行

    此功能还为真正完成,起到抛砖引玉的效果,发动大家的力量把这个功能完善起来,效果图如下: 基本上就是扩展了 datagrid.view 中的onAfterRender 这个事件,具体代码如下: $.ex ...

  10. Flex 自定义打印控件编写

    打印历来是web应用一个比较棘手的问题,幸好flex web应用是运行在flash player上的,flash player可以访问打印机,所以flex 应用可以实现比较强大的打印功能.Flex 自 ...

随机推荐

  1. Javascript 运动应用 02

                                                                         JS运动应用   多个物体同时运动 例子:多个Div,鼠标移入 ...

  2. 错误处理try catch

    <?phpfunction inverse($x) { if (!$x) { throw new Exception('被除数不能为0'); } if ($x>31) { throw ne ...

  3. django 新闻编辑笔记

    url(r'^news_manage/edit/$',views.news_edit,name='edit') url配置 <a href="/management/news_mana ...

  4. Week2(9月19日):增加一个CodeFirst的例子来说明

    Part I:提问  =========================== 1.上堂课中我们使用了()数据库,它是()可部署的,只需要将相应的()文件添加到应用程序的()文件夹,就可以使用了,该数据 ...

  5. 创建.NET Core项目

    创建.NET Core项目 ? 对于.NET开发人员来说,我们已经习惯了VS这个世界上最强大的IDE,所以对他们来说,项目的创建直接利用安装到VS中相应的项目模板即可.当.NET Core跨出了Win ...

  6. 分享,iOS国家手机区号代码.plist

    APP注册需要手机号码的时候,如果有在其他国家的时候需要填写手机区号 一份有国家名字和区号的plist 参照微信注册的时候 格式是 <Array> <Array> <Ar ...

  7. linux ubuntu安装jdk

    Oracle对Jdk7与Jre7的关系的经典图解 Oracle has two products that implement Java Platform Standard Edition(Java ...

  8. poj 3368 Frequent values(段树)

    Frequent values Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13516   Accepted: 4971 ...

  9. 我的Python成长之路---第二天---Python基础(8)---2016年1月9日(晴)

    数据类型之字典 一.字典简介 字典dict(dictionary),在其他语言中也成为map,使用键-值(key-value)的形式存储和展现,具有极快的查找速度. 字典的定义 d = {'key': ...

  10. admin嵌套在spring mvc项目里,菜单栏点击新连接每次都会重置

    <ul class="treeview-menu" id="ul_schedule"> <li><a href="#&q ...