【问题标题】:Condition always evaluates to true regardless of actual values无论实际值如何,条件始终评估为真
【发布时间】:2021-12-19 16:05:26
【问题描述】:

我创建了一个if 语句,当输入的代码与生成的代码匹配时,我想使用`ShowMessage() 函数输出一条消息。但是,它仍然输出“干得好!”即使是明显错误的消息。

按钮代码:

procedure TfrmCAPTCHA.btnCheckClick(Sender: TObject);
var
  sCode, sAnswer : string;
  bRightAnswer, bWrongAnswer : boolean;
begin

  {button to verify input}

  sANswer := Trim(edtAnswer.Text);
  sCode := edtCaptchaCode.Text;

  bRightAnswer := (sAnswer = sCode);
  bRightAnswer := True;

  bWrongAnswer := (sAnswer <> sCode);
  bWrongAnswer := False;

  if bRightAnswer then  
  begin
    btnCAPTCHAContinue.Show;
    Showmessage('Nicely Done, seems you''''re all set to go!' + #13 +
                'Press the continue button to collect your codes young wizzling');
  end
  else begin
    edtCAPTCHACode.clear;
    edtAnswer.clear;
    btnCAPTCHAContinue.Hide;
    Showmessage( 'That seems to be the wrong answer, please try again');
  end;
end;

【问题讨论】:

  • if sAnswer = sCode then 怎么样 - 这对你来说更有意义吗?
  • 你的问题归结为:为什么这评估为真:if true = true then Write('The answer is true); ?

标签: if-statement delphi boolean


【解决方案1】:

这是因为您首先将bRightAnswer 设置为true/false,具体取决于它是否正确,但随后您会立即用固定的true 再次覆盖它,而不管条件如何。在下一个块设置bWrongAnswerfalse 中也是如此:

  bRightAnswer := (sAnswer = sCode); 
  bRightAnswer := True;     {regardless of what it was before, it's always true now}

  bWrongAnswer := (sAnswer <> sCode);
  bWrongAnswer := False;    {regardless of what it was before, it's always false now}

删除这两行。

您可以通过将bWrongAnswer := (sAnswer &lt;&gt; sCode); 替换为bWrongAnswer := not bRightAnswer; 来进一步简化代码,或者更进一步并完全删除bWrongAnswer 变量,而只在代码中的所有位置使用not bRightAnswer

其实现在看来,反正你连bWrongAnswer都用不上,所以去掉应该没什么坏处吧。

如果您愿意,也可以删除 bRightAnswer 并将 if bRightAnswer then 直接替换为 if sAnswer = sCode then

【讨论】:

  • 请注意,您可以完全删除“bWrongAnswer”,因为它等于“not bRightAnswer”。
  • 由于bWrongAnswer 未在任何地方使用,因此无论如何都可以忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2017-12-18
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多