相信没有什么人对 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:void(0)的作用示例

    在做页面时,如果想做一个链接点击后不做任何事情,或者响应点击而完成其他事情,可以设置其属性 href = "#",但是,这样会有一个问题,就是当页面有滚动条时,点击后会返回到页面顶 ...

  2. oracle11g dataguard 完全手册(转)

    转自:http://www.cnblogs.com/tippoint/archive/2013/04/18/3029019.html 一.前言:   网络上关于dataguard的配置文章很多,但是很 ...

  3. java排序方法中的选择排序方法

    每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完. package array; //选择排序方法 public class arra ...

  4. ThinkPHP文件上传类

    TP框架自带文件上传类使用: 类文件在ThinkPHP/Library/Think/默认在目录下 public function upload(){ $upload = new \Think\Uplo ...

  5. django 新闻编辑笔记

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

  6. search_word

    一个小程序,用asc码输出自己的名字.要求是,a~z两路输入,输出了一个完整的拼音之后还需要输出一个空格.—— 信息硬件过滤的雏形. module search_word ( clock , rese ...

  7. docker学习笔记7:发布镜像到docker hub上

    镜像创建好后,很重要的一个操作就是共享和发布.可以将自己创建的镜像发布到docker hub上,也可以发布到自己的私有docker hub上. 要想发布镜像到dokcer hub上,首先要在dokce ...

  8. 基于visual Studio2013解决C语言竞赛题之0520相邻元素

          题目

  9. 黑马程序员 ---> 正则表达式

    --------------- ASP.Net+Android+IO开发S..Net培训.期待与您交流! --------------- 正则表达式 一.概述: 1.概念:符合一定规则的表达式. 2. ...

  10. http 连接复用

    定义 Http/1.0每次请求都需要建立新的TCP连接,连接不能复用.Http/1.1新的请求可以在上次建立的tcp连接之上发送,连接可以复用. 优点 减少重复进行tcp三次握手的开销,提高效率.注意 ...