相信没有什么人对 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. Google Code Jam Round 1A 2015 Problem B. Haircut 二分

    Problem You are waiting in a long line to get a haircut at a trendy barber shop. The shop has B barb ...

  2. ZOJ 3490 String Successor 字符串处理

    一道模拟题,来模拟进位 暴力的从右往左扫描,按规则求后继就好了.除了Sample已给出的,还有一些需要注意的地方: 9的后继是10,而不是00: (z)的后继是(aa),而不是a(a): 输入虽然最长 ...

  3. Chrome设计文档-多进程资源加载

    原文:Multi-process Resource Loading 背景 浏览器主进程及browser process处理所有的网络通信.原因有三点: Browser process可以控制每一个re ...

  4. WinXP系统服务详细列表

    windows XP 系统服务“关闭”详细列表,释放N多内存,128也够用了! 在xp系统中,有近90个服务,默认开启了 30多个服务,而事实上我们只需要其中几个就够用了.禁止所有不必要的服务可以为您 ...

  5. HTML5实现IP Camera网页输出

    HTML5实现IP Camera网页输出 这两天做OA项目.有一个要通过IP Camera将视频流输出到浏览器端的模块.尽管如今买到的摄像头都会提供浏览器和client的实现,可是一般来说都是仅仅支持 ...

  6. Duanxx的C++得知:计算位数

    一旦计算出一个数值数字,基本上它是不断分裂使用10.重新计,看看有多少个数字. 今天发现能够考虑先将数字转换为字符串,然后通过string.length获得数值的位数,这样做方便的多. string ...

  7. 一款简单的客户端安卓手机qq源码

    给大家分享一款比较简单的安卓手机qq应用源码,效果非常不错,大家可以借鉴一下,希望大家会喜欢. 1.png  (7.24 KB, 下载次数: 0) 02.png  (68.52 KB, 下载次数: 0 ...

  8. Swift 初见

    http://numbbbbb.gitbooks.io/-the-swift-programming-language-/chapter1/02_a_swift_tour.html 本页内容包括: 简 ...

  9. spring MVC 如何获取session并实现传值到前台

    后台获取session: @RequestMapping("/usrlogin") public ModelAndView usrlogin(@RequestParam Strin ...

  10. JVM调优总结(六)-分代垃圾回收详述2

    分代垃圾回收流程示意 选择合适的垃圾收集算法 串行收集器 用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高.但是,也无法使用多处理器的优势,所以此收集器适合单处理器机器.当然,此收集器 ...