扩展delphi的dbrichedit(TJvRichEdit)

时间:2010-07-22 12:19:27

标签: delphi

我们正在升级我们的富文本编辑应用程序。在旧版本中只有纯文本与dbmemo,现在应该有一些格式,我想使用TJvRichEdit。

问题:数据库中已存在的文本是纯文本。 当我打开一个掩码并且不更改richEdit中的任何内容时,它仍然没有rtf格式标签的纯文本。

我需要的是:旧的纯文本应该在显示后自动转换为rtf文本。 (我的意思是,我用一个显示明文的richEdit打开一个掩码,此时应该用rtf标签增强明文并保存到数据库中。)

为此,我创建了TDBRichEdit的后代。 但是我找到一个合适的地方来解决这个问题。

目前,我已使用以下代码覆盖了setBounds方法:

procedure TMyRichEdit.SetBounds(ALeft, ATop, AWidth, AHeight: Integer);
begin
  inherited;

...
    if (assigned(DataSource)) AND (assigned(DataSource.DataSet)) AND
       (self.Text <> '') AND
       (LeftStr(sDataSource.DataSet.FieldByName(DataField).AsString, 5) <> '{\rtf') then
    begin
      self.DataSource.DataSet.Edit;
      // After a call to UpdateMemo the plaintext gets extended with the rtf tags
      self.UpdateMemo;
      self.DataSource.DataSet.Post;
      self.DataSource.DataSet.Edit;
    end;
...

end;

所以这样可行,但前提是richEdit有一个锚点集。如果不是它不起作用。 我知道这个代码的错误位置,我已经尝试覆盖更多的propper方法,但没有访问权限。 我该如何解决这样的问题? 谢谢你们!

1 个答案:

答案 0 :(得分:1)

您不需要派生新类,可以在DataSet的OnAfterScroll事件中测试和处理字段内容;

procedure TForm1.MyDataSet1AfterScroll(DataSet: TDataSet);
begin
  if LeftStr(DataSet.FieldByName('MyRTF').AsString, 5) <> '{\rtf') then begin
    DataSet.Edit;
    JvDBRichEdit1.UpdateMemo;
    DataSet.Post;
  end;
end;

老实说,我甚至没有看到有必要在每个记录曝光后立即对其进行更新。我会让他们独自一人,直到他们被编辑,测试rtf签名并在发布之前更新它们。

否则,如果您坚持使用自己的方法,并且决定使用TJvDBRichEdit,则LoadMemo将成为覆盖的好地方。但是在那里编辑可能会导致递归,因此可以将用户消息发布到所有者表单以通知已加载的编辑内容。不,不好......;)