首页 > 解决方案 > 无论实际值如何,条件始终评估为真

问题描述

我创建了一条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-statementdelphiboolean

解决方案


那是因为您首先设置bRightAnswertrue/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 <> sCode);bWrongAnswer := not bRightAnswer;或者更进一步并bWrongAnswer完全删除变量,而只not bRightAnswer在代码中的任何位置使用。

其实现在看来,bWrongAnswer反正你也用不上,拆掉应该没什么坏处。

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


推荐阅读