我有一个相当奇怪的问题,我无法找到文档。我有一个使用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一起使用?
事情就是:没有处理用户点击的事件。关于发布文本为何消失的任何想法?
答案 0 :(得分:7)
正如我在评论中所说,TDBMemo是一个数据感知控件,这意味着它被设置为在数据集中显示相关字段的文本;你不能只将一个值填充到它的text属性中,因为每当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处于最终阻止状态,可能会更好。
Btw,您的问题源于Delphi的db-aware框架对db-aware控件的屏幕显示所施加的严格控制。一般来说,这会打击你试图直接改变这些控件显示的内容;如果要更改数据集数据,请更改它,而不是关联控件显示的内容。