"标识符预期"或"无效的原型"在Inno Setup中实现脚本常量时

时间:2015-11-11 17:41:56

标签: function syntax inno-setup pascalscript

因此,给定此功能,我得到错误"标识符预期"在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

1 个答案:

答案 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;