Delphi XE:TDBMemo文本消失

3
我有一个比较奇怪的问题,但我很难找到相关文档。我有一个使用Delphi内置的TDBMemo组件的Delphi程序,因为该组件需要从数据库中的字段提取数据。用户还必须能够编辑此信息,即向组件的字段添加信息。键入到字段中的文本是可见的且不会消失;然而,这不是我的问题。
该表单允许用户从列表中发布预定义评论,通过相当于由TBitButton触发的弹出窗口来访问;但是,一旦选定的文本被添加到TDBMemo中并且用户单击任何位置,所添加的值就会消失 - 再次强调,不是键入的文本。
以下是分配的代码:
var NoteString: String;
if DBMemo1.Text <> '' then 
begin
    NoteString := frmSelectNoteCodeView.GetTextfromField + ' - ' + User.ID
        + ' on ' + FormatDateTime('mm/dd/yyyy', Now);
    DBMemo1.Text := dbedComments.Text + #13#10 + NoteString;
end;

这是一个有意为之的代码片段(如果字段为空,则仅分配值)。我发布这个代码片段,因为我相信问题就在这里,也就是说,TDBMemo不能使用常规赋值?

问题在于:没有处理用户点击的事件。你有什么想法为什么发布的文本会消失吗?


6
一个TDBMemo组件是一个数据感知控件,这意味着它从连接的数据集字段获取显示数据。你正在试图绕开这个。在你的情况下,我会将数据集置于编辑模式,然后将想要的文本分配给备忘录获取其数据的字段。完成后调用Dataset.Post,或者将数据集保留在编辑模式并提示用户完成编辑并将编辑内容提交到数据集。 - MartynA
@MartynA 你应该发表一个答案 :o) - Sir Rufo
1个回答

7

正如我在评论中所说,TDBMemo是一个数据感知控件,意味着它被设置为显示数据集中关联字段的文本内容;你不能只是将一个值赋给其文本属性,因为每当TDBMemo通过其TDatalink被告知刷新自身时,它都会从字段获取文本,并覆盖您认为已经分配给它的任何内容。

我会这样做:

var 
  ADataSet : TDataSet;
begin
  ADataSet := DBMemo1.DataSource.DataSet;  //just to reduce typing
  if not (ADataSet.State in [dsInsert, dsEdit) then
    ADataSet.Edit;
 ADataSet.FieldByName(DBMemo1.FieldName).AsString := 'your text goes here';
 ADataSet.Post; 
end;

或者你可以让用户调用Post方法。

如果.Post在finally块中可能会更好。

顺便说一下,你的问题源于Delphi的数据库感知框架对数据库感知控件屏幕显示的严格控制。通常情况下,这将阻止你直接改变这些控件显示的内容;如果你想要改变数据集的数据,则改变数据集本身而不是关联控件的显示。


在提交完数据后,我需要关闭 ADataSet,比如使用 ADataSet.Close 吗? - Thomas
1
取决于您使用的数据库后端。如果它是客户端服务器类型(例如Sql Server),那么不需要,因为您可以依赖服务器将更改提交到数据库。但是,如果它是基于文件的数据库(用户直接写入数据库文件的情况),那么关闭数据集会增加实际写入数据库文件的机会。无论如何,无论您的数据库是客户端服务器还是基于文件的,当您使用完数据集时关闭它都是一个好习惯。毕竟,如果您一直在对文件进行i/o操作,您也不会让文件保持打开状态。 - MartynA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接