用Delphi读取鼠标所在位置单词

Author: XueSong Date: 2001年 32期

?牐犛行┳值涑绦蚓哂姓庋墓δ堠ぉさ蔽颐怯檬蟊甑闳∧掣鲇⑽牡ゴ屎螅绦蚓拖允靖玫ゴ实闹形囊馑迹庋某绦蛟跹嘈茨兀渴紫任颐且杏⑽亩哉兆值涫孪冉?立好,然后在程序中获取使用者点取的单词,接着在中英文对照字典查找所选的单词,最后将翻译结果显示出来。本文就着力说明如何在程序中读取鼠标所在位置的单词。
  ?牐牫绦虻墓丶谟谛枰蛭谋究虼菹N_CHARFROMPOS。该消息用于读取当前鼠标位于文本框的第几行第几列上。在发送该消息时,参数wParam没有作用;参数lParam为长整型,用于指定鼠标的坐标位置,其中两个高字节指定Y,两个低字节指定X。返回值为长整型,其中两个高字节指定鼠标位于第几个字符上,两个低字节指定鼠标位于第几个列上。
  ?牐牫绦虼肴缦拢?
  ?牐爑nit Unit1;??
  ?牐爄nterface
  ?牐爑ses
  ?牐燱indows,Messages,SysUtils,Classes,Graphics,Controls,Forms,Dialogs,
  ?牐燬tdCtrls;??
  ?牐爐ype
  ?牐燭Form1 = class(TForm)??
  ?牐燤emo1:TMemo;??
  ?牐爌rocedure Memo1MouseDown(Sender:TObject;Button:TMouseButton;??
  ?牐燬hift:TShiftState;X,Y:Integer);?牔?
  ?牐爌rocedure FormCreate(Sender:TOb—ject);?牔?
  ?牐爌rivate
  ?牐? {Private declarations} ??
  ?牐爌ublic
  ?牐燜unction IsSeparetor(ch:Char):Boolean;??
  ?牐燜unction GetWord(pos:Word):String;??
  ?牐爗Public declarations}??
  ?牐爀nd;??
  ?牐爒ar
  ?牐燜orm1:TForm1;??
  ?牐爄mplementation
  ?牐? {$R*.DFM}??
  ?牐? {函数IsSparetor用于判定一个字符是否为分隔符}
  ?牐燜unction TForm1.IsSeparetor(ch:Char):Boolean;
  ?牐燽egin
  ?牐營sSeparetor:= False; ??
  ?牐營f ch in[' ',', '.','?',#10,#13]then
  ?牐營sSeparetor:= True
  ?牐燛nd;??
  ?牐爗函数GetWord用于读取鼠标所在位置的单词}??
  ?牐燜unction TForm1.GetWord(pos:Word):String;??
  ?牐爒ar
  ?牐爏t:string;pos1,pos2:Word;??
  ?牐爄:Longint;w:string;??
  ?牐燽egin
  ?牐爓:='':pos1:= 1;getword:='';??
  ?牐? {读取文本框中的内容及文本长度}
  ?牐爏t:=Memo1.Lines.Text ;??
  ?牐爌os2:= length(st)?牔?
  ?牐? {向前搜寻当前单词的起始位置}??
  ?牐燜or i:= pos - 1 downTo 1 do
  ?牐營f IsSeparetor(st[i])Then
  ?牐燽egin
  ?牐爌os1:= i + 1;break
  ?牐爀nd;??
  ?牐? {向后搜寻当前单词的结束位置}??
  ?牐燜or i:= pos To pos2 do
  ?牐營f IsSeparetor(st[i])Then
  ?牐燽egin
  ?牐爌os2:= i - 1; break
  ?牐爀nd;
  ?牐? {截取pos1-pos2间的字符,以构成一个单词}
  ?牐爄f pos1<=pos2 then
  ?牐燽egin
  ?牐燜or i:= pos1 To pos2 do
  ?牐爓:=w+st[i];?牔?
  ?牐燝etWord:= '单词:'+w
  ?牐爀nd
  ?牐燛nd; ??
  ?牐爌rocedure TForm1.Memo1MouseDown(Sender:TObject;Button:TMouseButton;??
  ?牐燬hift:TShiftState;X,Y:Integer);?牔?
  ?牐爒ar
  ?牐爈c:Longint;CharPos:Word;??
  ?牐燽egin
  ?牐? {向文本框传递消息EN_CHARFROMPOS}
  ?牐爈c:= SendMessage(Memo1.handle,EM_CHARFROMPOS,0,x+(y shl 16));?牐牐? {取得鼠标位于第几个字符上}??
  ?牐燙harPos:=Word(lc)
  ?牐爗显示我们所点取的单词}??
  ?牐燤emo1.Hint:= GetWord(CharPos)??
  ?牐爀nd;??
  ?牐爌rocedure TForm1.FormCreate(Sender.TObject);?牔?
  ?牐燽egin
  ?牐燤emo1.ShowHint:=True
  ?牐爀nd;
  ?牐爀nd.
  ?牐犚陨洗朐赪indows 98、Delphi 5.0环境下调试通过。