【发布时间】:2012-11-08 22:05:10
【问题描述】:
我有一个表,我已将其设置为指针,以供其他表单使用。
此表单上有一个过程,如果 GUID 不存在,我使用 For 循环在表中创建新记录。
With Table^ do
for I := 0 to Results.result.RowCount - 1 do
begin
IndexName := 'GUID';
SetKey;
FieldByName('GUID').AsString := Results.UserDetail[I].Guid;
if not Gotokey then
begin
Insert;
etc..
end;
大多数情况下它工作得很好。但是在某些情况下,当它尝试设置密钥时,而不是表状态从 dsBrowse 到 dsSetKey 它停留在 dsBrowse ,因此我得到一个“表不在编辑模式错误”
发生这种情况的一种情况是它像 10 次一样遍历 forloop 并且工作顺利,但是在第 11 次它无法将表更改为 setkey 模式..
您对表格可能发生的情况有任何想法吗?或者为什么表格在调用 SetKey 后会停留在浏览模式?
谢谢
更新-
我也遇到了类似的情况,SetRangeStart 没有改变状态而是保持在浏览模式。我什至摆脱了表上的所有更改事件并追踪到 SetRangeStart 以确保没有其他代码运行并且它仍然没有更改状态。
同样的代码在大多数数据集上都能正常工作。所以我相信它可能与数据有关.. 有什么想法吗?
【问题讨论】:
-
SetKey可以触发 Table 上的事件,所以,您确定 Table 上没有任何事件,例如OnDataChange可能会产生将状态更改回的副作用dsBrowse? -
我刚刚验证了一些断点,并没有让 SetKey 触发我的任何事件。
-
@Trevor 这不能回答你的问题,但是,你为什么要使用 SetKey 来定位记录,你有更好的方法,比如 FindKey 和 Locate 来做这样的事情。另一方面,每次我在 Delphi 中看到状态更改失败都是由于事件中的用户代码。你确定你的事件没有被执行吗? DataSet 是否与可视控件相关联? Table是什么类?
-
很好的事件正在执行,但是我无法追踪有效案例和出错案例之间的代码执行差异。虽然它可能是什么,我只是能够追踪它。谢谢,我会考虑尝试 FindKey 或 Locate 以查看是否可以避免错误。谢谢
标签: delphi delphi-xe advantage-database-server