负责的一个项目使用的打包工具是inno setup5.2.4版本,项目较老,很多不好变动,且此版本会导致繁体乱码等诸多编码问题,故下决心要升级工具版本,使用Unicode版本的工具,可以避免乱码问题
遇到的问题:
1、安装界面有四种类型供选择,以前是选择一种类型,置灰其他类型,现在要改成点击哪个类型选中哪个类型,查了很久找到了一个[Components]里面的Flags,终结此烦恼:
Flags:exclusive
贴上帮助文档里面的解释:
2、由于有四种类型选择,且每一种类型有不同的自定义端口修改页面,以前是四种类型共用一个端口页面,再根据不同的类型置灰不同的端口,这样就显的安装页面有点丑,而且要继续增加端口,也遇到了瓶颈,最终解决方法:
初始化的时候初始4个页面,每个页面初始化不同的端口,再根据选择的类型去屏蔽不需要的页面,关于屏蔽的方法,依旧查了很久,此处只能哀叹,inno setup的资料确实少,只能抱着帮助文档中英文版在那不停的找:
函数:ShouldSkipPage 帮助文档里面的解释:
可这样调用:
function ShouldSkipPage(PageID:Integer):Boolean;
begin
result:=false;
if ((PageID=APage.ID) or (PageID=BPage.ID)) and ((server = 3) or (server = 4)) then begin
result:=true;
end;
if ((PageID=CPage.ID) or (PageID=DPage.ID)) and ((server = 1) or (server = 2) or (server = 4)) then begin
result:=true;
end;
if (PageID=EPage.ID) and ((server = 1) or (server = 2) or (server = 3)) then begin
result:=true;
end;
end;
调用:
ShouldSkipPage(APage.ID);
ShouldSkipPage(BPage.ID);
ShouldSkipPage(CPage.ID);
ShouldSkipPage(DPage.ID);
ShouldSkipPage(EPage.ID);
结果:
server 1跟2显示APage和BPage
server 3显示CPage和DPage
server 4显示EPage
3、点击安装页面的“帮助文档”按钮,打开帮助文档耗时很长,根据不精确计算,大概需要一分多钟,额,普通人估计都不愿意点
由于脚本中使用的是ExtractTemporaryFile函数来提取帮助文档,在查询英文inno setup Help里面此函数的时候,发现如下解释:
百度粗略翻译下的意思是:需要解压提取的文件最好位于 [Files]尽量靠前的地方,因为解压是根据[Files]顺序来,直至解压到需要打开的文件为止,所以将脚本中帮助文档放到[Files]段最前面,打包之后再点击按钮,超快就打开了
4、LoadStringFromFile函数参数变动
5.2.4:function LoadStringFromFile(const FileName: String; var S: String): Boolean;
5.5.4u:function LoadStringFromFile(const FileName: String; var S: AnsiString): Boolean;
5.5.4u很多函数的参数由String变成AnsiString
5.5.4u还有另外一个函数:function LoadStringsFromFile(const FileName: String; var S: TArrayOfString): Boolean;
对比了String跟AnsiString、TArrayOfString,最终选择使用LoadStringsFromFile,将原来的String参数换成TArrayOfString
由于脚本中使用的功能是,加载配置文件,修改配置文件内容,保存配置文件,所以加载的函数变更,修改和保存的函数也需要一并变更:
原来修改配置文件内容的函数StringChange换成TArrayOfStringChanges,由于没有现成可用的,于是自己写了个TArrayOfStringChanges的自定义函数,原理是将TArrayOfString先转换成String,然后再调函数进行修改配置操作:
function TArrayOfStringChanges(svArray:TArrayOfString; FromStr, ToStr: String): TArrayOfString;
var
nLines,i:Integer;
tempStr:String;
begin
nLines := GetArrayLength(svArray);
for i := 0 to nLines - 1 do
begin
tempStr := svArray[i];
if ( Pos(FromStr, tempStr)>0 ) then
begin
StringChangeEx(svArray[i], FromStr, ToStr, True);
end;
end;
Result := svArray;
end;
保存文件的函数由SaveStringToFile换成SaveStringsToFile或SaveStringsToUTF8File,具体使用哪一个,根据文件的编码格式决定。
5、TArrayOfStringToString 自己封装了一个用来将TArrayOfString先转换成String,方便在某一些函数里面调用
function TArrayOfStringToString(svArray:TArrayOfString): String;
var
nLines,i:Integer;
begin
Result := '';
nLines := GetArrayLength(svArray);
for i := 0 to nLines - 1 do
begin
Result := Result+svArray[i];
end;
end;
6、组件相关的一些知识
点击某一个组件时,触发的是IsComponentSelected 函数
组件选中/不选中:WizardForm.ComponentsList.Checked[0]:=true/false; 组件数字编码从0开始,按顺序排
组件置灰/有效:WizardForm.ComponentsList.ItemEnabled[0] := false/true;
7、其他一些小知识
打开一个选择目录的对话框:function BrowseForFolder(const Prompt: String; var Directory: String; const NewFolderButton: Boolean): Boolean;
------总结下:要更好的使用inno setup,除了要学会查看帮助文档,还要学点pascal