如何在TMemo或TRichedit控件中实现超链接文字显示?(180分)

  • 主题发起人 主题发起人 png
  • 开始时间 开始时间
P

png

Unregistered / Unconfirmed
GUEST, unregistred user!
类似Foxmail中的效果,最好不要第三方控件
 
读一下Rxlib中一个控件的源代码,自己做个,不就不是第三方控件了吗?
 
我问的问题好像太简单了,我接着问几个问题在结束,二位没意见吧!
 
不是很简单,要做好这个也是很麻烦的!
 
我的问题来了:

我现在正在写邮件客户端,我想封装一个类出来,还要利用线程,那么....
方法1:
封装成线程,为其添加事件响应(可行吗?) ,但是由于对线程的控制只是运行、
挂起、再恢复,不够灵活。

方法2:
封装成类(用基类还是TObject?),在类中定义一个线程类(可以做到吗),
也提供事件响应(如当前接收字节数,当前提交的命令,错误的口令等),还包
含一个Form(可以吗),用于显示进度信息,也可以隐藏。

以上两种方案哪种更好?
显示状态信息,也可以隐藏。
 
请问哪里有Rxlib?
 
是啊,分析一个链接好麻烦的,这是freenet控件中包的一个显示邮件内容的控件的代码
,在程序员大本营光盘中可以找到。在显示一个链接时是用判断http://这样来做,然后再在这行字的下面画一条线。
procedure TStringsViewer.PaintCanvas(Sender: TObject);
var
line,x,y,z,maxl,tx,t: integer;
i,j: integer;
ocb,ocf: TColor;
ofs: TFontStyles;
ps,s: string;
Switched: Boolean;
begin
for i:=1 to NumLinks do FreeMem(Links,Sizeof(TSVLink));
NumLinks:=0;
if (MkL1<MkL0) or ((MkL1=MkL0) and (Mkc1<Mkc0)) then
begin
t:=MkL0;
MkL0:=MkL1;
MkL1:=t;
t:=Mkc0;
Mkc0:=Mkc1;
Mkc1:=t;
Switched:=True;
end
else Switched:=False;
with Graphic.Canvas do
begin
Font.Assign(FFont);
Brush.Color:=FColor;
Line:=VScrollBar.Position;
y:=0;
z:=0;
x:=-HScrollBar.Position*fdx;
maxl:=0;
while (Line<FLines.Count) and (y<Graphic.Height) do
begin
s:=Lines[Line];
if not (CanMark or Marked) then TabbedTextOut(Graphic.Canvas.Handle,x,y,@s[1],Length(s),0,z,0)
else
begin
if (Line<MkL0) or (Line>MkL1) then
TabbedTextOut(Graphic.Canvas.Handle,x,y,@s[1],Length(s),0,z,0);
tx:=x;
if Line=MkL0 then
begin
if MkL1=Line then
begin
ps:=Copy(s,1,Mkc0-1);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
Inc(tx,LOWORD(GetTabbedTextExtent(Graphic.Canvas.Handle,@ps[1],
Length(ps),0,z)));
ocb:=Brush.Color;
ocf:=Font.Color;
Brush.Color:=clHighlight;
Font.Color:=clHighlightText;
ps:=Copy(s,Mkc0,Mkc1-Mkc0);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
Inc(tx,LOWORD(GetTabbedTextExtent(Graphic.Canvas.Handle,@ps[1],
Length(ps),0,z)));
Brush.Color:=ocb;
Font.Color:=ocf;
ps:=Copy(s,Mkc1,999);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
end
else
begin
ps:=Copy(s,1,Mkc0-1);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
Inc(tx,LOWORD(GetTabbedTextExtent(Graphic.Canvas.Handle,@ps[1],
Length(ps),0,z)));
ocb:=Brush.Color;
ocf:=Font.Color;
Brush.Color:=clHighlight;
Font.Color:=clHighlightText;
ps:=Copy(s,Mkc0,999);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
Brush.Color:=ocb;
Font.Color:=ocf;
end;
end;
if (Line>MkL0) and (Line<MkL1) then
begin
ocb:=Brush.Color;
ocf:=Font.Color;
Brush.Color:=clHighlight;
Font.Color:=clHighlightText;
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@s[1],Length(s),0,z,0);
Brush.Color:=ocb;
Font.Color:=ocf;
end;
if ((Line=MkL1) and (Line<>MkL0)) then
begin
ocb:=Brush.Color;
ocf:=Font.Color;
Brush.Color:=clHighlight;
Font.Color:=clHighlightText;
ps:=Copy(s,1,Mkc1);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
Inc(tx,LOWORD(GetTabbedTextExtent(Graphic.Canvas.Handle,@ps[1],Length(ps),0,z)));
Brush.Color:=ocb;
Font.Color:=ocf;
ps:=Copy(s,Mkc1+1,999);
TabbedTextOut(Graphic.Canvas.Handle,tx,y,@ps[1],Length(ps),0,z,0);
end;
end;
{draw link}
s:=Lines[Line];
tx:=x;
while Pos('http://',s)<>0 do
begin
i:=Pos('http://',s);
ps:=Copy(s,1,i-1);
Inc(tx,LOWORD(GetTabbedTextExtent(Graphic.Canvas.Handle,@ps[1],Length(ps),0,z)));
Delete(s,1,i-1);
i:=Pos(' ',s);
j:=Pos(#9,s);
if (j<>0) and ((j<i) or(i=0)) then i:=j;
if i=0 then i:=Length(s)+1;
ps:=Copy(s,1,i-1);
ocb:=Font.Color;
Font.color:=clBlue;
ofs:=Font.Style;
Font.Style:=[fsUnderline];
TextOut(tx,y,ps);
Inc(NumLinks);
GetMem(Links[NumLinks],Sizeof(TSVLink));
Links[NumLinks]^.Link:=ps;
Links[NumLinks]^.X0:=tx;
Links[NumLinks]^.Y0:=y;
Inc(tx,TextWidth(ps));
Links[NumLinks]^.X1:=tx;
Links[NumLinks]^.Y1:=y+fdy;
Font.Color:=ocb;
Font.Style:=ofs;
Delete(s,1,i-1);
end;
if Length(s)>maxl then maxl:=Length(s);
Inc(y,fdy);
Inc(Line);
end;
HScrollBar.Max:=maxl;
end;
if Switched then
begin
t:=MkL0;
MkL0:=MkL1;
MkL1:=t;
t:=Mkc0;
Mkc0:=Mkc1;
Mkc1:=t;
end;
end;

 
to wjiachun:
我应该怎样实现 当我点击该超链接时,然后执行某段代码。即 OnURLClick 的事件如何
定义。
 
to :杜成福
rxrichedit有个 urlclick事件的,你所点击的url在这事件中可以取得,然后要执行
代码之类的可以自己写
uses shllapi;
procedure TForm1.RxRichEdit1URLClick(Sender: TObject;
const URLText: String; Button: TMouseButton);
begin
shellexecute(handle,'open',pchar(urltext),'','',sw_show); //urltext就是那个url
end;
 
是这样的,我不想用 rxrichedit ,所以我从 TRichEdit 中继承了一个类,我也在其中
添加了 OnURLClick 的事件,但当我点击超链接时不会执行我在 OnURLClick 中的代码。
怎么办?
 
我的问题来了:…………

都可以!!!还有DLL!
 
to gcq :
通信和参数传递很麻烦吧?
 
为什么会麻烦?和你在PROJECT里定义几乎一样!
 
为什么不试试用twebbrowser组件呢?你所需要的功能都有呀!
 
接受答案了.
 
后退
顶部