字符如何匹配? ( 积分: 50 )

  • 主题发起人 主题发起人 yyacc
  • 开始时间 开始时间
Y

yyacc

Unregistered / Unconfirmed
GUEST, unregistred user!
是这样,在一个synedit控件当中要实现以下功能:
在文字当中有符合某种条件的字符时要进行背景变色处理.
这里所谓的符合某种条件是指自己设定的能进行匹配的字符.比如'///begin''///end;'这二个字符之间的所有行背景变色.
效果: //只要上下有这二个字符的所有行背景变色.
///begin
asdfsdfsdfsdfsdfasdf
asdfsdfsadfsdfsdfdsfsdfsdf
sdfsdfasdf
///end;
 
在线等,回答了立马散分.
 
怎么没有人会吗?>
我是这样写的,
var
i,j,k,PosReturn,LastReturn:integer;
a1,b1:TColor;
begin
for i:=0 to synedit1.Lines.Count do //首先找到第一个字符
begin
PosReturn:=pos('///begin',synedit1.Lines);
if PosReturn<>0 then
for k:=0 to synedit1.Lines.Count do //接下来找与之匹配的字符
begin
LastReturn:=pos('///end;',synedit1.Lines[k]);
if LastReturn<>0 then //当与之匹配的字符存在时,对这二个字符之间的行进行循环变色.
for j:=k downto i do
begin
synedit1.SetLineColor(j,clBlack, clSilver);
SynEdit1.GetLineColor(j,a1,b1);
end;
end;
end;
end;
可是这样写的结果是这样的.

///begin //这二个字符当中的二行变色了.
asdfsdfsdfsdfsdfasdf
adfasdfasdf
///end;
asdf //这三行是不允许变得,可是也变了.怎么办?????
sdf
sdf
///begin //这二个字符当中的三行变色了.
asdf
sdf
sd
//end;
 
有没有人再给我提供个思路呢
 
已知一个错误:

for k:=0 to synedit1.Lines.Count do //接下来找与之匹配的字符
应该为:
for k:=i to synedit1.Lines.Count do
 
jenhon:你说得对,这算是个错误.
按照你写的这个它可以少循环一些没有用的行.
速度上可以快点.谢谢.
可是还是不能解决此问题.
不过现在我字符后面都给了它一个唯一的标识符,这样我可以用这个标识符来判断下一个是否匹配了.不过这也是权宜之计.各位如果有什么好的办法还请发表一下.在下不胜感激.
 
建议你用栈来写!
 
在变色结束后还要再调用 synedit1.SetLineColor 一次来恢复原先的颜色。
 
省略synEdit,如果确定每个///begin都有///end,那么

var
I: Integer;
begin
I := 0;
while I < Lines.Count do
begin
if Pos('///begin', Lines) <> 0 then //找到开始标志
begin
Inc(I); //进入下一行,开始变色
repeat //变色,直到找到结束标志
SetLineColor(j,clBlack, clSilver);
Inc(I);
until Pos('///end', Lines) <> 0;
end
else Inc(I); //没有开始标志就进入下一行
end;
end;

如果不是每个///begin 都有对应的///end,那么再设个变量先找///end的位置,如果在///end之前又找到一个///begin,则重新定位///begin,如果找到///end,则改变两者之间的颜色,反之亦然
 

Similar threads

回复
0
查看
866
不得闲
回复
0
查看
1K
不得闲
回复
0
查看
818
不得闲
D
回复
0
查看
848
DelphiTeacher的专栏
D
后退
顶部