如何在TDBGrid中显示富文本?

时间:2009-09-17 14:22:09

标签: delphi rtf

我有一个包含RTF字段的表。

如何在TDBGrid中显示它,以便它实际显示富文本,而不仅仅是列中的(FMTMEMO)?

我真的不想为此使用第三方组件。

谢谢!

4 个答案:

答案 0 :(得分:5)

我不知道这是否可以转移到您的情况,但我曾经使用OwnerDrawing来获取富文本。如果这是一个选项,请查看单位DrawRichText中的DrawRtfText。

答案 1 :(得分:2)

Delphi没有内置组件可以做到这一点。

有很多外部组件可以做到。

一个简单的谷歌查询list就足够了。

- 的Jeroen

答案 2 :(得分:2)

我为你做了一个非常粗略的例子,然后你可以根据需要尝试改进。

将TDBRichEdit控件拖放到窗体上,并将其Visible属性设置为False。设置DataSource和DataField属性以选取适当的字段。

假设包含RTF文本的字段名称称为“RTF”:

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
  if (gdFocused in State) then
  begin
    if (Column.Field.FieldName = 'RTF') then
    with DBRichEdit1 do
    begin
      Left := Rect.Left + DBGrid1.Left + 1;
      Top := Rect.Top + DBGrid1.Top + 1;

      Visible := True;
    end;
  end;
end;

procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if DBGrid1.SelectedField.FieldName = 'RTF' then
   DBRichEdit1.Visible := False;
end;

当您单击网格中的列时,这将在弹出窗口中显示完整的格式化richedit文本。单击时,它会隐藏弹出窗口。

答案 3 :(得分:0)

如果您只想要列中的文本,那么最简单的方法是将计算字段添加到String类型的数据集中,使其达到合理的长度(例如80),并在数据集的onCalculate事件中拉出纯文本从RTF字段到字符串字段。使用字符串字段显示而不是RTF字段。

如果你想要所有格式化,那么这会变得有点棘手,因为除了TRichEdit和后代之外没有默认组件支持渲染RTF数据,后者是Microsoft控件的包装器。您将不得不自己进行大量的RTF解析,并使用OnDrawDataCell事件将文本绘制到单元格中。如果采用这种方法,那么RTF specifications document将会有很大的帮助。