我读到使用Goto命令是非常糟糕的,并且会弄乱您的代码。我还读到,有一项民意测验表明,如果40%的Delphi开发人员同时看到goto命令和delphi,他们会很交叉,而另外40%的开发人员甚至都不知道goto命令,为什么呢? ?

但是无论如何,我正在制作一个程序,通过获得两个分数并获得这两个分数的平均值来检查您是否有资格获得助学金。为了获得助学金,您需要达到90%的平均水平或更高,并且它将在一个标签中显示您的平均值,如果您有资格在另一个标签中显示。我最近还了解了If命令,现在我正忙于使用它。

这是我的代码:

procedure TForm1.btnCalcClick(Sender: TObject);
var
  iMaths, iScience, iAvarage   :   integer;

begin
  iScience := sedScience.value;
  iMaths   := sedMath.value;
  iAvarage := round((iMaths+iScience)/2);

  if iMaths = 0
    then
      begin
      showmessage ('Sorry, please put a propper value in the Maths and Science box!');
    end;

    if iAvarage >= 90
     then
        begin
          lblAvarage.caption := 'Your avarage is: ' + IntToStr (iAvarage);
          lblOutput.caption := 'You qualify for an Einstein Bursary!';
        end
    else
        begin
          lblAvarage.Caption := 'Your avarage is ' + IntToStr (iAvarage);
          lblOutput.caption := 'Sorry, you do not qualify for an Einstein bursary.';
        end;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
  begin
    sedMath.value := 0;
    sedScience.value := 0;
    lblAvarage.caption := ' ';
    lblOutput.caption := ' ';
    sedMath.setfocus
  end;

end.


在我说if iMaths = 0的地方,只是确保SpinEdit中有一个值,如果没有,则必须在ButtonClick处理程序中重新启动并显示一条消息,提示Please insert a proper value。一切正常,但是它仍然在标签中显示平均值(lblOutput和lblAvarage),我不希望这样做!

如果使用goto命令,这就是我认为的样子:

procedure TForm1.btnCalcClick(Sender: TObject);
var
  iMaths, iScience, iAvarage   :   integer;
label
  lRestart;
begin
  lRestart;
  iScience := sedScience.value;
  iMaths   := sedMath.value;
  iAvarage := round((iMaths+iScience)/2);

  if iMaths and iScience = 0
    then
      begin
      showmessage ('Sorry, please put a propper value in the Maths and Science box!');
      goto lRestart;
    end;


(顺便说一句,我知道上面的代码是错误的,我试过了!)

我在goto上进行了谷歌搜索,但是发现与我需要的东西有所不同。

任何有关如何使用goto命令的帮助或建议,将不胜感激!

最佳答案

您的语法对于goto不正确。它应该是:

procedure TForm1.btnCalcClick(Sender: TObject);
....
label
  lRestart;
begin
lRestart:
  ....
  goto lRestart;
  ....
end;


但是,如果您想做这样的事情,您一定要避免这样写:goto

repeat
  // do something
until OkToContinue;




也就是说,您的代码应为:

procedure TForm1.btnCalcClick(Sender: TObject);
var
  iMaths, iScience, iAverage: integer;
begin
  iScience := sedScience.value;
  iMaths   := sedMath.value;
  iAverage := round((iMaths+iScience)/2);

  if (iMaths=0) or (iScience=0) then
  begin
    ShowMessage('Sorry, please put a propper value in the Maths and Science box!');
    exit;
  end;

  // do the calculation
end;


您的事件处理程序中无需循环或goto。发现错误时必须退出,并为用户提供纠正错误的机会,然后再次单击该按钮。因此,对您而言,您需要goto只是一个完全错误的想法。

我想您还没有完全掌握事件驱动编程的概念。如果您要回到开始而不是退出过程,则用户将没有机会修改自旋编辑控件的值,并且您将一次又一次地显示该消息。试试看,明白我的意思。

还要注意,我修复了您代码中的许多其他错误。



至于goto,我敢肯定您将永远不需要它。我只发现goto在不支持结构化异常的语言中很有用。德尔福并没有落入那个阵营。

10-07 19:21
查看更多