Delphi/Pascal 的正确结构语法 if then begin end and ;

Proper structure syntax for Delphi/Pascal if then begin end and ;

自从我上次不得不用 Pascal 编写代码以来,已经有大约 20 年了。我似乎无法在使用 beginend 嵌套 if then 块的地方正确使用语言的结构元素。例如,这让我得到一个编译器错误 "Identifier Expected".

procedure InitializeWizard;
begin
  Log('Initialize Wizard');
  if IsAdminLoggedOn then begin
    SetupUserGroup();
    SomeOtherProcedure();
  else begin (*Identifier Expected*)
    Log('User is not an administrator.');
    msgbox('The current user is not administrator.', mbInformation, MB_OK);
    end  
  end;
end;

当然,如果我删除 if then 块和与它们关联的 begin end 块,那么一切都可以。

有时我会正确地理解这种语法并且它运行良好,但是当嵌套 if then else 块时问题变得更加严重。

解决问题还不够。我想更好地了解如何使用这些块。我显然缺少一个概念。来自 C++ 或 C# 的某些东西可能从我脑海的另一部分悄悄进入并扰乱了我的理解。我已经阅读了几篇关于它的文章,我认为我理解它,但我不理解。

您必须将每个 begin 与同一级别的 end 匹配,例如

if Condition then
begin
  DoSomething;
end
else
begin
  DoADifferentThing;
end;

如果您愿意,可以在不影响布局的情况下缩短使用的行数。 (不过,当您第一次习惯语法时,上面的内容可能会更容易。)

if Condition then begin
  DoSomething
end else begin
  DoADifferentThing;
end;

如果您正在执行单个语句,则 begin..end 是可选的。请注意,第一个条件不包含终止 ;,因为您尚未结束语句:

if Condition then
  DoSomething
else
  DoADifferentThing;

分号在块的最后一个语句中是可选的(尽管我通常会在它是可选的时候包含它,以避免将来添加一行时忘记同时更新前一行时出现问题)。

if Condition then
begin
  DoSomething;            // Semicolon required here
  DoSomethingElse;        // Semicolon optional here
end;                      // Semicolon required here unless the
                          // next line is another 'end'.

您也可以组合单个和多个语句块:

if Condition then
begin
  DoSomething;
  DoSomethingElse;
end
else
  DoADifferentThing;

if Condition then
  DoSomething
else
begin
  DoADifferentThing;
  DoAnotherDifferentThing;
end;

代码的正确用法是:

procedure InitializeWizard;
begin
  Log('Initialize Wizard');
  if IsAdminLoggedOn then 
  begin
    SetupUserGroup();
    SomeOtherProcedure();
  end 
  else 
  begin 
    Log('User is not an administrator.');
    msgbox('The current user is not administrator.', mbInformation, MB_OK);
  end;
end;