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

2024-05-06

因此,鉴于此功能,我在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 中的标识符是什么?

This page http://wiki.freepascal.org/Identifiers告诉我标识符是变量名。也许我需要扩展ROOTPage.Values[0]在某种程度上,因为我从 Inno Setup 对象引用数组?

或者也许我需要以不同的方式返回值。我看见one page http://wiki.freepascal.org/Functions在 Pascal 上,您需要避免在无参数函数上分配函数值,以避免递归循环。这是否意味着我应该传递一个虚拟值?或者有不同的语法吗?该页面没有解释。

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

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


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

const
  DefaultRoot = 'C:\IAmGRoot';

function GetRoot : string;
begin
  GetRoot := DefaultRoot;
end;

更新: 这link http://www.functionx.com/objectpascal/Lesson11.htm已经说了函数名可以替换/应该用关键字替换Result比如下面的代码。我实际上知道这一点,但 Inno Setup 编译器不会将其识别为有效语法。然后它告诉我我的函数是一个无效的原型。

function GetRoot : string;
begin
  Result := DefaultRoot;
end;

更新: 如果我这样做,我会得到“Invalid Prototype for 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

预期标识符

您的代码在 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范围 https://jrsoftware.org/ishelp/index.php?topic=scriptcheck:为此,该函数必须返回一个Boolean并采用不带参数或采用一个参数(参数类型由您在Check范围)。

    function MyProgCheck(): Boolean;
    
    function MyDirCheck(DirName: String): Boolean;
    
  • 脚本常量 https://jrsoftware.org/ishelp/index.php?topic=scriptconstants:该函数必须返回一个string并拿一个string参数,即使脚本常量中没有提供参数。我认为这是您的用例。如果不需要任何参数,只需声明它,但不要使用它:

    function GetRoot(Param: String): string;
    begin
      Result := ROOTPage.Values[0];
    end;
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Inno Setup 中实现脚本常量时出现“预期标识符”或“原型无效” 的相关文章

  • 创建表时 MySQL 语法错误

    我正在尝试在 Filemaker gt MySQL 转换脚本中使用此查询 表创建步骤直接从 phpMyAdmin 导出中获取 并添加到 DROP 语句中 DROP TABLE IF EXISTS artifacts CREATE TABLE
  • Python:在函数名中使用空格?

    我正在编写一个 python 脚本来调用函数 通常调用函数 def myCall print Hello World 但我想将该函数命名 使用为 def my Call print I did it 我知道世界会开始思考为什么程序员会这样命
  • 在Python中实现函数的前向声明[重复]

    这个问题在这里已经有答案了 是否可以在 python 中声明函数并单独实现它们 我的意思是在 C 中 void foo void foo C 前向声明用于解决依赖性问题 功能foo由函数使用bar and foo needs bar在声明它
  • 结构体指针运算符猜想(理论)

    结构体指针的使用非常频繁 因此有一个特殊的运算符 gt 下面的表达式是等价的 x y x gt y 将此运算符简单地视为如下定义的预处理器宏是否公平 define x gt x 为什么或者为什么不 或者它从一开始就被编码为运算符 这有何不同
  • Python函数名称错误[重复]

    这个问题在这里已经有答案了 我正在使用 python 3 4 1 我不断收到此错误 NameError name calcHullSpeed is not defined 我究竟做错了什么 import math LWL float inp
  • Javascript 函数接受 PHP 变量

    我完全空白 为什么这不起作用 我可以通过一个变量来完成此操作 但不能通过两个变量 当我实际使用像这样的数字时getnt 1 2 有用 它只是不适用于两个 PHP 变量 我可以使代码与echo a href nt php nid n a
  • 如何在“PrepareToInstall”期间显示进度?

    我正在开发的安装程序的大部分工作是在PrepareToInstall功能 因为我需要做的一切都可能失败 因此这是处理这些事情的适当位置 以防它们失败 通过在函数结果中传递错误消息 可以自动报告任何失败 安装程序实际复制的只有 3 个小文件
  • 是否可以替换 php 中的函数(例如邮件)并使其执行其他操作?

    我想用 PHP 重写一个函数 比如说 mail 函数 并且希望从现在开始调用 mail 时 它将加载我的 mail 版本而不是默认的 php 版本 这在 php 中可能吗 我想这样做的原因是因为我有数千行调用 mail 的代码 并且我不想重
  • 如何从视图中使用模型函数? - 拉拉维尔 5.4

    我在模型类中创建了一个函数 它是 public function scopetest query return query gt pluck name 我的控制器代码是 public function index books Book al
  • 函数 SQL 中的函数

    我可以在表值函数中调用标量函数吗 Thanks 是的 只要表值函数完成后返回一个表即可 用户自定义函数可以嵌套 也就是说 一个用户定义的函数可以 呼叫另一个 嵌套级别为 被调用函数时递增 开始执行 并在以下时间递减 被调用函数完成 执行 用
  • 为什么这个函数不是纯粹的?

    在维基百科文章中https en wikipedia org wiki Pure function Impure functions https en wikipedia org wiki Pure function Impure func
  • 为什么 C++ 对于 new 和 delete 有其单独的语法?

    为什么不能只是常规的函数调用 新本质上是 malloc sizeof Foo Foo Foo 虽然删除是 Foo Foo free 那么为什么 new delete 最终会拥有自己的语法而不是常规函数呢 这是一个尝试 The new操作员呼
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • Excel VBA 中.Delete 和.Clear 的区别?

    有什么区别Worksheets 1 Cells Delete and Worksheets 1 Cells Clear 我问这个是因为我一直用 Clear清除我的工作表内容 但在我之前的帖子中我发现Worksheets 1 Cells De
  • SQL 条件行插入

    如果满足条件是否可以插入新行 例如 我有这个表 没有主键也没有唯一性 image id tag id 39 8 8 39 5 11 如果 image id 和 tag id 的组合不存在 我想插入一行 例如 INSERT WHERE ima
  • Swift 完成处理程序语法

    此代码用于回答此处的问题 如何在 Swift 中发出 HTTP 请求 https stackoverflow com questions 24016142 how to make an http request in swift let u
  • 为什么在我的函数输出后打印“None”?

    我尝试编写这段代码 def smaller x y if x gt y print y else print x print smaller 2 3 我得到这个结果 gt gt gt 2 None 哪里去了None来自 这是什么意思 See
  • 获取ERLANG中的最长公共子序列

    我是这个 ERLANG 的新手 我了解基础知识 这就像计划 但范围更广 我知道如何创建一个函数 但在创建一个获取最长公共子序列的函数时遇到问题 lcs str1 str2 是一个接受两个字符串并输出一个整数的函数 lcs algorithm
  • 如何为键盘上的 xml 中的功能键设置不同的背景?

    我正在开发 Android 键盘应用程序 我尝试为普通键和功能键设置不同的背景 但它不起作用
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO

随机推荐