用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;