为什么会出现 "Variable Expected" 编译器错误?

Why do I get "Variable Expected" compiler error?

我正在尝试获取 Inno Setup 中安装路径的驱动器盘符而不带冒号,如果驱动器盘符是 C,它将 return 一个空字符串。

调用函数:

{code:GetDriveLetter|{drive:{src}}

函数:

function GetDriveLetter(DriveLetter: string): string;
var
  len: Integer;
begin
  len := CompareText(UpperCase(DriveLetter), 'C');
  if len = 0 then
  begin
    Result := '';
  end
  else
  begin
    Result := Delete(UpperCase(DriveLetter), 2, 1);
  end;
end;

我收到编译器错误:

Variable Expected

这一行:

Result := Delete(UpperCase(DriveLetter), 2, 1);

那条线有什么问题?我该如何修复这个功能?

也许你想要这样的东西?

[Code]
function GetDriveLetter(DriveLetter: string): string;
begin
if CompareStr(DriveLetter, 'C:\') = 0 then
  begin   
    Result := '';
  end
  else begin
    Result := Copy(DriveLetter, 1, 1);
  end
end;

但是您的示例不是针对安装路径而是针对安装程序源路径...

你得到的 Variable Expected 编译器错误是因为 Delete 是一个过程,你应该将声明的 string 类型变量(这是然后内部修改)。而且您传递的不是变量,而是 UpperCase 函数调用的中间结果。因此,要修复此错误,您可以声明一个变量,或使用预先声明的 Result 变量,例如:

var
  S: string;
begin
  S := UpperCase('a');
  Delete(S, 2, 1);
end;

除了我要指出的几件事。 Delete 是一个 procedure,因此 return 没有任何值,所以即使你向那里传递一个声明的变量,你也会在不存在的结果赋值上失败. CompareText 函数已经是不区分大小写的比较,因此不需要大写输入。除了我不会比较整个输入(例如 C: 作为 return 由 drive: 常量编辑),而只是第一个字符(但这取决于你想要的安全程度使你的功能)。对于第一个字符比较,我会这样写:

[Code]
function GetDriveLetter(Drive: string): string;
begin
  // we will upper case the first letter of the Drive parameter (if that parameter is
  // empty, we'll get an empty result)
  Result := UpperCase(Copy(Drive, 1, 1));
  // now check if the previous operation succeeded and we have in our Result variable
  // exactly 1 char and if we have, check if that char is the one for which we want to
  // return an empty string; if that is so, return an empty string
  if (Length(Result) = 1) and (Result[1] = 'C') then
    Result := '';
end;