Inno设置加载字符串,获取数字并添加

Posted

技术标签:

【中文标题】Inno设置加载字符串,获取数字并添加【英文标题】:Inno setup load string, get the number and add 【发布时间】:2020-02-10 23:00:47 【问题描述】:

我需要inno设置走线,检查Area的数量。并添加+1,请参见下面的示例

Original FILE:

[Area.1]
Title=World P1
Local=C:\scenery\world\p
Layer=
Active=TRUE
Required=FALSE

[Area.2]
Title=World C1
Local=C:\scenery\world\c
Layer=
Active=TRUE
Required=FALSE

[Area.3]
Title=World D1
Local=C:\scenery\world\d
Layer=
Active=TRUE
Required=FALSE

[Area.4]
Title=World E1
Local=C:\scenery\world\e
Layer=
Active=TRUE
Required=FALSE

Inno 设置将检查哪个是最后一个区域,在 Area.4 的情况下,它将获取数字并将其与 +1 相加,然后再添加一个具有附加数字的区域,以便能够按照所述文件跟踪文件。 所以,取Area.4并添加

[Area.5]

Title=世界 F1

本地=C:\scenery\world\f

层=

活动=真

必填=假

Inno Setup,读取并检查最后一个区域,安装后会一直这样

[Area.1]
Title=World P1
Local=C:\scenery\world\p
Layer=
Active=TRUE
Required=FALSE

[Area.2]
Title=World C1
Local=C:\scenery\world\c
Layer=
Active=TRUE
Required=FALSE

[Area.3]
Title=World D1
Local=C:\scenery\world\d
Layer=
Active=TRUE
Required=FALSE

[Area.4]
Title=World E1
Local=C:\scenery\world\e
Layer=
Active=TRUE
Required=FALSE

[Area.5]
Title=World F1
Local=C:\scenery\world\f
Layer=
Active=TRUE
Required=FALSE

我正在使用此代码,但它只是添加,我需要安装程序检查原始文件中的数字并更改行 [1] 添加 +1,就好像它是 php / mysql 中的和

function saveStringToFile(): boolean;
var
  InstallDir: string;
  fileName : string;
  lines : TArrayOfString;
begin
  if FileExists(ExpandConstant('app\scenery.cfg')) then
  begin
    MsgBox('Archive "scenery.cfg" found', mbInformation, MB_OK);
    Result := True;
    fileName := ExpandConstant('app\scenery.cfg');
    SetArrayLength(lines, 43);
  //
  lines[0] := '';
  lines[1] := '[Area.5]';
  lines[2] := 'Title=World F1';
  lines[3] := 'Local=C:\scenery\world\f';
  lines[4] := 'Layer=';
  lines[5] := 'Active=TRUE';
  lines[6] := 'Required=FALSE';
  lines[7] := '';
  //
  Result := SaveStringsToFile(filename,lines,true);
  exit;
  end
  else
  begin
    MsgBox('Archive "scenery.cfg" not found', mbInformation, MB_OK);
    Result := False;
  end;
end;

【问题讨论】:

什么意思"加数字到+1"?要将[Area.1] 更改为Area.2 并将Area.2 更改为Area.3?您能向我们展示原始文件吗?您希望它在安装后如何处理? @MartinPrikryl 我想他想更新 INI 并添加一个带有下一个数字的新区域部分。我认为... 你提到[Area.X]:是不是说你有一个大文件,里面有一些区域,你必须搜索Title=X的区域,得到它的编号,然后加1? 我有一个 .cfg 文件,其中包含 [Area.1] 及其行,我需要 Inno Setup 来检查区域编号并添加 6 个以上区域,会有 Area.1,2,3 ,4,5, 6...就像@M.Bauer 说的 我编辑了帖子以使其更易于理解 【参考方案1】:

您首先必须阅读配置文件以获取最大区域数。请参阅以下功能。有一个单独的函数可以获取特定行的编号。达到最大数量后,只需加 1,然后继续编写额外的区域。

拥有fileName后,您可以致电: maxNumber := GetMaxNumber(fileName);

该函数有一些解释。还有一些消息框可以取消注释,它可以为您提供一些正在发生的事情的信息。

function GetAreaNumber(line : String) : Integer;
var
    pos1, pos2 : Integer;
    number : String;
begin
    // This function only gets called, when the line contains an area header.
    // Get the positions of the chracter before and after the number and
    // extract the number.
    pos1 := Pos('.', line)
    pos2 := Pos(']', line)
    number := Copy(line, pos1 + 1, pos2 - (pos1 + 1))
    //MsgBox(number, mbInformation, MB_OK)
    Result := StrToIntDef(number, 0)
end;

function GetMaxNumber(fileName : String): Integer;
var
    lines : TArrayOfString;
    linesCount, index : Integer;
    maxNumber, currentNumber : Integer;
begin
    maxNumber := 0

    if LoadStringsFromFile(fileName, lines) then
    begin
        linesCount := GetArrayLength(lines)
        //MsgBox(IntToStr(linesCount), mbInformation, MB_OK)

        // Run through all the lines from the file.
        for index := 0 to linesCount - 1 do
        begin
            // Check if the line contains an area header.
            if Pos('[Area.', lines[index]) > 0 then
            begin
                //MsgBox(lines[index], mbInformation, MB_OK)
                currentNumber := GetAreaNumber(lines[index])

                if currentNumber > maxNumber then
                begin
                    maxNumber := currentNumber
                end
            end
        end
    end;

    Result := maxNumber
end;

【讨论】:

好。使用StrToIntDef 优雅地处理意外部分。否则安装程序会在遇到[Area.][Area.X] 等行时发生致命故障。 + 您应该测试该行是否以[Area. 开头,而不是仅包含该行。该行可以注释掉,如;[Area.1] 值得考虑在循环中使用IniKeyExists 来增量测试节是否存在。这将是最稳健的方式。 我按照马丁的建议把字符串转换函数改成了StrToIntDef() @Martin:使用IniKeyExists 需要知道开始的最小区域编号。如果[Area.2] 是文件中的第一个,则搜索[Area.1] 将失败,并给出错误的结果。 当然,这就是我所说的“在循环中逐步测试部分是否存在”的意思

以上是关于Inno设置加载字符串,获取数字并添加的主要内容,如果未能解决你的问题,请参考以下文章

C++:在转换为 int 并添加时为我的字符数组获取奇怪的值

Inno Setup:为文件夹及其子文件夹中的所有文件动态添加组件

Inno Setup 安装程序运行时命名检查问题

php如何从数字后面的字符串中获取文本

从标准输入将数字读入寄存器?加载 scanf 结果

如何获取罗马数字字符串并将其转换为base10数字? [关闭]