为什么会出现 "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;
我正在尝试获取 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;