我们正在升级我们的富文本编辑应用程序。在旧版本中只有纯文本与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方法,但没有访问权限。 我该如何解决这样的问题? 谢谢你们!
答案 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
将成为覆盖的好地方。但是在那里编辑可能会导致递归,因此可以将用户消息发布到所有者表单以通知已加载的编辑内容。不,不好......;)