【问题标题】:combine two or more conditions in one if statement在一个 if 语句中组合两个或多个条件
【发布时间】:2012-06-26 22:46:47
【问题描述】:

我们可以在一个 if 语句中组合两个或多个条件吗? 我知道在 C# 中,我们可以在 IF 语句中组合两个或多个条件。我们可以在 Delphi 中完成吗?

我必须检查用户是否为表单中的三个编辑控件输入了值。 感谢大家的帮助

【问题讨论】:

  • 我所知道的每种编程语言(超过 200 种)都有某种形式的布尔逻辑,包括 AND、OR 和 NOT 操作。如果你还没有看过这些,你真的需要读一本书。事实上,如果你是在 C# 中完成的,为什么不在 delphi 中尝试呢?唯一的区别是,在 Delphi 中,IF 语句并不总是需要括号。但是在进行多重相等比较时,例如应该写if (a = b) or (c = d)
  • 附加。您还需要考虑某些条件需要在括号中分组,例如 if ((a=x1) and (b=y1)) 或 ((a=x2) and (a=y2)) 然后做一些事情。

标签: delphi delphi-7


【解决方案1】:

条件语句的一般形式是:

IF "逻辑表达式" THEN ...ELSE ...

“逻辑表达式” 是任何布尔表达式。布尔表达式是可以评估为 TRUE 或 FALSE 的表达式。

可以使用比较运算符布尔运算符来构造布尔表达式。

比较运算符:

=   equals
<>  not equals
>   greater than
>=  greater than or equals
<   less than
<=  less than or equals

设置比较运算符:

=   equals
<=  returns true, if set1 is a subset of set2
>=  returns true, if set1 is a superset of set2
in  returns true, if an element is in the set

布尔运算符:

AND    logical and
OR     logical or
NOT    logical not
XOR    logical exclusive disjucntion

例子:

IF A = 10 THEN ...
IF A >= B THEN ... 
IF C or D THEN ... (Note: C and D have to be logical, i.e. TRUE or FALSE)
IF NOT E THEN ...  (Note: E has to be logical, i.e. TRUE or FALSE)

C、D、E可以替换为任意逻辑表达式,例如:

IF (edit1.text = '') OR ( ISEMPTY( edit2.text ) ) THEN ...
IF NOT checkbox1.checked THEN ...

请注意,可以使用布尔运算符从更简单的逻辑表达式构造逻辑表达式,例如:

IF ( A = 10 ) AND ( A >= B ) THEN ...
IF NOT ( ( A = 10 ) AND ( A >= B ) ) THEN ...

编写逻辑表达式的常见错误是不注意运算符优先级(哪个运算符首先计算)。布尔运算符的优先级高于比较运算符,例如:

IF A = 10 OR A >= B THEN ... 

上面是错误的,因为Delphi试图评估

10 OR A 首先,而不是

A = 10。如果 A 本身不是逻辑表达式,则会发生错误。

解决方法是使用括号,所以上面的IF...THEN...应该写成:

IF (A = 10) OR (A &gt;= B) THEN ...

对于检查3个编辑控件,条件语句变为:

IF ( Edit1.text &lt;&gt; '' ) AND ( Edit2.text &lt;&gt; '' ) AND ( Edit3.text &lt;&gt; '' ) THEN ...

注意:稍微偏离主题,但相关。来自Jedi JVCL project 的免费组件 TJvValidators、TJvValidationSummary 和 TJvErrorIndicator 提供了一个很好的验证机制。

【讨论】:

  • +1 用于解释,但请不要将关键字全部使用大写。 1950 年代是如此。
  • 我已将&lt;&gt; 添加到您的运营商列表中。
  • in应该也有,但是我不知道怎么用不到3个字来概括……
  • 我将 XOR 添加到布尔运算符
【解决方案2】:

当然。您可以执行以下操作:

if (A > 7) and (B < 13) or (C in [2, 4, 7]) then

或者对于编辑控件:

if (Edit1.Text <> '') and (Edit2.Text <> '') and (Edit3.Text <> '') then

或者,如果这是你想要的:

if (Edit1.Text = '') or (Edit2.Text = '') or (Edit3.Text = '') then

等等。

实际上阅读一本有关 Delphi 的书可能会有所帮助,例如 Delphi 语言指南,它随每个版本的 Delphi 一起提供(在帮助中,在参考部分)或can be found online

对于问题:一般情况下,您可以使用andornot 组合不同的条件。为避免运算符优先级出现问题,您通常应该将每个条件放在括号中,就像我在上面所做的那样。

【讨论】:

  • 他们也可以用括号进入一个非常复杂的语句,例如,if ((A &gt; 7) or ((B = 'abc') and not (C = 'def')) or (D &lt;&gt; 8)) and (R &gt; 8) then ...(说到&lt;&gt;就像其他语言如C#中的!=
  • 我个人在涉及逻辑操作时总是使用 ()s。这比试图在多种语言之间保持规则直接更安全。无论如何,编译器都会产生相同的代码,在不需要时使用它们并没有什么坏处。
【解决方案3】:

您必须使用AndOr 运算符来组合if sentence 中的条件

 if (Edit1.Text<>'') and (Edit2.Text<>'') and (Edit3.Text<>'') then

【讨论】:

    【解决方案4】:

    记住表达式是从左到右计算的,这一点非常重要。

    在这个例子中

    if False and SomeFunction() then
    

    SomeFunction 不会被评估。 如果你把它们转过来

    if SomeFunction() and False then
    

    SomeFunction() 将被评估。

    【讨论】:

    • 这是一个重要的答案,其他的答案都很明显。
    • 这取决于Boolean short-circuit evaluation {$B}/{$BOOLEVAL} 默认设置为OFF。但如果它设置为ONSomeFunction 将在第一个示例中进行评估。
    • @kobik 你是对的。但是,如果任何时候开发人员会启用此功能,我会追捕他并质疑他的理智。
    【解决方案5】:

    但是,如果使用“如果不是”,那么:

    如果不是 ( (edit1.Text = '2') 或 (edit2.Text = '3') ) 那么...

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 1970-01-01
      • 2011-07-12
      • 2013-12-17
      • 2019-04-10
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      相关资源
      最近更新 更多