Вопрос Language selector with VCL Styles

nizcoz

Участник
The only way is create my own "language" dialog, and display that from the InitializeSetup. This way the custom dialog will be skinned. Once a user selects a language, you restart the installer with the /LANG switch to load the selected language. How can I do this?
 

vint56

Ветеран
Проверенный
nizcoz, Примеры InitializeLanguageDialog

#include 'botva2.iss'
[Setup]
AppName=Example
AppVerName=Example
DefaultDirName={pf}\Example
DefaultGroupName=Example
OutputDir=.

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: Files\*; Flags: dontcopy;

[Code ]
function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
Result:=True;
end;

function InitializeLanguageDialog(): Boolean;
var
Panel: TPanel;
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\Icon.png')) then ExtractTemporaryFile('Icon.png');
with SelectLanguageForm do begin
Panel:= TPanel.Create(SelectLanguageForm)
with Panel do begin
SetBounds(IconBitmapImage.Left,IconBitmapImage.Top,IconBitmapImage.Width+ScaleX(50),IconBitmapImage.Height+ScaleY(50));
BevelInner:= bsNone;
BevelOuter:= bsNone;
Parent:= SelectLanguageForm;
end;
Width:= Width+ScaleX(50);
SelectLabel.Left:= SelectLabel.Left+ScaleX(50);
LangCombo.Left:= LangCombo.Left+ScaleX(50);
OKButton.Left:= OKButton.Left+ScaleX(50);
CancelButton.Left:= CancelButton.Left+ScaleX(50);
ImgLoad(Panel.Handle,'Icon.png',0,0,IconBitmapImage.Width+ScaleX(50),IconBitmapImage.Height+ScaleY(50),True,True);
ImgApplyChanges(Panel.Handle);
IconBitmapImage.Hide;
end;
Result := True;
end;

procedure DeinitializeSetup;
begin
gdipShutDown;
end;



[Setup]
AppName=app
AppVersion=1.5
DefaultDirName={sd}\app

[Files]
Source: compiler:WizModernSmallImage-IS.bmp; DestName: "1.bmp"; Flags: dontcopy

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[LangOptions]
english.LanguageName=English / Английский
russian.LanguageName=Russian / Русский

[Messages]
SelectLanguageLabel=Please select a language.%nВыберите язык установщика.
SelectLanguageTitle=Ashampoo® Burning Studio 15

[Code ]
function InitializeLanguageDialog(): Boolean;
begin
with SelectLanguageForm do
begin
ExtractTemporaryFile('1.bmp');
IconBitmapImage.SetBounds(ScaleX(IconBitmapImage.Left), ScaleY(IconBitmapImage.Top), ScaleX(55), ScaleY(55));
IconBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
SelectLabel.Left := ScaleX(SelectLanguageForm.SelectLabel.Left + 25);
LangCombo.SetBounds(ScaleX(LangCombo.Left + 25), ScaleY(LangCombo.Top), ScaleX(LangCombo.Width - 60), ScaleY(LangCombo.Height));
end;
result := true;
end;



[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Code ]
procedure LangChange(Sender : TObject);
var
i : integer;
begin
i := SelectLanguageForm.LangCombo.ItemIndex;
case TNewComboBox(Sender).ItemIndex of
0: begin
with SelectLanguageForm do begin
SelectLabel.Caption := 'Select language, which will use at installing process:';
CancelButton.Caption := 'Cancel';
Caption := 'Select setup language';
end;
end;
1: begin
with SelectLanguageForm do begin
SelectLabel.Caption := 'Выберите язык, который будет использован в процессе установки:';
CancelButton.Caption := 'Отмена';
Caption := 'Выберите язык установки';
end;
end;
end;
end;

function InitializeLanguageDialog(): Boolean;
begin
with SelectLanguageForm do begin
ClientHeight := ScaleY(100);
ClientWidth := SelectLabel.Width + ScaleX(20);
SelectLabel.Left := ScaleX(10);
LangCombo.SetBounds(SelectLabel.Left, SelectLabel.Top + SelectLabel.Height, SelectLabel.Width, LangCombo.Height);
LangCombo_OnChange := @LangChange;
OKButton.SetBounds(SelectLabel.Left, LangCombo.Top + LangCombo.Height + ScaleY(5), ScaleX(110), OKButton.Height);
CancelButton.SetBounds(LangCombo.Width - OKButton.Width + ScaleX(10), OKButton.Top, ScaleX(110), CancelButton.Height);
IconBitmapImage.Hide;
end;
Result := True;
end;
 
Последнее редактирование:

AlexS

Новичок
День добрый мужики! Заразился идеей перенести LangCombo из SelectLanguageForm на WelcomePage. Перепробовал множество вариантов, которые в последствии не привели к успеху. Единственный способ который удался - это изменение размера самой формы SelectLanguageForm (подогнал размер под остальные страницы). Но не то... Не так... Хочется именно перенести его(LangCombo) на страницу приветствия...

Код:
[Setup]
AppName=app
AppVersion=1.5
DefaultDirName={sd}\Example
DisableWelcomePage=yes
DefaultGroupName=Example

[Files]
Source: compiler:WizModernImage.bmp; DestName: "1.bmp"; Flags: dontcopy
Source: compiler:Examples\MyProg.exe; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{group}\Example"; Filename: "{app}\MyProg.exe";

[Languages]
Name: "english"; MessagesFile: "compiler:Languages\English.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


[Code]

var
Label1,Label2: TLabel;
CheckLB: TNewListBox;

function InitializeLanguageDialog(): Boolean;
begin
with SelectLanguageForm do
begin

//***Сама форма***//
SelectLanguageForm.Width := ScaleX(503);
SelectLanguageForm.Height := ScaleY(389);
SelectLanguageForm.Color := $FFFFFF;
SelectLanguageForm.Position:= poScreenCenter;
BorderStyle:= bsDialog;
SelectLanguageForm.Caption := 'Установка';

//***Текст выбора языка***//
SelectLabel.Left:= ScaleX(176);
SelectLabel.Top:= ScaleX(185);

//***Сомво-список языков***//
LangCombo.Left := ScaleX(176);
LangCombo.Height := ScaleX(170);
LangCombo.Top := ScaleX(230);
LangCombo.Width := ScaleX(300);

//***Замена значка на изображение***//
ExtractTemporaryFile('1.bmp');
IconBitmapImage.SetBounds(ScaleX(0), ScaleY(0), ScaleX(164), ScaleY(314));
IconBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));

begin
begin
  { NewCheckListBox1 }
  CheckLB := TNewListBox.Create(SelectLanguageForm);
  with CheckLB do
  begin
  Parent := SelectLanguageForm;
  Left := ScaleX(0);
  Top := ScaleY(314);
  Width := ScaleX(500);
  Height := ScaleY(50);
  Color := $f0f0f0;
  end;
  { Label1 }
  Label1 := TLabel.Create(SelectLanguageForm);
  with Label1 do
  begin
  Parent := SelectLanguageForm;
  Caption := 'Вас приветствует мастер'+#10+#13+'установки Имя программы...';
  Left := ScaleX(176);
  Top := ScaleY(16);
  Width := ScaleX(300);
  Height := ScaleY(16);
  Font.Height := -13;
  Font.Size:=12;
  Font.Name := 'Verdana';
  Font.Style := [fsBold];
  end;
  { Label1 }
  Label1 := TLabel.Create(SelectLanguageForm);
  with Label1 do
  begin
  Parent := SelectLanguageForm;
  Caption := 'Программа установит [name/ver] на ваш компьютер.'+#10+#13+#10+#13+'Рекомендуется закрыть все прочие приложения перед'+#10+#13+'тем, как продолжить.'+#10+#13+#10+#13+'Нажмите «Далее», чтобы продолжить, или «Отмена»,'+#10+#13+'чтобы выйти из программы установки.';
  Left := ScaleX(176);
  Top := ScaleY(80);
  Width := ScaleX(300);
  Height := ScaleY(100);
  end;

  ///***Кнопка отмены***///
  CancelButton.Width := ScaleX(80); 
  CancelButton.Left := ScaleX(407);
  CancelButton.Top := ScaleX(10); 
  CancelButton.Parent := CheckLB;

  ///***Кнопка ОК***///
  OKButton.Width := ScaleX(80);     
  OKButton.Left := ScaleX(317);     
  OKButton.Top := ScaleX(10);
  OKButton.Caption := 'Далее';       
  OKButton.Parent := CheckLB;
end;
result := true;
end;
end;
end;
 

Вложения

Nemko

Дилетант
Модератор
AlexS, выбор языка после создания WizardForm, ну да ладно, кто я такой чтобы вообще спрашивать. Не знаю как заставить Inno загрузить без "дебрей" Caption для стандартных элементов из .isl файлов, но знаю как сделать все самому (и много кто знает):

Код:
#define AppName "Application"

[Setup]
AppName={#AppName}
AppVersion=1.5
DefaultDirName={sd}\{#AppName}

[CustomMessages]
ru_WizardForm=Установка - {#AppName}
ru_WelcomeLabel1=Вас приветствует Мастер установки {#AppName}
ru_WelcomeLabel2=Программа установит {#AppName} на ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.
ru_NextButton=Далее >
ru_CancelButton=Отмена

en_WizardForm=Setup - {#AppName}
en_WelcomeLabel1=Welcome to the  {#AppName} Setup Wizard
en_WelcomeLabel2=This will install {#AppName} on your computer.%n%nIt is recommended that you close all other applications before continuing.
en_NextButton=Next >
en_CancelButton=Cancel

[Code]
var
  LanguagesBox: TNewComboBox;
  Languages: String;

function NextButtonClick(CurPageID: Integer): Boolean; begin end;

procedure LanguagesUpdate;
begin
  WizardForm.WelcomeLabel1.Caption:=CustomMessage(Languages+'WelcomeLabel1');
  WizardForm.WelcomeLabel2.Caption:=CustomMessage(Languages+'WelcomeLabel2');
  WizardForm.NextButton.Caption:=CustomMessage(Languages+'NextButton');
  WizardForm.CancelButton.Caption:=CustomMessage(Languages+'CancelButton');
  WizardForm.Caption:=CustomMessage(Languages+'WizardForm');
end;

procedure LanguagesBoxChange(Sender: TObject);
begin
case LanguagesBox.ItemIndex of
  0: Languages:='ru_';
  1: Languages:='en_';
end;
  LanguagesUpdate;
end;

procedure InitializeWizard();
begin
LanguagesBox:=TNewComboBox.Create(WizardForm);
with LanguagesBox do
begin
  Parent:=WizardForm;
  SetBounds(ScaleX(24), ScaleY(327), ScaleX(145), ScaleY(21));
  Items.Add('Русский');
  Items.Add('English');
  ItemIndex:=0;
  OnChange:=@LanguagesBoxChange;
end;
  LanguagesBoxChange(LanguagesBox.ItemIndex);
end;
 
Последнее редактирование:
Сверху