搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

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

目前在实现第一个功能时就碰到了问题,我在setup段里这样设置:
[Setup]
DefaultDirName={pf}\{code:GetMyAppNameIn}

code段这样设置
[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[0];
  end;
  Result := True;
end;

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2010-7-19 09:07:35 | 显示全部楼层
用code段来设置安装路径的方法,很多人是用来读取注册表来设定路径的,我因为不打算涉及注册表,并且是需要用户在安装时才决定名称,所以是比较另类的要求。

出0入0汤圆

 楼主| 发表于 2010-7-19 18:20:05 | 显示全部楼层
有人用Inno来做安装程序吗?

出0入70汤圆

发表于 2010-7-19 18:26:34 | 显示全部楼层
轻松搞定...
[Setup]
DefaultDirName={pf}\
OutputDir=.
AppSupportURL=http://www.skygz.com

[Code]
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[0] = '' then begin
      result := false;
      exit;
    end;
    WizardForm.DirEdit.text := ExpandConstant('{pf}\')+MyAppNamePage.Values[0];
  end;
  Result := True;
end;

出0入0汤圆

 楼主| 发表于 2010-7-19 19:16:17 | 显示全部楼层
按SkyGz的方法试了一下,果然可行,输入的名称已经附加到安装路径中了,看来关键就是:WizardForm.DirEdit.text := ExpandConstant('{pf}\')+MyAppNamePage.Values[0];

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

出0入0汤圆

发表于 2010-7-19 23:39:22 | 显示全部楼层
论坛真是藏龙卧虎,看来inno也挺强大的。

借楼问一个问题:

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

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

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

出0入70汤圆

发表于 2010-7-20 01:48:56 | 显示全部楼层
你都不知道Inno软件一直坚持汉化的是我

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

出0入0汤圆

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

出0入0汤圆

发表于 2010-7-20 23:06:46 | 显示全部楼层
6楼高手,佩服佩服!

出0入33汤圆

发表于 2010-7-20 23:15:47 | 显示全部楼层
本论坛果然是藏龙卧虎
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表