gpt4 book ai didi

delphi - 在 TRichEdit 中加载长 RTF 文本不起作用

转载 作者:行者123 更新时间:2023-12-03 15:08:50 26 4
gpt4 key购买 nike

如果将长 RTF 序列(例如 150 000 个字符)流式传输到 TRichEdit 控件(在 XE4 中),则该控件不会显示文本,而是显示原始 RTF 代码:

{\rtf1\ansi\ansicpg1252\deff0...

出了什么问题?

procedure TForm1.Button1Click(Sender: TObject);
var
RtfText: string;
Stream: TStringStream;
begin
RtfText := GenerateRtfText();

Stream := TStringStream.Create(RtfText);
try
RichEdit2.PlainText := False;
RichEdit2.Lines.LoadFromStream(Stream); //<--- ERROR: RichEdit displays raw RTF-Code
// if RtfText is too long
if StartsText('{\rtf', RichEdit2.Lines.Text) then
begin
ShowMessage('Oh no, not converted!');
//WORKAROUND: 2nd try seems to work...
//Stream.Position := 0;
//RichEdit2.Lines.LoadFromStream(Stream);
end;
finally
Stream.Free;
end;
end;

例如使用以下 RTF 生成函数:

function TForm1.GenerateRtfText: string;
var
I: Integer;
Stream: TStringStream;
const
DOES_WORK_COUNT = 10000;
DOES_NOT_WORK_COUNT = 15000;
begin
//Fill
RichEdit1.Lines.BeginUpdate;
try
//for I := 0 to DOES_WORK_COUNT do
for I := 0 to DOES_NOT_WORK_COUNT do
RichEdit1.Lines.Add(IntToStr(I));
finally
RichEdit1.Lines.EndUpdate;
end;
//Convert to RTF
Stream := TStringStream.Create;
try
RichEdit1.Lines.SaveToStream(Stream);
Result := Stream.DataString;
finally
Stream.Free;
end;
end;

已编辑:即使复制和粘贴也无法正常工作:

这就是我所做的:

  • 我将 RichEdit1 生成的内容(第 1..15000 行,数字 1..15000)复制到 notpad.exe 中以删除任何 RTF
  • 我将记事本的内容复制到RichEdit2中

结果:

  • 仅正确显示 12773 行。最后一行只有12
  • 如果我尝试将另一个字符添加到 TRichEdit 中,则不会发生任何事情
  • 如果我删除 10 个字符(每个退格键),我可以在之后添加正好 10 个字符...

TRichEdit 是否有隐藏字符限制?

最佳答案

丰富的编辑控件有文本限制。

尝试使用EM_EXLIMITTEXT消息,它设置用户可以键入或粘贴到丰富编辑控件中的文本量的上限。此消息还会限制在流式传输 RTF 时可以流式传输到丰富编辑控件中的文本量 (PlainText = False)。但不限制流式传输纯文本时的控制。

例如:

const
RE_MAX_TEXT_SIZE = 256000;

SendMessage(RichEdit1.Handle, EM_EXLIMITTEXT, 0, RE_MAX_TEXT_SIZE);

或者:

SendMessage(RichEdit1.Handle, EM_EXLIMITTEXT, 0, $7FFFFFF0);

对于 TRichEditStrings.LoadFromFile() 中实现的最大限制:RichEdit.DoSetMaxLength($7FFFFFF0);但是,DoSetMaxLength() 在源中未正确使用,因为它应该在加载流之前调用。此外,TRichEditStrings.LoadFromStream() 根本不使用 DoSetMaxLength()。雷米mentioned this在他的答案的评论中。

关于delphi - 在 TRichEdit 中加载长 RTF 文本不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43679369/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com