【问题标题】:TQuery state in DelphiDelphi 中的 TQuery 状态
【发布时间】:2018-03-09 21:18:13
【问题描述】:

使用TQuery.state in [dsEdit, dsInsert],我可以检查DataSet 是否处于某些给定状态。有没有办法检查它是否不在给定的状态?

我试过TQuery.state <> [dsEdit, dsInsert] 导致Incompatible types 错误和not Query.State in [dsEdit, dsInsert] 但后来我收到错误Operator not applicable to this operand type

单击此按钮时,我正在 ApplyingUpdates,当有人 deleteDataSet 记录但没有状态检查这种情况时,我也需要这样做。

【问题讨论】:

  • 您不是在寻找UpdatesPending 方法吗?不,开个玩笑,摆脱 BDE。
  • @Victoria 好像这是我的选择。他们在我的工作中使用它。
  • @Victoria,昨天我很想回答 OP 的其他关于 CachedUpdates 的问题,但对 TQuery 没有经验。它没有UpdatesPending,这就是你的意思吗?我对一些第三方 DAC 以及使用 DAC 处理 OPs 问题的方法最有经验,我知道我无法将其应用于 TQuery。
  • @Nil,对不起,我的意思是财产。不可以。此类属性存在并且应该对TQuery 公开。我的意思是没有人应该为已弃用的 BDE 寻找任何东西。多年前我在 BDE 工作了很短的时间。然而,最后一句话听起来像是 OP 想要确定更新缓存中是否有东西,因此我在帮助中搜索了该组件的方法和属性。
  • @Victoria 完全同意我怀疑 OP 想知道的内容。并且完全同意 UpdatesPending 会有所帮助。我昨天在 TQuery 的文档中找不到它,并阅读您的评论以确认它不适用于 TQuery。

标签: delphi


【解决方案1】:

当然。一种写法是

if not (Query1.State in [dsEdit, dsInsert]) then ....

您得到Operator not applicable to this operand type 错误的原因是因为Delphi 的Object Pascal 中的运算符优先级。 Not 的优先级高于 Query1.State in [...],因此当编译器看到 not Query1 时,知道 Query1 不是布尔值,它会引发 Operator not applicable ... 错误。

【讨论】:

  • 逻辑。非常感谢
  • 虽然我认为您的答案和生成的代码是正确的,但我不认为您解释它的方式是正确的。问题是枚举的一个元素和这些元素的集合无法与不等运算符进行比较。
  • @Nil。对不起,我不同意。当编译器看到not 时,它会切换到期望布尔值的状态,无论是变量引用、表达式还是其他任何东西。接下来看到的是Query1,它的类型是TQuery,而不是boolean,这就是Operator not applicable 出现的原因。这就是围绕集合成员表达式(确实返回布尔值)的原因,即如果将Query1.State in [...]作为一个整体视为否定表达式,not 在没有括号的情况下遇到的下一个标记,即Query1
  • 是的,确实如此。在同样的情况下,我也缺少括号。但是问题中没有not。它读作Query.state <> [dsEdit, dsInsert]
  • MartynA 和@KenWhite,我错了。我现在明白了。我认为在问题(Query.state <> [dsEdit, dsInsert])中生成Operator not applicable to this operand type 的代码实际上会产生另一个错误(Incompatible types)。因此,Martyn 正确推断出 OP 为遇到所述错误所做的工作。抱歉,那我投赞成票。
猜你喜欢
  • 2015-05-08
  • 2011-08-06
  • 2010-09-12
  • 2016-04-21
  • 2017-07-22
  • 2012-12-22
  • 2011-12-29
  • 1970-01-01
  • 2011-12-29
相关资源
最近更新 更多