Inno setup 如何在Inno设置中拆分字符串

Inno setup 如何在Inno设置中拆分字符串,inno-setup,pascalscript,Inno Setup,Pascalscript,如何在Inno设置中拆分字符串? Inno设置中是否有任何特殊函数用于拆分字符串 我想从字符串'11.2.0.16'中获取以下内容: 标记:字符串数组=('11','0','2','16'); 提前谢谢 我今天一直在找同样的东西 这一个在Inno安装脚本上运行良好。在调用此“拆分”过程的过程/函数之前,将此摘录粘贴到脚本中 你也可以修改这个函数,如果你想 过程分解(var Dest:TArrayOfString;Text:String;Separator:String); 变量 i、 p:整数

如何在Inno设置中拆分字符串?
Inno设置中是否有任何特殊函数用于拆分字符串

我想从字符串
'11.2.0.16'
中获取以下内容:

标记:字符串数组=('11','0','2','16');

提前谢谢

我今天一直在找同样的东西

这一个在Inno安装脚本上运行良好。在调用此“拆分”过程的过程/函数之前,将此摘录粘贴到脚本中

你也可以修改这个函数,如果你想

过程分解(var Dest:TArrayOfString;Text:String;Separator:String);
变量
i、 p:整数;
开始
i:=0;
重复
设置阵列长度(目的地,i+1);
p:=位置(分隔符,文本);
如果p>0,则开始
目的地[i]:=副本(文本,1,p-1);
Text:=复制(Text,p+长度(分隔符),长度(Text));
i:=i+1;
结束,否则开始
Dest[i]:=文本;
文本:='';
结束;
直到长度(文本)=0;
结束;
程序(无论什么);
变量
str:字符串;
strArray:TArrayOfString;
i:整数;
开始
爆炸(strArray,str,“.”);
对于i:=0到GetArrayLength(strArray)-1,请务必开始
{做点什么}
结束;
结束;

摘自

对于喜欢函数格式的人,我修改了:

函数StrSplit(文本:String;分隔符:String):TArrayOfString;
变量
i、 p:整数;
目的地:柏油碎石;
开始
i:=0;
重复
设置阵列长度(目的地,i+1);
p:=位置(分隔符,文本);
如果p>0,则开始
目的地[i]:=副本(文本,1,p-1);
Text:=复制(Text,p+长度(分隔符),长度(Text));
i:=i+1;
结束,否则开始
Dest[i]:=文本;
文本:='';
结束;
直到长度(文本)=0;
结果:=Dest
结束;
以下是我使用的:

过程拆分字符串(S,Delim:string;var Dest:TArrayOfString);
变量
Temp:字符串;
一、 P:整数;
开始
温度:=S;
I:=StringChangeEx(温度,Delim,,,真值);
设置阵列长度(目的地,I+1);
对于I:=0到GetArrayLength(Dest)-1 do
开始
P:=Pos(Delim,S);
如果P>0,则
开始
目的地[I]:=副本(S,1,P-1);
删除(S,1,P+长度(Delim)-1);
结束
其他的
Dest[I]:=S;
结束;
结束;

此版本通过使用分隔符计数并仅设置一次数组大小来避免重复调整数组大小。因为我们知道数组的大小,所以我们可以使用
for
循环。我还选择了
Delete
而不是
Copy
,这(IMO)使代码更易于阅读。(此版本还修复了分隔符长度超过1个字符时拆分不正确的错误。)

如果分隔符可能也位于字符串末尾,则这就是我使用的(根据@timyha的答案修改)


出于好奇,这是一个棘手的替代方案,它用换行符替换所有分隔符,并将这些文本加载到一个字符串列表中,该列表会自动将值拆分为项目。但无论如何,这还不是全部。您需要从原始字符串中剥离要解析的子字符串,最后从值中删除引号,并将这些值格式化为虚线字符串(因此我对“拆分”的初始注释)。一个小的输入错误:应该是
Dest[i]:='
,在
if Text='.
行之后。你错过了冒号。否则这对我来说很好
function StrSplit(Text: String; Separator: String): TArrayOfString;
var
  i, p: Integer;
  Dest: TArrayOfString; 
begin
  i := 0;
  repeat
    SetArrayLength(Dest, i+1);
    p := Pos(Separator,Text);

    if p > 0 then begin
      Dest[i] := Copy(Text, 1, p-1);
      Text := Copy(Text, p + Length(Separator), Length(Text));
      i := i + 1;
      
      //add an empty string if delim was at the end 
         
      if Text = '' then begin
        Dest[i]=''; 
        i := i + 1;
      end;

    end else begin
      Dest[i] := Text;
      Text := '';
    end;
  until Length(Text)=0;
  Result := Dest
end;