gpt4 book ai didi

delphi - 在运行时使用 TRichEdit 而不定义父级

转载 作者:行者123 更新时间:2023-12-03 14:34:44 28 4
gpt4 key购买 nike

我需要在运行时使用 TRichEdit 来执行 rtf 到文本的转换,如所讨论的 here 。我成功地做到了这一点,但我必须设置一个虚拟表单作为父表单,否则我无法填充 TRichedit.Lines。 (错误:父级丢失)。我将我的函数粘贴在下面,任何人都可以建议一种避免定义父级的方法吗?您也可以对此发表评论并告诉我您是否找到了更高效的想法吗?

注意:我需要一个字符串,而不是 TStrings 作为输出,这就是它被设计成这样的原因。

function RtfToText(const RTF: string;ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
MyStringStream: TStringStream;
i: integer;
CustomLineFeed: string;

begin
if ReplaceLineFeedWithSpace then
CustomLineFeed := ' '
else
CustomLineFeed := #13;
try
RTFConverter := TRichEdit.Create(nil);
try
MyStringStream := TStringStream.Create(RTF);
RTFConverter.parent := Form4; // this is the part I don't like
RTFConverter.Lines.LoadFromStream(MyStringStream);
RTFConverter.PlainText := True;
for i := 0 to RTFConverter.Lines.Count - 1 do
begin
if i < RTFConverter.Lines.Count - 1 then
Result := Result + RTFConverter.Lines[i] + CustomLineFeed
else
Result := Result + RTFConverter.Lines[i];
end;
finally
MyStringStream.Free;
end;
finally
RTFConverter.Free;
end;

end;

更新:回答后我更新了函数并写在这里供引用:

function RtfToText(const RTF: string;ReplaceLineFeedWithSpace: Boolean): string;
var
RTFConverter: TRichEdit;
MyStringStream: TStringStream;
begin
RTFConverter := TRichEdit.CreateParented(HWND_MESSAGE);
try
MyStringStream := TStringStream.Create(RTF);
try
RTFConverter.Lines.LoadFromStream(MyStringStream);
RTFConverter.PlainText := True;
RTFConverter.Lines.StrictDelimiter := True;
if ReplaceLineFeedWithSpace then
RTFConverter.Lines.Delimiter := ' '
else
RTFConverter.Lines.Delimiter := #13;
Result := RTFConverter.Lines.DelimitedText;
finally
MyStringStream.Free;
end;
finally
RTFConverter.Free;
end;
end;

最佳答案

TRichEdit 控件是 Windows 中 RichEdit 控件的包装器。 Windows 的控件是... 嗯.. Windows,它们需要一个窗口句柄才能工作。 Delphi 需要调用 CreateWindow 或 CreateWindowEx 来创建句柄,并且这两个例程都需要有效的父窗口句柄才能工作。 Delphi 尝试使用控件父级的句柄(这是有道理的!)。幸运的是,我们可以使用另一种构造函数(CreateParanted(HWND) 构造函数),并且 Microsoft 的优秀人员编写了 HWND_MESSAGE 来用作不支持该构造函数的窗口的父窗口。实际上需要一个“窗口”(仅消息传递)。

此代码按预期工作:

procedure TForm2.Button2Click(Sender: TObject);
var R:TRichEdit;
L:TStringList;
begin
R := TRichEdit.CreateParented(HWND_MESSAGE);
try
R.PlainText := False;
R.Lines.LoadFromFile('C:\Temp\text.rtf');
R.PlainText := True;

Memo1.Lines.Text := R.Lines.Text;
finally
R.Free;
end;
end;

关于delphi - 在运行时使用 TRichEdit 而不定义父级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3227899/

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