#define MyAppVersion "1.5"
#define MyAppPublisher "我的公司"
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"
[Setup]
; 注: AppId的值为单独标识该应用程序。
; 不要为其他安装程序使用相同的AppId值。
; (生成新的GUID,点击 工具|在IDE中生成GUID。)
AppId={
{9679B896-8D8C-4925-A6DE-79824C3372E4}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: "D:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\User\Desktop\test.config"; DestDir: "{app}"; Flags: ignoreversion
; 注意: 不要在任何共享系统文件上使用“Flags: ignoreversion”
[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Code]
myPage:TwizardPage;//定义窗口
myPage2:TwizardPage;
myPage3:TwizardPage;
ed1:TEdit;//控制器序列号
ed2:TEdit;//海康IP
ed3:TEdit;//客户端IP
ed4:TEdit;//客户端端口
ed5:TEdit;//海康端口
ed6:TEdit;//海康登录账号
ed7:TEdit;//海康登录密码
ed8:TEdit;//设备序列号
ed9:TEdit;//开门时间
Lbl1: TNewStaticText;//标题
Lbl2: TNewStaticText; //海康IP
Lbl3: TNewStaticText; //客户端IP
Lbl4: TNewStaticText; //客户端端口
Lbl5: TNewStaticText; //海康端口
Lbl6: TNewStaticText; //海康登录账号
Lbl7: TNewStaticText; //海康登录密码
Lbl8: TNewStaticText; //设备序列号
Lbl9: TNewStaticText; //开门时间
//定义校验方法,校验失败时,下一步按钮为空
procedure Key_Form_KeyChange(Sender: TObject);
begin
if((length(ed3.Text) <= 6)or(length(ed4.Text) <= 4)) then
WizardForm.NextButton.Enabled := True
WizardForm.NextButton.Enabled := False;
//初始化引导 窗口
procedure InitializeWizard();
begin
myPage:=CreateCustomPage(wpWelcome, '金库客户端设置', '门禁设置');
Lbl1 := TNewStaticText.Create(myPage);
Lbl1.Left := ScaleX(1);
Lbl1.Top := ScaleY(5);
Lbl1.Width := ScaleX(100);
Lbl1.Height := ScaleY(50);
Lbl1.Caption := '控制器序列号';
Lbl1.Parent := myPage.Surface;
ed1:=TEdit.Create(myPage);
ed1.Width:=ScaleX(170);
ed1.Top := ScaleY(25);
ed1.Text :='192.168.0.1';
ed1.Parent:=myPage.Surface;
//ed1.OnChange := @Key_Form_KeyChange;//添加校验方法
Lbl9 := TNewStaticText.Create(myPage);
Lbl9.Left := ScaleX(280);
Lbl9.Top := ScaleY(5);
Lbl9.Width := ScaleX(100);
Lbl9.Height := ScaleY(50);
Lbl9.Caption := '开门时间';
Lbl9.Parent := myPage.Surface;
ed9:=TEdit.Create(myPage);
ed9.Width:=ScaleX(45);
ed9.Left := ScaleY(322);
ed9.Top := ScaleY(25);
ed9.Text :='60';
ed9.Parent:=myPage.Surface;
//ed9.OnChange := @Key_Form_KeyChange;//添加校验方法
Lbl8 := TNewStaticText.Create(myPage);
Lbl8.Left := ScaleX(1);
Lbl8.Top := ScaleY(80);
Lbl8.Width := ScaleX(100);
Lbl8.Height := ScaleY(50);
Lbl8.Caption := '设备序列号';
Lbl8.Parent := myPage.Surface;
ed8:=TEdit.Create(myPage);
ed8.Width:=ScaleX(325);
ed8.Left := ScaleY(1);
ed8.Top := ScaleY(95);
ed8.Text :='e45815f9341c4d218e929a67e55ab92e';
ed8.Parent:=myPage.Surface;
//ed8.OnChange := @Key_Form_KeyChange;//添加校验方法
myPage2:=CreateCustomPage(wpWelcome, '金库客户端设置', '海康客户端设置');
Lbl2 := TNewStaticText.Create(myPage2);
Lbl2.Left := ScaleX(10);
Lbl2.Top := ScaleY(5);
Lbl2.Width := ScaleX(100);
Lbl2.Height := ScaleY(50);
Lbl2.Caption := '海康访问设备IP';
Lbl2.Parent := myPage2.Surface;
ed2:=TEdit.Create(myPage2);
ed2.Width:=ScaleX(100);
ed2.Left := ScaleY(10);
ed2.Top := ScaleY(25);
ed2.Text :='192.168.1.99';
ed2.Parent:=myPage2.Surface;
//ed2.OnChange := @Key_Form_KeyChange;//添加校验方法
Lbl5 := TNewStaticText.Create(myPage2);
Lbl5.Left := ScaleX(200);
Lbl5.Top := ScaleY(5);
Lbl5.Width := ScaleX(100);
Lbl5.Height := ScaleY(50);
Lbl5.Caption := '海康端口';
Lbl5.Parent := myPage2.Surface;
ed5:=TEdit.Create(myPage2);
ed5.Width:=ScaleX(100);
ed5.Left := ScaleY(230);
ed5.Top := ScaleY(25);
ed5.Text :='5000';
ed5.Parent:=myPage2.Surface;
//ed5.OnChange := @Key_Form_KeyChange;//添加校验方法
Lbl6 := TNewStaticText.Create(myPage2);
Lbl6.Left := ScaleX(10);
Lbl6.Top := ScaleY(80);
Lbl6.Width := ScaleX(100);
Lbl6.Height := ScaleY(50);
Lbl6.Caption := '登录账号';
Lbl6.Parent := myPage2.Surface;
ed6:=TEdit.Create(myPage2);
ed6.Width:=ScaleX(100);
ed6.Left := ScaleY(10);
ed6.Top := ScaleY(100);
ed6.Text :='admin';
ed6.Parent:=myPage2.Surface;
//ed6.OnChange := @Key_Form_KeyChange;//添加校验方法
Lbl7 := TNewStaticText.Create(myPage2);
Lbl7.Left := ScaleX(200);
Lbl7.Top := ScaleY(80);
Lbl7.Width := ScaleX(100);
Lbl7.Height := ScaleY(50);
Lbl7.Caption := '登录密码';
Lbl7.Parent := myPage2.Surface;
ed7:=TEdit.Create(myPage2);
ed7.Width:=ScaleX(100);
ed7.Left := ScaleY(230);
ed7.Top := ScaleY(100);
ed7.Text :='admin';
ed7.Parent:=myPage2.Surface;
ed7.OnChange := @Key_Form_KeyChange;//添加校验方法
myPage3:=CreateCustomPage(wpWelcome, '金库客户端设置', '安全员客户端设置');
Lbl3 := TNewStaticText.Create(myPage3);
Lbl3.Left := ScaleX(10);
Lbl3.Top := ScaleY(5);
Lbl3.Width := ScaleX(100);
Lbl3.Height := ScaleY(50);
Lbl3.Caption := '安全员客户端IP';
Lbl3.Parent := myPage3.Surface;
ed3:=TEdit.Create(myPage3);
ed3.Width:=ScaleX(100);
ed3.Left := ScaleY(10);
ed3.Top := ScaleY(25);
ed3.Text :='192.168.1.110';
ed3.Parent:=myPage3.Surface;
ed3.OnChange := @Key_Form_KeyChange;//添加校验方法
Lbl4 := TNewStaticText.Create(myPage3);
Lbl4.Left := ScaleX(200);
Lbl4.Top := ScaleY(5);
Lbl4.Width := ScaleX(100);
Lbl4.Height := ScaleY(50);
Lbl4.Caption := '安全员客户端端口';
Lbl4.Parent := myPage3.Surface;
ed4:=TEdit.Create(myPage3);
ed4.Width:=ScaleX(100);
ed4.Left := ScaleY(230);
ed4.Top := ScaleY(25);
ed4.Text :='5000';
ed4.Parent:=myPage3.Surface;
ed4.OnChange := @Key_Form_KeyChange;//添加校验方法
//添加步骤
procedure CurStepChanged(CurStep: TSetupStep);
fileName,tempStr:String;
svArray: TArrayOfString;
nLines,i:Integer;
begin
//if CurStep=ssinstall then
//安装前执行
if CurStep=ssPostinstall then
//复制文件后执行
begin
//开始修改文件
fileName := ExpandConstant('{app}\test.config');
LoadStringsFromFile(fileName, svArray);
nLines := GetArrayLength(svArray);//读取文件
for i := 0 to nLines - 1 do
begin
tempStr := svArray[i];
//安全员IP
if (1 = Pos(' <add key="SocketUrl" value="192.168.1.100" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="SocketUrl" value="'+ed3.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
if (1 = Pos(' <add key="SocketPort" value="5000" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="SocketPort" value="'+ed4.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//海康IP
if (1 = Pos(' <add key="HcIp" value="192.168.1.99" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="HcIp" value="'+ed2.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//海康端口
if (1 = Pos(' <add key="HcPort" value="8000" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="HcPort" value="'+ed5.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//海康账号
if (1 = Pos(' <add key="HcUserName" value="admin" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="HcUserName" value="'+ed6.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//海康密码
if (1 = Pos(' <add key="HcUserPassword" value="zxg123456" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="HcPort" value="'+ed7.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//控制器序列号
if (1 = Pos(' <add key="DoorIndex" value="1" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="DoorIndex" value="'+ed1.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//设备序列号
if (1 = Pos(' <add key="DoorIndexId" value="e45815f9341c4d218e929a67e55ab92e" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="DoorIndexId" value="'+ed8.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
//开门时间
if (1 = Pos(' <add key="DoorOpenTimes" value="70" />', tempStr)) then//查找目标行
begin
svArray[i] := ExpandConstant(' <add key="DoorOpenTimes" value="'+ed9.Text+'" />');//修改行
StringChangeEx(svArray[i], '\', '/', True);
SaveStringsToFile(fileName, svArray, false);
if CurStep=ssDone then
//安装完成后执行
以下是需要动态配置的xml文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="DoorDbContext" connectionString="data source=127.0.0.1,3390;initial catalog=NB_DoorControls;persist security info=True;user id=DevSczy;password=DevSczy2019;multipleactiveresultsets=True;application name=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
<parameters>
<parameter value="mssqllocaldb" />
</parameters>
</defaultConnectionFactory>
<providers>
<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
</entityFramework>
<appSettings>
<!--Socket IP-->
<add key="SocketUrl" value="127.0.0.1" />
<add key="WriteLog" value="1" />
<!--Socket 端口-->
<add key="SocketPort" value="5000" />
<!--职务字典分类编号-->
<add key="JobDicId" value="B235C4D5765D45248EC183E9092E840C" />
<!--安全员职务ID-->
<add key="SecurityJobId" value="44EBA1FE318644BFB08F7A9F232F5C9F" />
<!--数据同步时间间隔-->
<add key="JobTimeSpan" value="10" />
<add key="DoorPort" value="8088" />
<!--海康设备Ip地址-->
<add key="HcIp" value="127.0.0.1" />
<!--海康设备登录用户-->
<add key="HcUserName" value="admin" />
<!--海康设备登录用户密码 zxg123456-->
<add key="HcUserPassword" value="zxg123456" />
<add key="HcPort" value="8000" />
<!--门禁设备的控制器序号-->
<add key="DoorIndex" value="1" />
<!--门禁设备开门时间-->
<add key="DoorOpenTimes" value="70" />
<!--门禁设备序列号-->
<add key="DoorIndexId" value="e45815f9341c4d218e929a67e55ab92e" />
<add key="aspnet:RoslynCompilerLocation" value="roslyn" />
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=2.0.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
</compilers>
</system.codedom>
<system.web>
<membership defaultProvider="ClientAuthenticationMembershipProvider">
<providers>
<add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" />
</providers>
</membership>
<roleManager defaultProvider="ClientRoleProvider" enabled="true">
<providers>
<add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" />
</providers>
</roleManager>
</system.web>
</configuration>
本人做JAVA开发刚毕业的小毛头一枚,领导安排我用Inno Setup对文件打包,没接触过很头疼,好在坚持完成了。任务要求:安装软件时需要自定义输入配置信息。完成过程:1.首先需要了解Inno Setup的自定义控件2.取文本框值3.读取配置文件4.将文本框的值写入到配置文件。方式有很多,比如可以不用读取,直接生成一个新的配置文件,我这用的最容易解决的方式。如图 动...
环境:Windows操作系统。
描述:需要先安装
Inno
Setup
5增强版,然后点击build.iss文件,编译执行即可,将图片修改为自己喜欢的样式,不要编辑图片大小,应用存放在app目录下。
联系:微信:wanghu605897356
1、 界面border去掉原本windows自带的对话框格式,采取扁平化设计;
2、 简化安装流程,不要弹出那么多安装向导页,不要让用户一直点“下一步”,简洁人性化;
3、 安装界面可加载漂亮的背景图片;
4、 优化安装包安装时间。
原型设计:
利用
inno
setup
制作安装包,
inno
setup
下面编写的脚本语言用的pascal语言,不过编写安装包也只是需要用到简单的pascal语言语法,然后了解一下一些
inno
setup
安装过程默认执行的函数,其实这些函数右键的安装事件里面都是有的,大家将需要用到的自己了解了解就行。
脚本语言执行的都是一些Command命令,这些如果不懂上网一搜一大堆,
inno
setup
可以自己定制自己
负责的一个项目使用的打包工具是
inno
setup
5.2.4版本,项目较老,很多不好变动,且此版本会导致繁体乱码等诸多编码问题,故下决心要升级工具版本,使用Unicode版本的工具,可以避免乱码问题
遇到的问题:
1、安装界面有四种类型供选择,以前是选择一种类型,置灰其他类型,现在要改成点击哪个类型选中哪个类型,查了很久找到了一个[Components]里面的Flags,终结此烦恼:
Fla...
[INI]
Filename: "{app}\Config.db"; Section: "Clock"; Key: "Version"; String: "{#MyAppVersion}"
SetIniString('Clock','Channel',‘1.0.1’,ExpandConstant('{app}\Config.db'));
### 回答1:
Inno
Setup
是一个易于使用的安装包制作工具,它提供了丰富的安装选项和
自定义
功能。在使用
Inno
Setup
制作安装包时,我们可以通过
自定义
安装界面来满足客户的各种需求。
通过
Inno
Setup
的宏命令和脚本语言,我们可以轻松地修改默认的安装界面,例如添加
自定义控件
、更改按钮文本、更改字体和颜色等。可以使用Pascal脚本和Delphi Object Pascal语言。
要
自定义
安装界面,我们需要首先打开
Inno
Setup
的脚本文件(.iss文件)并找到“[
Setup
]”部分。在这里,我们可以设置安装程序的各种选项,例如安装的目标路径、是否需要安装桌面快捷方式、是否需要安装开始菜单项等等。
然后,我们可以添加新的页面和
自定义控件
,例如选择安装选项的页面、选择安装路径的页面、选择应用程序图标的页面等等。我们可以使用
Inno
Setup
自带的
控件
,也可以使用
自定义控件
来实现更复杂的功能。
最后,我们可以为每个页面添加Pascal脚本来实现
自定义
逻辑,例如检查安装目录是否已存在、检查系统是否已安装必要的组件等等。
总之,
Inno
Setup
提供了灵活的
自定义
安装界面功能,让我们可以满足不同客户的需求,并提高软件的用户体验。
### 回答2:
Inno
Setup
可以在安装过程中
自定义
安装界面,使其更符合特定的软件需求和个性化需求。通过
自定义
安装界面,可以加强用户交互体验,提高软件的可用性和易用性,同时也可以为软件提供更精细的管理和控制。下面将分别从设计理念、开发流程和技术实现方面进行介绍。
Inno
Setup
的
自定义
安装界面开发过程,从本质上来说是一次用户交互设计 (User Experience Design, UXD) 的过程。通过 UXD,设计师可以了解客户的需求、喜好和习惯,进而设计出更符合其需求的产品和服务。在
自定义
安装界面开发流程中,设计师需要考虑以下几个方面:
1. 界面设计。界面设计应该简单明了、美观大方,能够吸引用户的注意力并提高用户的参与度。同时需要考虑不同用户的操作习惯和口味,以达到更广泛的用户群体。
2. 用户体验 (User Experience, UX) 设计。在设计界面时,需要考虑到用户的体验。例如:简化繁琐的操作、提供更多的选择、给予良好的反馈等都是好的用户体验设计。
3. 交互设计。特别是在软件界面方面,设计师需要思考用户将与之如何交互,如何设定第一时间与其进行沟通交流。
在设计理念上确定了之后,我们需要有一个中间人对需求进行保存和整理。通常情况下需要特别有经验的的开发人员还需要具备美工能力,能够从业务流程到界面交互再到发布之间都能够进行系统性的构建和实践。
首先,需要准备安装向导的图片资源、
控件
资源等基本素材,并制定对应的管理策略。然后在1.4版本以上的
Inno
Setup
中,我们可以手动复制
Setup
向导的默认源文件,再进行相应的更改即可。
接着,需要使用 Pascal 编写脚本来确保安装向导能够正确检测到用户的操作,以及完成相应的安装任务。同时,还需要定义安装向导的菜单项、默认值、文件读取方式等,以方便用户进行
自定义
设置和个性化操作。
最后,在整个
自定义
安装界面开发完成后,我们需要使用
Inno
Setup
自带的
编译器
工具将代码打包并生成可供安装的安装包,从而方便用户进行安装和使用。
技术实现方案
实现
自定义
安装界面的技术方案主要分为以下几个方面:
1. 界面设计工具。可以选择比较流行的界面设计工具,如 Adobe Photoshop,Axure RP,Sketch 等,这些工具都具有快速地设计复杂界面的能力。
2. 编程语言。
Inno
Setup
采用 Pascal 语言编写,因此需要对 Pascal 语言有一定的了解和掌握基本的编程技能。
3.
Inno
Setup
插件。
Inno
Setup
提供了一系列插件,可以方便我们在安装向导中引入大量有用的功能,如申请服务权限、加密等。
需要注意的是,
Inno
Setup
自定义
安装界面开发风格应该以简单、实用、易于维护为原则,在设计时需要注意不要过于复杂和繁琐,以方便用户进行快速的操作和安装。
### 回答3:
Inno
Setup
是一款功能强大的安装程序制作软件,它可以帮助开发者快速的制作出安装程序。而
自定义
安装界面则是
Inno
Setup
所提供的一个很实用的功能之一,它可以使得开发者可以自由的设计自己的安装界面,让用户有一个更加舒适的安装体验。
首先,我们需要了解
Inno
Setup
自定义
安装界面的实现方式。整个安装过程中,
Inno
Setup
会按照一定的流程逐步展示各个界面,在每一个界面上,开发者都可以通过界面的设计和编写代码来进行
自定义
。
在设计安装界面时,我们可以使用
Inno
Setup
自带的画布工具或者其他画图工具来设计出自己喜欢的安装界面,然后通过
Inno
Setup
的代码来添加各种
控件
和事件。例如,我们可以添加各种按钮、文本框、进度条、复选框等
控件
,并通过代码来控制它们的显示和行为。
接下来,我们需要考虑
自定义
安装界面需要实现哪些功能。例如,我们可能需要在安装界面中添加自己的公司Logo、版本号、安装路径等
信息
,或者添加一些用户需要填写的
信息
,比如用户的名称、电子邮件和密码等。如果需要,我们也可以添加自己的安装协议和许可协议,并让用户需要点击同意才能继续安装。
总的来说,
Inno
Setup
的
自定义
安装界面功能非常强大,可以让开发者灵活的设计和实现自己的安装界面。但是需要注意的是,设计一个良好的安装界面需要考虑到用户的体验和操作方式,所以我们需要仔细考虑每一个
控件
的设计和布局,让用户能够尽可能的了解整个安装过程,并且保持简洁和易于操作。