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把$$$和@@@中间的字符变成下标(然后去掉他们),怎么老是死机,提示栈满请大虾们帮帮忙

解决方案 »

  1.   

    应该是由于SubScript嵌套调用导致。
    如果richedit的内容有太多的$$$,那么SubScript会一直嵌套调用下去,而函数每调用一次就会占用一下堆栈。而堆栈的空间是有限的,虽然可以在options中设置堆栈大小,不过这样的调用方法就是设置的再大也有不够的时候。建议楼主使用while循环,估计能够解决问题。
    另外,Pos('$$$',RichEdit.Text) 判断,如果内容太多是否效率会太低了。不如使用临时变量扫描吧。
      

  2.   

    因为进入了死循环,总是检测到Pos('$$$',RichEdit.Text) <>0,因为不知道你RichEdit.Text的具体内容,所以不知是如何产生的死循环,建议删除字符时,从后向前删,不要从前向后删,否则每删除一个字符时,后面字符的位置就变了,很容易产生问题
      

  3.   

    你把引起死机的RichEdit.Text贴出来