jpchen 发表于 2010-7-19 08:57:33

inno制作安装包时碰到pascal脚本问题:setup段无法从code段提取内容

目前要制作一个安装软件,使用Inno Setup V5.23版本,需要实现3个另类的功能:
1、允许用户自己输入一个软件名称(这样不是由开发者来决定了),安装时要自动将软件安装到相应的文件夹里,比如用户在一个框里输入“我的定制软件”,安装包就将软件安装到“C:\Program Files\我的定制软件”这个文件夹里面,如果输入“这软件只有我一个人使用”,那么安装路径就变成“C:\Program Files\这软件只有我一个人使用”这个文件夹里。
2、允许用户改动可执行文件的名称,比如发行时可执行文件是“aaa.exe”,用户可以在安装时的一个输入框里输入自己想要的名字,比如“zzz”,安装后文件就改名成为zzz.exe。
3、开始菜单和桌面的快捷方式,因为上述2项的改动,快捷方式也要有相应的变化,否则会指向不正确。

目前在实现第一个功能时就碰到了问题,我在setup段里这样设置:

DefaultDirName={pf}\{code:GetMyAppNameIn}

code段这样设置

var
MyAppNamePage: TInputQueryWizardPage;
MyAppNameIn: String;

procedure InitializeWizard();
begin
MyAppNamePage := CreateInputQueryPage(wpLicense,
    '定制软件名称', '设置自己的特定名称',
    '请输入自己设定的软件名称,随便取什么名字,多有特色都可以');
MyAppNamePage.Add('软件名称:', False);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = MyAppNamePage.ID then begin
    MyAppNameIn := MyAppNamePage.Values;
end;
Result := True;
end;

function GetMyAppNameIn(Param: String): String;
begin
Result := MyAppNameIn;
end;

结果发现无效,检查时在NextButtonClick里加上MsgBox函数来检测MyAppNameIn变量,发现确实已经改成了用户输入的名称了,但是在接下来的让用户选择安装路径的框上,却显示路径为“C:\Program Files”,没有用户输入的部分,表明MyAppNameIn没有提取到。我猜测是不是DefaultDirName的生效时间在NextButtonClick函数之前,导致安装包一运行,就先将DefaultDirName赋值好了,用户输入的时候已经太晚了,不知道是不是这样。

这种情况不知道诸位用Inno时有没有碰到,希望能帮我想个办法,谢谢!

jpchen 发表于 2010-7-19 09:07:35

用code段来设置安装路径的方法,很多人是用来读取注册表来设定路径的,我因为不打算涉及注册表,并且是需要用户在安装时才决定名称,所以是比较另类的要求。

jpchen 发表于 2010-7-19 18:20:05

有人用Inno来做安装程序吗?

SkyGz 发表于 2010-7-19 18:26:34

轻松搞定...

DefaultDirName={pf}\
OutputDir=.
AppSupportURL=http://www.skygz.com


var
MyAppNamePage: TInputQueryWizardPage;

procedure InitializeWizard();
begin
MyAppNamePage := CreateInputQueryPage(wpLicense,
    '定制软件名称', '设置自己的特定名称',
    '请输入自己设定的软件名称,随便取什么名字,多有特色都可以');
MyAppNamePage.Add('软件名称:', False);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = MyAppNamePage.ID then begin
    if MyAppNamePage.Values = '' then begin
      result := false;
      exit;
    end;
    WizardForm.DirEdit.text := ExpandConstant('{pf}\')+MyAppNamePage.Values;
end;
Result := True;
end;

jpchen 发表于 2010-7-19 19:16:17

按SkyGz的方法试了一下,果然可行,输入的名称已经附加到安装路径中了,看来关键就是:WizardForm.DirEdit.text := ExpandConstant('{pf}\')+MyAppNamePage.Values;

非常高兴,谢谢SkyGz,这问题已经困扰我好几天了,在网上一直查不到相关资料,今天终于解决了,可以继续做下面的几个功能了。

javenreal 发表于 2010-7-19 23:39:22

论坛真是藏龙卧虎,看来inno也挺强大的。

借楼问一个问题:

有没有办法实现,安装时根据当前所选语言复制不同文件?


Source: "a_ch.dat"; DestDir: "{app}";
Source: "a_en.dat"; DestDir: "{app}";

当用户安装时选择英文时,只从安装包中释放a_en.dat并重命名为a.dat,当用户选择中文时,只释放a_ch.dat并重命名为a.dat?

SkyGz 发表于 2010-7-20 01:48:56

你都不知道Inno软件一直坚持汉化的是我 ./emotion/em026.gif


Source: a_ch.dat; DestDir: {app}; Languages: chinesesimp; DestName: a.dat
Source: a_en.dat; DestDir: {app}; Languages: english; DestName: a.dat

jpchen 发表于 2010-7-20 08:32:07

我说怎么在Inno的help里都查不到WizardForm这个词,去查源码才找到,原来是汉化作者,佩服!
Inno很好用,对于99%的用户而言,不会比InstallShield逊色。我以前用过InstallShield,非常庞大,还不容易用,并且是收费软件,当然我是用破解版的。
强烈推荐大家用Inno,功能强大,并且是免费的,还附带源码。

javenreal 发表于 2010-7-20 23:06:46

6楼高手,佩服佩服!

vtte 发表于 2010-7-20 23:15:47

本论坛果然是藏龙卧虎
页: [1]
查看完整版本: inno制作安装包时碰到pascal脚本问题:setup段无法从code段提取内容