我正在处理我已经完成的文本编辑器,但我仍然遇到了这个问题,我试图解决这个问题。
我的问题是,我想删除行尾的特定符号,这些符号是通过按下速度按钮(按钮向下)创建的。因此,当我再次单击按钮(按钮已启动)时,我想删除它们,这有效,但我的文本格式有问题。
文本通过属性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
,但如果我拿走删除程序,格式化工作正常,那么问题就在那里。
这项工作已经完成,所以我不想对代码进行任何更改,我只是想知道为什么会发生这种情况以及可能的解决方案。
答案 0 :(得分:3)
使用Text
属性提取整个文本,修改该字符串,然后替换整个文本。当您这样做时,所有新文本都将被赋予选定的格式属性。
您需要在富编辑控件中选择您要删除的文本,然后将其删除。这可以避免丢失任何特定的本地格式。以这种方式这样做。
RichEdit1.SelStart := i;
RichEdit1.SelLength := 1;
RichEdit1.ClearSelection;
请注意RichEdit1.Text[i]
非常昂贵。该代码提取富编辑控件的整个内容,然后选择一个字符。使用SelStart
和SelLength
以及SelText
提取子字符串效率更高。
有效字符串索引为1
到Length(s)
,包括signup
。您在该范围之外进行索引。
还值得注意的是,当您浏览文本删除字符时,您可以更改文本的长度。因此,在文本末尾之外访问很容易。确实,你当前的代码确实如此。编译器范围检查选项会在代码中发现错误。