Delphi 7:使用删除过程后格式化更改

时间:2015-05-17 17:51:05

标签: delphi formatting string-formatting richedit

我正在处理我已经完成的文本编辑器,但我仍然遇到了这个问题,我试图解决这个问题。

我的问题是,我想删除行尾的特定符号,这些符号是通过按下速度按钮(按钮向下)创建的。因此,当我再次单击按钮(按钮已启动)时,我想删除它们,这有效,但我的文本格式有问题。

文本通过属性RichEdit1.SelAttributes格式化。

如果我在RichEdit中更改第一个字符的格式,然后我使用此功能,则整个文本将更改为与此字符相同的格式。

你可以在这里看到:

screenshot

如果我在文本中的某处更改了字符的格式,然后我使用此功能,则格式化字符将更改回以前的格式。

你可以在这里看到:

screenshot

if (Button.Down=false) and (length(RichEdit1.Text)<>0) then begin                  
  for i:=0 to length(RichEdit1.text) do begin

  if RichEdit1.Text[i] = '¶' then begin                                               
    txt:=RichEdit1.text;
    delete(txt, i, 1);
    RichEdit1.Text:=txt;
  end;
  end;
RichEdit1.SelStart:=length(RichEdit1.Text);

我已经想过,问题可能是变量txt,但如果我拿走删除程序,格式化工作正常,那么问题就在那里。

这项工作已经完成,所以我不想对代码进行任何更改,我只是想知道为什么会发生这种情况以及可能的解决方案。

1 个答案:

答案 0 :(得分:3)

使用Text属性提取整个文本,修改该字符串,然后替换整个文本。当您这样做时,所有新文本都将被赋予选定的格式属性。

您需要在富编辑控件中选择您要删除的文本,然后将其删除。这可以避免丢失任何特定的本地格式。以这种方式这样做。

RichEdit1.SelStart := i;
RichEdit1.SelLength := 1;
RichEdit1.ClearSelection;

请注意RichEdit1.Text[i]非常昂贵。该代码提取富编辑控件的整个内容,然后选择一个字符。使用SelStartSelLength以及SelText提取子字符串效率更高。

有效字符串索引为1Length(s),包括signup。您在该范围之外进行索引。

还值得注意的是,当您浏览文本删除字符时,您可以更改文本的长度。因此,在文本末尾之外访问很容易。确实,你当前的代码确实如此。编译器范围检查选项会在代码中发现错误。