因此,给定此功能,我得到错误"标识符预期"在GetRoot := ROOTPage.Values[0];
行。我希望它告诉我ROOTPage
没有定义?
const
DefaultRoot = 'C:\IAmGRoot';
Var
ROOTPage : TInputQueryWizardPage;
procedure SetupRoot;
begin
ROOTPage := CreateInputQueryPage(wpUserInfo,
ExpandConstant('{cm:RootTitle}'),
ExpandConstant('{cm:RootInstructions}'),
ExpandConstant('{cm:RootDescription}') + ' "' + DefaultRoot + '"'
);
ROOTPage.Add(ExpandConstant('{cm:SSRoot}') + ':', False);
ROOTPage.Values[0] := ExpandConstant('{DefaultRoot}');
// add SSROOT to path
end;
function GetRoot : string;
begin
GetRoot := ROOTPage.Values[0];
end;
我该如何解释这个错误。 Pascal中的标识符是什么?
这个page告诉我标识符是变量名。也许我需要以某种方式扩展ROOTPage.Values[0]
,因为我从Inno Setup对象引用了一个数组?
或许我需要以不同的方式返回值。我在Pascal上看到one page表示你需要避免在参数较少的函数上赋值函数以避免递归循环。这是否意味着我应该传递一个虚拟值?还是有不同的语法?该页面没有解释。
我暗自认为我的真正问题是我没有正确定义我的功能......但是很好。这至少可以编译。 这个问题可能变成:你如何在Pascal中处理无参数函数?
我不认为Inno Setup是问题的一部分,但我正在与Inno Setup合作以防万一。
更新 它似乎不是数组,因为它会得到相同的错误:
const
DefaultRoot = 'C:\IAmGRoot';
function GetRoot : string;
begin
GetRoot := DefaultRoot;
end;
更新
这个link表示函数名称可以替换/应该用关键字Result
替换,如下面的代码。我实际上知道这一点,但Inno Setup编译器并不认为这是有效的语法。然后它告诉我我的功能是一个无效的原型。
function GetRoot : string;
begin
Result := DefaultRoot;
end;
更新 如果我这样做,我会得到" GetRoot的无效原型"
function GetRoot : boolean;
begin
Result := False;
end;
@Martin Prikryl的更新:
嗯,我在一些地方使用它,但典型的用途是这样的:
[Files]
Source: "C:\ValidPath\Release\*"; DestDir: "{app}\bin"; Components: DefinedComponent
Source: "C:\ValidPath\Deployment\*"; DestDir: "{code:GetRoot}\"; Flags: ignoreversion recursesubdirs; Components: DefinedComponent
答案 0 :(得分:12)
您的代码在Pascal中是正确的,但它不能在Pascal脚本中编译。
在Pascal中,当您想要分配函数的返回值时,您可以将值赋值给"变量"使用函数名称或Result
变量。
所以这是正确的:
function GetRoot: string;
begin
GetRoot := ROOTPage.Values[0];
end;
这也是(两者都相同):
function GetRoot: string;
begin
Result := ROOTPage.Values[0];
end;
在Pascal脚本中,只有Result
有效。当您使用该函数的名称时,您将获得"标识符。"
当从Code
部分的大小调用函数并且需要特定的参数列表/返回值时,您会得到此信息。但是你没有告诉我们你使用GetRoot
函数的内容。
有两个地方,您可以在Inno Setup中使用自定义功能:
Check
parameter:为此,函数必须返回Boolean
并且不带参数或一个参数(参数类型由您在Check
中提供的值确定参数)。
function MyProgCheck(): Boolean;
function MyDirCheck(DirName: String): Boolean;
Scripted Constants:函数必须返回string
并取一个string
参数,即使脚本常量中没有提供参数也是如此。我认为这是你的用例。如果您不需要任何参数,只需声明它,但不要使用它:
function GetRoot(Param: String): string;
begin
Result := ROOTPage.Values[0];
end;