Delphi7:使用删除程序后格式发生变化

Delphi 7: Formatting changes after using delete procedure

我正在开发我的文本编辑器,我已经完成了,但我仍然有一个问题正在努力解决。

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

通过 属性 RichEdit1.SelAttributes.

格式化文本

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

你可以在这里看到:

如果我更改了文本某处的字符格式,然后使用此函数,格式化的字符会变回以前的格式。

你可以在这里看到:

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 上,但如果我删除删除程序,格式化工作正常,所以问题应该在那里。

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

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

您只需要 select 您希望删除的文本,然后将其删除,所有这些都在丰富的编辑控件中。这样可以避免丢失任何特定的本地格式。以这种方式进行。

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

请注意 RichEdit1.Text[i] 非常昂贵。该代码提取丰富的编辑控件的全部内容,然后挑选出一个字符。使用 SelStartSelLengthSelText 提取子字符串效率更高。

有效的字符串索引为 1Length(s)(含)。您索引超出该范围。

同样值得注意的是,当您在删除字符的文本中移动时,您会更改文本的长度。因此很容易访问超出文本末尾的部分。正如您当前的代码所做的那样。编译器范围检查选项会在您的代码中发现该错误。