【问题标题】:Filling a RichEdit from an external procedure从外部过程填充 RichEdit
【发布时间】:2019-03-27 22:13:54
【问题描述】:

我编写了一个根据输入填充 RichEdit 组件的过程。

procedure LoadCPData(ResName: String);
begin
  ResName := AnsiLowercase(ResName) + '_data';
  rs := TResourceStream.Create(hInstance, ResName, RT_RCDATA);
  try
    rs.Position := 0;
    info.reMeta.Lines.LoadFromStream(rs);
  finally
    rs.Free;
  end;
end;

注意:上述过程存储在名为 Functions 的外部 .pas 文件中。

当我在表单中调用该过程时,RichEdit 仍然为空。但是,如果我将该代码块放在表单本身中,RichEdit 组件会按预期填充数据而不会出现问题。现在我可以将上面的代码块放在表单本身中,但我计划在case 语句中多次使用该过程。

为了使我的程序起作用,我需要包括什么?

谢谢你!

【问题讨论】:

  • 您正在加载的外部文件是有效的 RTF 文件吗?我之所以问是因为我加载 RTF 的方式与您在代码中显示的略有不同,而且它始终对我有用——而且代码位于一个单独的单元中。
  • 是的,我确信它应该是一个有效的 RTF 文件,因为我已经让它在内部加载。但是你说的有效是什么意思?你可以分享你的代码吗?
  • 我会发布我所做的,尽管它与您所做的非常相似......不过我确实添加了更多内容。也许他们会成功。

标签: delphi delphi-xe richedit


【解决方案1】:

我们使用TJvRichEdit 控件而不是TRichEdit,以便我们可以支持嵌入的OLE 对象。这应该与TRichEdit 非常相似。

procedure SetRTFData(RTFControl: TRichEdit; FileName: string);
var
  ms: TMemoryStream;
begin
  ms := TMemoryStream.Create;
  try
    ms.LoadFromFile(FileName);
    ms.Position := 0;
    RTFControl.StreamFormat := sfRichText;
    RTFControl.Lines.LoadFromStream(ms);
    ms.Clear;

    RTFControl.Invalidate;

    // Invalidate only works if the control is visible.  If it is not visible, then the
    // content won't render -- so you have to send the paint message to the control
    // yourself.  This is only needed if you want to 'save' the content after loading
    // it, which won't work unless it has been successfully rendered at least once.
    RTFControl.Perform(WM_PAINT, 0, 0);
  finally
    FreeAndNil(ms);
  end;
end;

我从另一个例程中改编了这个,所以它不是我们使用的完全相同的方法。我们从数据库流式传输内容,因此我们从不从文件中读取。但是我们确实将字符串写入内存流以将其加载到 RTF 控件中,所以这本质上是做同样的事情。

【讨论】:

  • 正如您的评论所说,Invalidate 仅在控件可见时才有效,而send a paint message 的方法不是调用WMPaint;它是SendMessagePostMessageRTFControl.Handle 或使用RTFControl.Perform。您还可以使用PaintMsg,它没有在您的代码中的任何地方定义。您发布的内容中有一半是无效或不正确的代码或 cmets。
  • 您的编辑有所帮助,但您仍然做错了。您确实直接致电WMPaint;您可以使用PostMessageSendMessageWM_PAINT 消息发布或发送到控件,或者只使用RTFControl.Perform(WM_Paint, 0, 0),这就是您的PaintMsg 所能做的。这也不是解决问题的方法。
  • 所问的问题是,将 RTF 加载到控件中的代码是否可以在单独的单元中。它适用于我使用的代码,并且 OP 要求查看该代码...
  • 原来我在WMPaint() 做的额外事情与OP的问题无关,所以我简化了这个例子。感谢您的 cmets @KenWhite
  • 感谢 James,但我不确定我是否拥有 TJvRichdit 组件。这是基础组件还是第三方?
猜你喜欢
  • 1970-01-01
  • 2021-12-10
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多