Function &引用;“需要标识符”;或;“无效原型”;在Inno设置中实现脚本常量时

Function &引用;“需要标识符”;或;“无效原型”;在Inno设置中实现脚本常量时,function,syntax,inno-setup,pascalscript,Function,Syntax,Inno Setup,Pascalscript,因此,给定这个函数,我在GetRoot:=ROOTPage.Values[0]上得到错误“Identifier Expected”行。我希望它告诉我,ROOTPage没有定义 const DefaultRoot='C:\IAmGRoot'; 变量 ROOTPage:TInputQueryWizardPage; 程序设置根; 开始 根页面:=CreateInputQueryPage(wpUserInfo, ExpandConstant({cm:RootTitle}'), ExpandConstan

因此,给定这个函数,我在
GetRoot:=ROOTPage.Values[0]上得到错误“Identifier Expected”行。我希望它告诉我,
ROOTPage
没有定义

const
DefaultRoot='C:\IAmGRoot';
变量
ROOTPage:TInputQueryWizardPage;
程序设置根;
开始
根页面:=CreateInputQueryPage(wpUserInfo,
ExpandConstant({cm:RootTitle}'),
ExpandConstant({cm:RootInstructions}'),
ExpandConstant({cm:RootDescription}')++''+DefaultRoot++''
);
Add(ExpandConstant({cm:SSRoot}')+':',False);
值[0]:=ExpandConstant('{DefaultRoot}');
//将SSROOT添加到路径
结束;
函数GetRoot:string;
开始
GetRoot:=ROOTPage.value[0];
结束;
我应该如何解释这个错误。Pascal中的标识符是什么

这告诉我标识符是变量名。也许我需要以某种方式展开
ROOTPage.Values[0]
,因为我引用的是来自Inno Setup对象的数组

或者我需要以不同的方式返回值。我在Pascal上看到,您需要避免在无参数函数上为函数值赋值,以避免递归循环。这是否意味着我应该传入一个伪值?还是有不同的语法?那一页没有解释

我私下认为我真正的问题是我没有正确定义我的函数。。。但是很好。至少有这么多是可以编译的这个问题可能变成:如何处理Pascal中的无参数函数?

我不认为Inno设置是问题的一部分,但我正在与Inno设置合作,以防这很重要


更新: 它似乎不是数组,因为这会得到相同的错误:

const
DefaultRoot='C:\IAmGRoot';
函数GetRoot:string;
开始
GetRoot:=DefaultRoot;
结束;

更新: 这说明函数名可以/应该替换为关键字
Result
,如以下代码。我实际上知道这一点,但Inno安装编译器不认为这是有效的语法。然后它告诉我我的函数是一个无效的原型

函数GetRoot:string; 开始 结果:=DefaultRoot; 结束;

更新: 如果我这样做,我会得到“GetRoot的原型无效”

函数GetRoot:boolean; 开始 结果:=假; 结束;
@Martin Prikryl的更新:

我在一些地方使用过它,但典型的用法如下:

[文件]
来源:“C:\ValidPath\Release\*”;DestDir:“{app}\bin”;组件:定义的组件
来源:“C:\ValidPath\Deployment\*”;DestDir:“{code:GetRoot}\”;标志:IgnoreVersionRecurseSubdirs;组件:定义的组件
需要标识符 您的代码在Pascal中是正确的,但它不能在Pascal脚本中编译

在Pascal中,当您想要分配函数的返回值时,您可以将该值分配给带有函数名称的“变量”,或者分配给
Result
变量

所以这是正确的:

函数GetRoot:string; 开始 GetRoot:=ROOTPage.value[0]; 结束; 这也是(两者都是等效的):

函数GetRoot:string; 开始 结果:=ROOTPage.value[0]; 结束; 在Pascal脚本中,只有
结果
有效。当您使用函数名时,会得到“预期标识符”


无效原型 当从
code
部分的外部调用函数并且需要特定的参数列表/返回值时,您会得到这个结果。但是您没有告诉我们,您使用
GetRoot
函数的目的是什么

有两个地方可以使用Inno Setup中的自定义函数:

  • :为此,函数必须返回一个
    布尔值
    ,并且不接受任何参数或只接受一个参数(参数类型由您在
    检查
    参数中提供的值确定)

    函数MyProgCheck():布尔值;
    函数MyDirCheck(DirName:String):布尔;
    
  • :函数必须返回一个
    字符串
    ,并获取一个
    字符串
    参数,即使脚本常量中未提供任何参数。我假设这是您的用例。如果不需要任何参数,只需声明它,但不要使用它:

    函数GetRoot(参数:String):String;
    开始
    结果:=ROOTPage.value[0];
    结束;
    
预期的标识符 您的代码在Pascal中是正确的,但它不能在Pascal脚本中编译

在Pascal中,当您想要分配函数的返回值时,您可以将该值分配给带有函数名称的“变量”,或者分配给
Result
变量

所以这是正确的:

函数GetRoot:string; 开始 GetRoot:=ROOTPage.value[0]; 结束; 这也是(两者都是等效的):

函数GetRoot:string; 开始 结果:=ROOTPage.value[0]; 结束; 在Pascal脚本中,只有
结果
有效。当您使用函数名时,会得到“预期标识符”


无效原型 当从
code
部分的外部调用函数并且需要特定的参数列表/返回值时,您会得到这个结果。但是您没有告诉我们,您使用
GetRoot
函数的目的是什么

有两个地方可以使用Inno Setup中的自定义函数:

  • :为此,函数必须返回一个
    布尔值
    ,并且不接受任何参数或只接受一个参数(参数类型由您在
    检查
    参数中提供的值确定)

    函数MyProgCheck():布尔值;
    函数MyDirCheck(DirName:String):布尔;
    
  • :函数必须返回一个
    字符串
    ,并获取一个
    字符串
    参数,即使脚本c中未提供任何参数