请问大虾们:
我想在richedit中设置某行的某个字串如:教务处对大家说中的教务处,为链接文本,当点击它的时候,会触放某个事件处理过程,例如,取得该文本字串,并进行比较,请问该怎么做,最好有代码,先谢谢了
我想在richedit中设置某行的某个字串如:教务处对大家说中的教务处,为链接文本,当点击它的时候,会触放某个事件处理过程,例如,取得该文本字串,并进行比较,请问该怎么做,最好有代码,先谢谢了
解决方案 »
- 三层结构,连接都是用的IP地址,如果用动态域名,好像不支持?难道我每次都手动先将域名转成IP?
- 每日赚分,嘿嘿.
- 请问如何判断一个句柄是菜单?
- webbrowser问题?
- 心情不错!★☆★☆★☆★☆散分了!!★☆★☆★☆★☆
- 各位,如何在利用ado连接forpro2.5的数据表中实现reindex,pack?
- 一个关于ACCESS很奇怪的现象。大家一起看看...
- CDSN怎么了?为什么一搜索就说"服务器忙"?--抗议(遇到这种情况的来拿分,以表愤懑)
- 怎么让TMemo控件打开网络文件,如http://a.com/a.txt
- 哪有delphi帮助文件汉化版
- 辞职一个多月了,还没找到工作,郁闷。
- fastreport问题 谢谢 分不够再加
1、发送一个消息(EM_GETEVENTMASK)给RichEdit组件,获取事件模板(EventMask),它将会指定哪一个消息通知(notification)将被发送到给父窗口。
2、发送一个包含ENM_LINK标志的EM_SETEVENTMASK消息给EichEdit,ENM_LINK将被包含在Mask中,当鼠标单击ULR时EN_LINK消息将被发送。
3、发送EM_AUTOURLDETECT消息给RichEdit,EM_AUTOURLDETECT消息将会自动检测URL。
然后,我们来解决URL高亮显示的问题。
在我们刚刚建立的程序中找到RichEdit1组件,进入它的OnCreate事件,在该事件中加入一个自定义的InitRichEditURLDetection过程,以便能够在程序启动时就触发它;RichEdit2组件的OnCreate事件则不加入InitRichEditURLDetection过程,让两者比较一下效果,代码如下所示:
//这个是我们自定义的InitRichEditURLDetection过程
//它是最关键的一步
procedure TForm1.InitRichEditURLDetection(RE: TRichEdit);
var
mask: Word;
begin
mask := SendMessage(RE.Handle, EM_GETEVENTMASK, 0, 0);
SendMessage(RE.Handle, EM_SETEVENTMASK, 0, mask or ENM_LINK);
SendMessage(RE.Handle, EM_AUTOURLDETECT, Integer(True), 0);
end;
//这是FormCreate事件,它加入了我们自定义的过程
//使得程序一运行就出现我们想要实现的效果
procedure TForm1.FormCreate(Sender: TObject);
var
s: string;
begin
InitRichEditURLDetection(RichEdit1); s:='http://www.yesky.com' #13#10
'mailto:[email protected]';
RichEdit1.Text := s; s:= 'http://www.yesky.com' #13#10
'mailto:[email protected]';
RichEdit2.Text := s
end;
最后我们来实现鼠标单击后自动调用浏览器或邮件程序的功能,我们用覆盖(Override)Form的WndProc方法来捕获EN_LINK消息,然后我们用ShellExecute过程来启动缺省的浏览器,代码如下所示:
//Form的WndProc过程
procedure TForm1.WndProc(var Msg: TMessage);
var
p: TENLink;
sURL: string;
CE : TRichEdit;
begin
if (Msg.Msg = WM_NOTIFY) then
begin
if (PNMHDR(Msg.lParam).code = EN_LINK) then
begin
p := TENLink(Pointer(TWMNotify(Msg).NMHdr)^);
if (p.Msg = WM_LBUTTONDOWN) then
begin
try
CE := TRichEdit(Form1.ActiveControl);
SendMessage(CE.Handle, EM_EXSETSEL, 0, Longint(@(p.chrg)));
sURL := CE.SelText;
ShellExecute(Handle, 'open', PChar(sURL), 0, 0, SW_SHOWNORMAL);
except
end;
end;
end;
end;
inherited;
end;
我所要的不是对URL、Mailto的检测,而是对于任意字符串,可随时设置成链接文本,例如对于任意加入的一个字串“中国”,使之成为链接文本。
cf2:CHARFORMAT2;begin
fillchar(cf2, sizeof(CHARFORMAT2),0);//
cf2.cbSize:= sizeof(CHARFORMAT2);
cf2.dwMask:= CFM_LINK;
cf2.dwEffects:= cf2.dwEffects or CFE_LINK or CFE_HIDDEN;
SendMessage(self.RxRichEdit1.Handle, EM_SETCHARFORMAT, SCF_SELECTION, integer(@cf2));以上语句能对选中的文本增加链接,英文没问题,但对中文有时会出现异常!