procedure SubScript(var RichEdit:TRichEdit); //设置下标
begin
If Pos('$$$',RichEdit.Text)<>0 Then
Begin
RichEdit.Font.Size:=12;
RichEdit.SelStart:=Pos('$$$',RichEdit.Text)+Length('$$$')-1;
RichEdit.SelLength:=Pos('@@@',RichEdit.Text)-Length('$$$')-Pos('$$$',RichEdit.Text);
RichEdit.SelAttributes.Size:=9;
RichEdit.SelStart:=Pos('$$$',RichEdit.Text)-1; //剪切掉'$$$'
Richedit.SelLength:=Length('$$$');
RichEdit.ClearSelection;
RichEdit.SelStart:=Pos('@@@',RichEdit.Text)-1; //剪切掉'@@@'
Richedit.SelLength:=Length('@@@');
RichEdit.ClearSelection;
if Pos('$$$',RichEdit.Text)<>0 then
SubScript(RichEdit);
end;
end;
在RichEdit的Text把$$$和@@@中间的字符变成下标(然后去掉他们),怎么老是死机,提示栈满请大虾们帮帮忙
begin
If Pos('$$$',RichEdit.Text)<>0 Then
Begin
RichEdit.Font.Size:=12;
RichEdit.SelStart:=Pos('$$$',RichEdit.Text)+Length('$$$')-1;
RichEdit.SelLength:=Pos('@@@',RichEdit.Text)-Length('$$$')-Pos('$$$',RichEdit.Text);
RichEdit.SelAttributes.Size:=9;
RichEdit.SelStart:=Pos('$$$',RichEdit.Text)-1; //剪切掉'$$$'
Richedit.SelLength:=Length('$$$');
RichEdit.ClearSelection;
RichEdit.SelStart:=Pos('@@@',RichEdit.Text)-1; //剪切掉'@@@'
Richedit.SelLength:=Length('@@@');
RichEdit.ClearSelection;
if Pos('$$$',RichEdit.Text)<>0 then
SubScript(RichEdit);
end;
end;
在RichEdit的Text把$$$和@@@中间的字符变成下标(然后去掉他们),怎么老是死机,提示栈满请大虾们帮帮忙
如果richedit的内容有太多的$$$,那么SubScript会一直嵌套调用下去,而函数每调用一次就会占用一下堆栈。而堆栈的空间是有限的,虽然可以在options中设置堆栈大小,不过这样的调用方法就是设置的再大也有不够的时候。建议楼主使用while循环,估计能够解决问题。
另外,Pos('$$$',RichEdit.Text) 判断,如果内容太多是否效率会太低了。不如使用临时变量扫描吧。