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

前端之家收集整理的这篇文章主要介绍了delphi – 在运行时使用TRichEdit而不定义父级前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要在运行时使用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;
原文链接:https://www.f2er.com/delphi/103271.html

猜你在找的Delphi相关文章