能不能在richedit里搞链接?(50分)

  • 主题发起人 主题发起人 zengxuh
  • 开始时间 开始时间
Z

zengxuh

Unregistered / Unconfirmed
GUEST, unregistred user!
假设在richedit中有这个些数据:中国 人民 解放军
我想要点击“中国”,然后就搜索数据库中有“中国”的数据,点击“人民”就搜索数据库中有“人民”的数据?不知道能不能实现?[?]
 
你可以可以使用abc控件组,,richedit有这个功能。。
 
能说清楚些吗?谢谢
 
用richedit可以实现文法高亮和鼠标点击执行的。
如果只是想在richedit上简单的显示网页和email的高亮,那么参看这篇文章,不难:
http://www.yesky.com/284/1838284.shtml

否则,要实现自定义的文本高亮,点击鼠标执行自定义的操作。那么看看我的代码,
代码是从我的一个程序内拷贝出来的,有些不兼容的地方,请自行修改修改。
高亮显示:
procedure TForm12.add_to_richedit(Sender: TObject; s: string);
var ss,ss3,ss4,ss5,t: string;
f: tfont;
i,l,k,p: integer;
j: boolean;
label l1;
begin
j:= true;
i:= pos('{',s);
inc(i);
ss:= copy(s,i,pos('}',s)-i);
if ss<> '' then
delete(s,pos('{',s),length(ss)+2);


L := Length(s);
k := 1;
p:= TRichEdit(Sender).GetTextLen;
while k <= L do begin
T := '';
for I := k to L do
if s in [#33..#172] then
T := T + s
else Break;
if T <> '' then begin
I := Pos('FILE:', UpperCase(T));
if I <= 0 then I := Pos('HTTP://', UpperCase(T));
if I <= 0 then I := Pos('LINK:', UpperCase(T));
if I <= 0 then I := Pos('WWW.', UpperCase(T));
if I = 1 then begin
if j then
begin
(sender as trichedit).Lines.Append(s);
j:= false;
end;
TRichEdit(Sender).SelStart := p+ k - 1;
TRichEdit(Sender).SelLength := Length(T);
TRichEdit(Sender).SelAttributes.Color := clBlue;
TRichEdit(Sender).SelAttributes.Style := [fsUnderline];
end;
Inc(k, Length(T));
end;
Inc(k);
end;

if not j then
begin
(sender as trichedit).SelLength:=0;
(sender as trichedit).SelStart:= p+ length(s)+2;
(sender as trichedit).SelAttributes:= (sender as trichedit).DefAttributes;
goto l1;
end;

s:= timetostr(time)+ ' '+ s;
if pos('[',s)> 0 then
begin
ss4:= extractfilepath(application.ExeName)+ 'gif/';
while length(s) > 0 do
begin
i:= pos('[',s);
if i>0 then
begin
dec(i);
ss5:= copy(s,1,i);
inc(i);
delete(s,1,i);
end else begin
ss5:= s;
s:= '';
end;
if ss5<> '' then
begin
if ss= '' then
begin
if j then
begin
(sender as trichedit).Lines.Append(ss5);
j:= false;
end else begin
(sender as trichedit).SelText:= ss5;
end;
end else begin
(sender as trichedit).SelLength:= 0;
//i:= length((sender as trichedit).Text);
i:= (sender as trichedit).GetTextLen;
if j then
begin
(sender as trichedit).Lines.Append(ss5);
j:= false;
end else begin
(sender as trichedit).SelText:= ss5;
end;
(sender as trichedit).SelStart:= i;
(sender as trichedit).SelLength:= length(ss5)+2;
f:= tfont.Create;
StringToFont(ss,f);
(sender as trichedit).SelAttributes.Name:= f.Name;
(sender as trichedit).SelAttributes.Color:= f.Color;
(sender as trichedit).SelAttributes.Size:= f.Size;
(sender as trichedit).SelAttributes.Style:= f.Style;
f.Free;
(sender as trichedit).SelLength:=0;
(sender as trichedit).SelStart:= i+ length(ss5)+2;
(sender as trichedit).SelAttributes:= (sender as trichedit).DefAttributes;
end;
end;
ss3:= ss4 + copy(s,1,pos(']',s)-1);
if fileexists(ss3) then
insertgif((sender as trichedit).Handle,ss3);

delete(s,1,pos(']',s));

end; //while
(sender as trichedit).Repaint;
end else begin
if ss= '' then
begin
(sender as trichedit).Lines.Append(s);
end else begin
(sender as trichedit).SelLength:= 0;
//i:= length((sender as trichedit).Text);
i:= (sender as trichedit).GetTextLen;
(sender as trichedit).Lines.Append(s);
(sender as trichedit).SelStart:= i;
(sender as trichedit).SelLength:= length(s)+ 2;
f:= tfont.Create;
StringToFont(ss,f);
(sender as trichedit).SelAttributes.Name:= f.Name;
(sender as trichedit).SelAttributes.Color:= f.Color;
(sender as trichedit).SelAttributes.Size:= f.Size;
(sender as trichedit).SelAttributes.Style:= f.Style;
f.Free;
(sender as trichedit).SelLength:=0;
(sender as trichedit).SelStart:= i+ length(s)+2;
(sender as trichedit).SelAttributes:= (sender as trichedit).DefAttributes;
end;
end;
l1:(sender as trichedit).Perform(EM_SCROLLCARET, 0, 0);
if is_locking then
exit;

if not checkbox1.Checked then
begin
if checkbox2.Checked then
begin
if not form12.Showing then
begin
SHOWWINDOW(form12.Handle,SW_SHOWMINNOACTIVE);
form12.Visible:= true;
flashwindow(form12.Handle,true);
end else begin
if not form12.Active then
flashwindow(form12.Handle,true);
end;
end;
end;

end;
在鼠标移动时候显示手形状
procedure TForm12.RichEdit2MouseMove(Sender: TObject; Shift: TShiftState;
X, Y: Integer);
var
I, L: Integer;
S, T: string;
vRect: TRect;
begin
FURL := '';
vRect.Left := X;
vRect.Top := Y;
X := TRichEdit(Sender).Perform(EM_CHARFROMPOS, 0,
Longint(@vRect.TopLeft)) and $0000FFFF + 1;
S := TRichEdit(Sender).Text;
L := Length(S);
if (X > L) or (X < 0) or (not (S[X] in [#33..#172])) then begin
TRichEdit(Sender).Cursor := crDefault;
Exit;
end;
T := S[X];
for I := X - 1 downto 1 do
if S in [#33..#172] then
T := S + T
else Break;
for I := X + 1 to L do
if S in [#33..#172] then
T := T + S
else Break;
I := Pos('FILE:', UpperCase(T));
if I = 0 then I := Pos('HTTP://', UpperCase(T));
if I = 0 then I := Pos('LINK:', UpperCase(T));
if I = 0 then I := Pos('WWW.', UpperCase(T));
if I <> 1 then begin
TRichEdit(Sender).Cursor := crDefault;

end else begin
FURL := T;
TRichEdit(Sender).Cursor := crHandPoint;
end;
end;

在鼠标点击时处理
procedure TForm12.RichEdit2MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if FURL <> '' then
begin
if pos('LINK:',UpperCase(furl))> 0 then
begin
load_rep_at_chat(furl);
end else begin
if pos('FILE:',UpperCase(furl))> 0 then
begin
ShellExecute(0, 'open', 'Explorer.exe', pchar('/n,/select,'+ copy(FURL,6,255)), nil, SW_SHOW);
//ShellExecute(Handle, 'EXPLORE', PChar(copy(FURL,6,255)), nil, nil, SW_SHOW);
end else begin
ShellExecute(Handle, 'open', PChar(FURL), nil, nil, SW_SHOW);
end;
end;

end;

end;
 
非常感谢,看不太懂,"{","}","HTTP:"。。。这些是哪来的啊?在用户输入数据的时候不可能还帮你弄上这些标志吧?
 
"{}"这些是我的自定义数据,你可以删除的。
http是识别网络连接的关键字。
按你说的,你应该把“http”改为你自己要加亮显示的数据如“中国”
 
你能举例说明一下你的这个程序是怎么用吗?比如在richedit中输入什么数据或是有什么数据时,某些数据高亮显示?谢谢~~
 
使用此函数来添加数据
add_to_richedit(richedit1,'http://www.spf.cn');
add_to_richedit(richedit1,'Link:产品编号');

如果你要在richedit里面直接编辑并显示高亮效果,那么把这个add_to_richedit函数里面的代码稍加修改后拷贝到change事件里去就行了。
我的代码是一个聊天程序用的,richedit是只读的,从udp控件里面读取的文字。
 
接受答案了.
 
后退
顶部