Inno setup Inno设置-具有VCL样式的语言选择器

Inno setup Inno设置-具有VCL样式的语言选择器,inno-setup,pascalscript,vcl-styles.-utils,Inno Setup,Pascalscript,Vcl Styles. Utils,有没有办法将语言选择器Inno设置与VCL样式一起使用?如何操作?在调用之前,将显示“选择设置语言”对话框。因此,无法加载对话框的外观 作为一种解决方法,您可以实现自己的语言对话框,并从InitializeSetup中显示该对话框。这样,自定义对话框将被蒙皮。用户选择语言后,您可以使用重新启动安装程序以加载所选语言 通过将设置为“否”,确保禁用“标准语言”对话框 [设置] ShowLanguageDialog=否 [档案] 资料来源:skin.vsf;标志:dontcopy 来源:VclStyl

有没有办法将语言选择器Inno设置与VCL样式一起使用?如何操作?

在调用之前,将显示“选择设置语言”对话框。因此,无法加载对话框的外观

作为一种解决方法,您可以实现自己的语言对话框,并从InitializeSetup中显示该对话框。这样,自定义对话框将被蒙皮。用户选择语言后,您可以使用重新启动安装程序以加载所选语言

通过将设置为“否”,确保禁用“标准语言”对话框

[设置] ShowLanguageDialog=否 [档案] 资料来源:skin.vsf;标志:dontcopy 来源:VclStylesInno.dll;标志:dontcopy [语文] 姓名:en,;messages文件:编译器:Default.isl 姓名:cs,;messages文件:编译器:Languages\捷克语.isl [守则] 过程LoadVCLStyleVClStyleFile:String; 外部的LoadVCLStyleW@files:VclStylesInno.dll stdcall setuponly'; 程序风格; 外部的UnLoadVCLStyles@files:VclStylesInno.dll stdcall setuponly'; 函数ShellExecutehwnd:HWND;操作:字符串;lpFile:字符串; 参数:字符串;lpDirectory:string;nShowCmd:Integer:THandle; 外部的ShellExecuteW@shell32.dllstdcall'; 程序语言; 变量 语言形式:TSetupForm; 取消按钮:TNewButton; OK按钮:TNewButton; LangCombo:TNewComboBox; 选择标签:TNewStaticText; 语言:TStrings; 参数:字符串; 实例:坦德尔; P、 I:整数; S、 L:字符串; 开始 语言:=TStringList.Create; 语言。添加“en=English”; 添加'cs='+$010C+'e'+$0161+'tina'; LanguageForm:=CreateCustomForm; LanguageForm.Caption:=SetupMessagemsgSelectLanguageTitle; LanguageForm.ClientWidth:=ScaleX297; LanguageForm.ClientHeight:=ScaleY125; LanguageForm.BorderStyle:=bsDialog; 如果版本<0x06000000 语言形式。中心; 恩迪夫 CancelButton:=TNewButton.CreateLanguageForm; CancelButton.Parent:=LanguageForm; CancelButton.Top:=ScaleY93; 取消按钮。宽度:=ScaleY75; CancelButton.Left:=LanguageForm.ClientWidth-CancelButton.Width-ScaleX16; 取消按钮。高度:=ScaleY23; CancelButton.TabOrder:=3; CancelButton.ModalResult:=mrCancel; CancelButton.Caption:=SetupMessagemsgButtonCancel; OKButton:=TNewButton.CreateLanguageForm; OKButton.Parent:=LanguageForm; OKButton.Top:=取消按钮.Top; OKButton.Width:=CancelButton.Width; OKButton.Left:=CancelButton.Left-OKButton.Width-ScaleX8; 确定按钮高度:=取消按钮高度; OKButton.Caption:=SetupMessagemsgButtonOK; 默认值:=True OKButton.ModalResult:=mrOK; OKButton.TabOrder:=2; LangCombo:=TNewComboBox.CreateLanguageForm; LangCombo.Parent:=LanguageForm; LangCombo.Left:=ScaleX16; LangCombo.Top:=ScaleY56; LangCombo.Width:=LanguageForm.ClientWidth-ScaleX16*2; LangCombo.Height:=ScaleY21; LangCombo.Style:=csDropDownList; LangCombo.DropDownCount:=16; LangCombo.TabOrder:=1; 选择标签:=TNewStaticText.CreateLanguageForm; 选择Label.Parent:=LanguageForm; 选择label.Left:=LangCombo.Left; 选择label.Top:=ScaleY8; 选择label.Width:=LangCombo.Width; 选择标签。高度:=ScaleY39; SelectLabel.AutoSize:=False 选择label.Caption:=SetupMessagemsgSelectLanguageLabel; 选择label.TabOrder:=0; 选择label.WordWrap:=True; 对于I:=0到语言。计数-1 do 开始 P:=Pos'=',Languages.Strings[I]; L:=CopyLanguages.Strings[I],0,P-1; S:=CopyLanguages.Strings[I],P+1,LengthLanguages.Strings[I]-P; LangCombo.Items.AddS; 如果L=ActiveLanguage,则 LangCombo.ItemIndex:=I; 终止 //用所选语言重新启动安装程序 如果LanguageForm.showmodel=mrOK,则 开始 //收集当前实例参数 对于I:=1的参数 开始 S:=ParamStrI; //提升实例的唯一日志文件名 如果CompareTextCopyS,1,5,'/LOG='=0,则 开始 S:=S+'-局部'; 终止 ///SL5开关是用于传递数据的内部开关 //从主Inno设置进程到子进程。 //当我们开始一个新的主进程时,我们必须删除它。 //由于Inno Setup 6.2, //看https://groups.google.com/g/innosetup/c/pDSbgD8nbxI 如果CompareTextCopyS为1,5,'/SL5='0,则 开始 Params:=Params+AddQuotesS+''; 终止 终止 L:=Languages.Strings[LangCombo.ItemIndex]; P:=Pos'=',L; L:=CopyL,0,P-1; // ... 并添加所选语言 参数:=Params+'/LANG='+L; 实例:= ShellExecute0,ExpandConstant'{srcexe}',Params,SW_SHOW;
如果实例您需要从重新编译Inno安装程序

在Main.pas文件中找到此代码,并将此部分移动到CodeRunner和InitializeSetup之后


好的,但是你也应该提到这个改变的副作用。有一个原因可以解释为什么AskForLangua ge这么早就被叫来了。在AskForLanguage对话框和InitializeSetup之间有很多UI代码。如果您交换它们,所有代码都将使用英语。
{ Show "Select Language" dialog if necessary }
  if ShowLanguageDialog and (Entries[seLanguage].Count > 1) and
     not InitSilent and not InitVerySilent then begin
    if not AskForLanguage then
      Abort;
  end;