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 并添加时为我的字符数组获取奇怪的值