【问题标题】:Delphi 2006 proper use of ENDDelphi 2006正确使用END
【发布时间】:2017-10-24 09:03:41
【问题描述】:

看这段代码:

if Poruka(BM_UWARN, GetMsg('Da li zaista želite da odbijete nalog?')) = mrOk then
  begin
    tmps := TRN.ss;
    TrnPom.ss := TRN.ss;
    RadnikOdbio.l := AdresniSlog.Rabotnik;
    if Zakljucaj(1011, tmps, 3) then
      begin
        FRazlogOdbNal.ShowModal;
        case FRazlogOdbNal.ModalResult of
          mrOk:              
            BeBankComment.ss := FRazlogOdbNal.beRazlogOdbijanja.ss;              
          else
            Otkljucaj(1011, tmps, 3);
            exit;
        end;
      end;
   end;

这段代码做了什么并不重要,我需要帮助的是我在这部分代码中使用了足够的ENDs。所以第一个ENDCASE 声明。第二个END 关闭BEGINif Zakljucaj(1011,tmps,3),最后一个END 关闭BEGIN 的启动IF。这是关闭它们的正确方法吗,编译器现在 which end 是指代码的哪一部分?而且,编译器是否知道else 部分指的是case 语句? 如果没有,有没有办法明确地做到这一点?

【问题讨论】:

  • 如果您在case .. else 语句后添加一个额外的begin,编译器不会报错。
  • 是的,我现在看到了,谢谢。
  • 上面的正确注释应该是在else 之后的一个额外的复合begin/end 语句。抱歉,如果我不清楚这一点。
  • @LURD 我理解你,但感谢您的解释,它可能对某人有所帮助。

标签: delphi if-statement case delphi-2006


【解决方案1】:

您的代码在语法上是正确的。然而缩进有点偏离,你不应该缩进块的begin。 Rad Studio 自动格式化程序的默认行为是像这样对齐它们:

if Poruka(BM_UWARN, GetMsg('Da li zaista želite da odbijete nalog?')) = mrOk then
begin
  tmps := TRN.ss;
  TrnPom.ss := TRN.ss;
  RadnikOdbio.l := AdresniSlog.Rabotnik;
  if Zakljucaj(1011, tmps, 3) then
  begin
    FRazlogOdbNal.ShowModal;
    case FRazlogOdbNal.ModalResult of
      mrOk:
        BeBankComment.ss := FRazlogOdbNal.beRazlogOdbijanja.ss;
    else
      Otkljucaj(1011, tmps, 3);
      exit;
    end;
  end;
end;

您在问题中陈述的其余内容是正确的。

【讨论】:

  • 好的,谢谢。如果编译器认为else 部分来自if 而不是case 语句,我感到很困惑。再次感谢。
  • 不,不是这样的,case 之后的第一个else 将是其中的一部分,如果你在这里省略了else,编译器会遇到一个end并且知道case 已经结束了。
  • 你不应该缩进一个块的开头” - 这就像,你的意见,伙计。
  • "Rad Studio 自动格式化程序会像这样对齐它们" - 格式化是可定制的,并且取决于用户的偏好。
  • 除了 Remy 所说的,内置格式化程序仍然存在一些错误和怪癖,即使在第 n 次迭代中也是如此。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
相关资源
最近更新 更多