Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16495965
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 20:48:18

下载本文示例代码
p>  在Delphi 3的时代,我们是没法让TMemo突破传统的64K界限的。现在可就轻松多了。出于方便、快捷和安全性的考虑(在文本模式下是不会有富裕(Rich)控制标识), TMemo制作的文本转换、文本阅读器是比较不错的好帮手,至少在编程上来得较为省时。唯一美中不足的是在这种状态下,难以确定行号和列号,而这些在阅读、打字时是比较常用的。   如果读者的编译器为10.0版以下,可以这样解决:   对TMemo的句柄发送EM_LINEFROMCHAR来获得当前字符的行数,进行一下Interger $#@60;-$#@62; String的变换就是行号了,而获得当前光标所在的列数就稍微复杂一点:   先对TMemo的句柄发送EM_GETSEL来获得当前光标对于所在字符的选择数(该返回值是一个DWORD,低位WORD为选择起始值,高位WORD为选择数),这个数包含了从TMemo文本缓冲开始以来的字符,因此,必须减去当前行以前的所有字符的另外一个数,这另外一个数可以对TMemo的句柄发送EM_LINEINDEX来获得。   也就是:   行数= SendMessage(Handle, EM_LINEFROMCHAR, -1, 0);   列数= LongRec(SendMessage(Handle, EM_GETSEL, 0, 0)).Hi -   SendMessage(Handle, EM_LINEINDEX, -1, 0);   如果你正在使用Delphi 5,那么这一切都在TMemo.CaretPos的TPoint这个属性里,其X正是列值,而Y为行值。   为了正常显示行列号,建议读者使用消息来处理。这是为了正确处理用户在打字时按下诸如: Home、End之类的键。   一个范例:   unit Unit1;   interface   uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   ComCtrls, StdCtrls;   const   WM_USERGETPOS = WM_USER 100; //定义绘出行列号的消息   type   TForm1 = class(TForm)   Memo1: TMemo;   StatusBar1: TStatusBar;   procedure FormCreate(Sender: TObject);   procedure Memo1KeyDown(Sender: TObject; var Key: Word;   Shift: TShiftState);   procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton;   Shift: TShiftState; X, Y: Integer);   private   { Private declarations }   protected   { protected declarati }   procedure DrawMyPos(var Msg: TMessage);message WM_USERGETPOS; //消息事件   public   { Public declarations }   end;   var   Form1: TForm1;   implementation   {$R *.DFM}   procedure TForm1.DrawMyPos(var Msg: TMessage);var   L1,L2: Integer;begin   L1 := Memo1.CaretPos.y;   L2 := Memo1.CaretPos.x;   StatusBar1.SimpleText := IntToStr(L1) : IntToStr(L2);   //格式为行:列显示end;   procedure TForm1.FormCreate(Sender: TObject);begin   Memo1.Clear;   PostMessage(Handle,WM_USERGETPOS,0,0);   //显示初始化end;   procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;   Shift: TShiftState);begin   PostMessage(Handle,WM_USERGETPOS,0,0);   //响应用户的按键end;   procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;   Shift: TShiftState; X, Y: Integer);begin   PostMessage(Handle,WM_USERGETPOS,0,0);   //响应鼠标的定位end;   end. p>  在Delphi 3的时代,我们是没法让TMemo突破传统的64K界限的。现在可就轻松多了。出于方便、快捷和安全性的考虑(在文本模式下是不会有富裕(Rich)控制标识), TMemo制作的文本转换、文本阅读器是比较不错的好帮手,至少在编程上来得较为省时。唯一美中不足的是在这种状态下,难以确定行号和列号,而这些在阅读、打字时是比较常用的。   如果读者的编译器为10.0版以下,可以这样解决:   对TMemo的句柄发送EM_LINEFROMCHAR来获得当前字符的行数,进行一下Interger $#@60;-$#@62; String的变换就是行号了,而获得当前光标所在的列数就稍微复杂一点:   先对TMemo的句柄发送EM_GETSEL来获得当前光标对于所在字符的选择数(该返回值是一个DWORD,低位WORD为选择起始值,高位WORD为选择数),这个数包含了从TMemo文本缓冲开始以来的字符,因此,必须减去当前行以前的所有字符的另外一个数,这另外一个数可以对TMemo的句柄发送EM_LINEINDEX来获得。   也就是:   行数= SendMessage(Handle, EM_LINEFROMCHAR, -1, 0);   列数= LongRec(SendMessage(Handle, EM_GETSEL, 0, 0)).Hi -   SendMessage(Handle, EM_LINEINDEX, -1, 0);   如果你正在使用Delphi 5,那么这一切都在TMemo.CaretPos的TPoint这个属性里,其X正是列值,而Y为行值。   为了正常显示行列号,建议读者使用消息来处理。这是为了正确处理用户在打字时按下诸如: Home、End之类的键。   一个范例:   unit Unit1;   interface   uses   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,   ComCtrls, StdCtrls;   const   WM_USERGETPOS = WM_USER 100; //定义绘出行列号的消息   type   TForm1 = class(TForm)   Memo1: TMemo;   StatusBar1: TStatusBar;   procedure FormCreate(Sender: TObject);   procedure Memo1KeyDown(Sender: TObject; var Key: Word;   Shift: TShiftState);   procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton;   Shift: TShiftState; X, Y: Integer);   private   { Private declarations }   protected   { protected declarati }   procedure DrawMyPos(var Msg: TMessage);message WM_USERGETPOS; //消息事件   public   { Public declarations }   end;   var   Form1: TForm1;   implementation   {$R *.DFM}   procedure TForm1.DrawMyPos(var Msg: TMessage);var   L1,L2: Integer;begin   L1 := Memo1.CaretPos.y;   L2 := Memo1.CaretPos.x;   StatusBar1.SimpleText := IntToStr(L1) : IntToStr(L2);   //格式为行:列显示end;   procedure TForm1.FormCreate(Sender: TObject);begin   Memo1.Clear;   PostMessage(Handle,WM_USERGETPOS,0,0);   //显示初始化end;   procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;   Shift: TShiftState);begin   PostMessage(Handle,WM_USERGETPOS,0,0);   //响应用户的按键end;   procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton;   Shift: TShiftState; X, Y: Integer);begin   PostMessage(Handle,WM_USERGETPOS,0,0);   //响应鼠标的定位end;   end. 下载本文示例代码


不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?不明就里?
阅读(163) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~