Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]
Здравствуйте! Воспользовался скинами (ISSkinU.dll и *.cjstyle), и заметил, что на странице Лицензионного соглашения, полоса прокрутки не отображается в Win 10 (виртуалка), в Win 7 отображается - как я понял это не лечится?
Здравствуйте! Потихоньку (очень потихоньку) пытаюсь вникнуть в Inno Setup, больше методом научного тыка на примерах, из одного примера взял КОД, в меру своих сил подредактировал его.
[Files]
Source: "{app}\Win_7.txt"; DestDir: "{app}"; Check:
Source: "{app}\Win_10.txt"; DestDir: "{app}"; Check:
Source: "{app}\Win_10_2.txt"; DestDir: "{app}"; Check:
Source: "{app}\Dop_Win_7.txt"; DestDir: "{app}"; Check:
[Code_]
var
Check: array [0..3] of TCheckBox;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
Check[1].Checked := False;
Check[2].Checked := False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[0].Checked := True;
end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
Check[0].Checked := False;
Check[2].Checked := False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin
if Check[2].Checked then
begin
Check[0].Checked := False;
Check[1].Checked := False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[2].Checked := True;
end;
procedure Check3(Sender: TObject);
begin
if Check[3].Checked then
end;
procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectTasksPage;
Checked := True;
Left:=ScaleX(4);
Top := ScaleY(90);
Width:=ScaleX(280);
OnClick := @Check0;
// Будет Win_7.txt
Caption := ' Стандартные иконки в стиле Win 7';
end;
Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top := ScaleY(115);
Width:=ScaleX(280);
OnClick := @Check1;
// Будет Win_10.txt
Caption := ' Стандартные иконки в стиле Win 10';
end;
Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top := ScaleY(140);
Width:=ScaleX(350);
OnClick := @Check2;
// Будет Win_10_2.txt
Caption := ' Станадартные иконки в стиле Win 7 + Win 10';
end;
Check[3] := TCheckBox.Create(WizardForm);
with Check[3] do
begin
Parent := WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top := ScaleY(165);
Width:=ScaleX(280);
OnClick := @Check3;
// Будет Dop_Win_7.txt
Caption := ' Дополнительные иконки в стиле Win 7';
end;
end;
А вот как "привязать" чекбоксы к файлам, ума не приложу, что-то мне подсказывает, что через "function" нужно, но вот как, тяму не хватает, картина как разобранная мозаика, там что-то понимаю, здесь о чём-то догадываюсь. Господа, направьте на путь истинный.
Chudmin,
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.
[Types]
Name: full; Description: Full installation; Flags: iscustom;
[Components]
Name: Check0; Description: "Стандартные иконки в стиле Win 7"; Flags: exclusive; Types: full;
Name: Check1; Description: "Стандартные иконки в стиле Win 10"; Flags: exclusive;
Name: Check2; Description: "Станадартные иконки в стиле Win 7 + Win 10"; Flags: exclusive;
Name: Check3; Description: "Дополнительные иконки в стиле Win 7"; Flags: exclusive;
[Files]
Source: "Win_7.txt"; DestDir: "{app}"; Components: Check0;
Source: "Win_10.txt"; DestDir: "{app}"; Components: Check1;
Source: "Win_10_2.txt"; DestDir: "{app}"; Components: Check2;
Source: "Dop_Win_7.txt"; DestDir: "{app}"; Components: Check3;
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.
[Tasks]
Name: desktopicon; Description: "Create a &desktop icon";
[Files]
Source: "Win_7.txt"; DestDir: "{app}"; Check: Check_0;
Source: "Win_10.txt"; DestDir: "{app}"; Check: Check_1;
Source: "Win_10_2.txt"; DestDir: "{app}"; Check: Check_2;
Source: "Dop_Win_7.txt"; DestDir: "{app}"; Check:Check_3;
[Code]
var
Check: array [0..3] of TCheckBox;
function Check_0(): Boolean;
begin
Result:= Check[0].Checked;
end;
function Check_1(): Boolean;
begin
Result:= Check[1].Checked;
end;
function Check_2(): Boolean;
begin
Result:= Check[2].Checked;
end;
function Check_3(): Boolean;
begin
Result:= Check[3].Checked;
end;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then begin
Check[1].Checked:= False;
Check[2].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[0].Checked:= True;
end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then begin
Check[0].Checked:= False;
Check[2].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin
if Check[2].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[2].Checked:= True;
end;
procedure Check3(Sender: TObject);
begin
if Check[3].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
Check[2].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[3].Checked:= True;
end;
procedure InitializeWizard();
begin
Check[0]:= TCheckBox.Create(WizardForm);
with Check[0] do begin
Parent:= WizardForm.SelectTasksPage;
Checked:= True;
Left:=ScaleX(4);
Top:= ScaleY(90);
Width:=ScaleX(280);
OnClick:= @Check0;
// Будет Win_7.txt
Caption:= ' Стандартные иконки в стиле Win 7';
end;
Check[1]:= TCheckBox.Create(WizardForm);
with Check[1] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(115);
Width:=ScaleX(280);
OnClick:= @Check1;
// Будет Win_10.txt
Caption:= ' Стандартные иконки в стиле Win 10';
end;
Check[2]:= TCheckBox.Create(WizardForm);
with Check[2] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(140);
Width:=ScaleX(350);
OnClick:= @Check2;
// Будет Win_10_2.txt
Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
end;
Check[3]:= TCheckBox.Create(WizardForm);
with Check[3] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(165);
Width:=ScaleX(280);
OnClick:= @Check3;
// Будет Dop_Win_7.txt
Caption:= ' Дополнительные иконки в стиле Win 7';
end;
end;
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.
[Tasks]
Name: desktopicon; Description: "Create a &desktop icon";
[Code]
var
Check: array [0..3] of TCheckBox;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then begin
Check[1].Checked:= False;
Check[2].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[0].Checked:= True;
end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then begin
Check[0].Checked:= False;
Check[2].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin
if Check[2].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[2].Checked:= True;
end;
procedure Check3(Sender: TObject);
begin
if Check[3].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
Check[2].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[3].Checked:= True;
end;
procedure InitializeWizard();
begin
Check[0]:= TCheckBox.Create(WizardForm);
with Check[0] do begin
Parent:= WizardForm.SelectTasksPage;
Checked:= True;
Left:=ScaleX(4);
Top:= ScaleY(90);
Width:=ScaleX(280);
OnClick:= @Check0;
// Будет Win_7.txt
Caption:= ' Стандартные иконки в стиле Win 7';
end;
Check[1]:= TCheckBox.Create(WizardForm);
with Check[1] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(115);
Width:=ScaleX(280);
OnClick:= @Check1;
// Будет Win_10.txt
Caption:= ' Стандартные иконки в стиле Win 10';
end;
Check[2]:= TCheckBox.Create(WizardForm);
with Check[2] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(140);
Width:=ScaleX(350);
OnClick:= @Check2;
// Будет Win_10_2.txt
Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
end;
Check[3]:= TCheckBox.Create(WizardForm);
with Check[3] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(165);
Width:=ScaleX(280);
OnClick:= @Check3;
// Будет Dop_Win_7.txt
Caption:= ' Дополнительные иконки в стиле Win 7';
end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpFinished: begin
if Check[0].Checked then FileCopy(ExpandConstant('{src}\Win_7.txt'), ExpandConstant('{app}\Win_7.txt'), false);
if Check[1].Checked then FileCopy(ExpandConstant('{src}\Win_10.txt'), ExpandConstant('{app}\Win_10.txt'), false);
if Check[2].Checked then FileCopy(ExpandConstant('{src}\Win_10_2.txt'), ExpandConstant('{app}\Win_10_2.txt'), false);
if Check[3].Checked then FileCopy(ExpandConstant('{src}\Dop_Win_7.txt'), ExpandConstant('{app}\Dop_Win_7.txt'), false);
end;
end;
end;
nik1967, большое Вам спасибо! Теперь более менее понятно как оно организовано.
Через секцию Components я это уже организовал по Справке, но мне захотелось понять, как это организовать через чекбоксы. Правда я забыл сказать, что из первых трёх чекбоксов должен быть выбран обязательно только какой-то один, а четвёртый по желанию, без привязки к первым трём. Надеюсь я правильно сделал?
[Code_]
var
Check: array [0..3] of TCheckBox;
function Check_0(): Boolean;
begin
Result:= Check[0].Checked;
end;
function Check_1(): Boolean;
begin
Result:= Check[1].Checked;
end;
function Check_2(): Boolean;
begin
Result:= Check[2].Checked;
end;
function Check_3(): Boolean;
begin
Result:= Check[3].Checked;
end;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then begin
Check[1].Checked:= False;
Check[2].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) then Check[0].Checked:= True;
end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then begin
Check[0].Checked:= False;
Check[2].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin
if Check[2].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) then Check[2].Checked:= True;
end;
procedure Check3(Sender: TObject);
begin
if Check[3].Checked then
end;
procedure InitializeWizard();
begin
Check[0]:= TCheckBox.Create(WizardForm);
with Check[0] do begin
Parent:= WizardForm.SelectTasksPage;
Checked:= True;
Left:=ScaleX(4);
Top:= ScaleY(90);
Width:=ScaleX(280);
OnClick:= @Check0;
// Будет Win_7.txt
Caption:= ' Стандартные иконки в стиле Win 7';
end;
Check[1]:= TCheckBox.Create(WizardForm);
with Check[1] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(115);
Width:=ScaleX(280);
OnClick:= @Check1;
// Будет Win_10.txt
Caption:= ' Стандартные иконки в стиле Win 10';
end;
Check[2]:= TCheckBox.Create(WizardForm);
with Check[2] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(140);
Width:=ScaleX(350);
OnClick:= @Check2;
// Будет Win_10_2.txt
Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
end;
Check[3]:= TCheckBox.Create(WizardForm);
with Check[3] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(165);
Width:=ScaleX(280);
OnClick:= @Check3;
// Будет Dop_Win_7.txt
Caption:= ' Дополнительные иконки в стиле Win 7';
end;
end;
ErikPshat
19-11-2018, 23:12
nik1967, и у меня в нагрузку подобный вопрос.
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox?
Могу ли я использовать вместо этого:
Check[3]:= TCheckBox.Create(WizardForm);
аот это?
Check[3]:= TCheckBox.Create(MsgBox);
Dodakaedr
19-11-2018, 23:29
Вставлю свои пять копеек:)
А вот как "привязать" чекбоксы к файлам »
из первых трёх чекбоксов должен быть выбран обязательно только какой-то один, а четвёртый по желанию »
[Setup]
AppName=app
AppVersion=app 1.0
DefaultDirName={pf}\app
[Files]
Source: "{app}\Win_7.txt"; DestDir: "{app}"; Check: Check0();
Source: "{app}\Win_10.txt"; DestDir: "{app}"; Check: Check1();
Source: "{app}\Win_10_2.txt"; DestDir: "{app}"; Check: Check2();
Source: "{app}\Dop_Win_7.txt"; DestDir: "{app}"; Check: Check3();
[Code]
var
Check: array [0..3] of TCheckBox;
function Check0(): boolean;
begin
Result := Check[0].Checked;
end;
function Check1(): boolean;
begin
Result := Check[1].Checked;
end;
function Check2(): boolean;
begin
Result := Check[2].Checked;
end;
function Check3(): boolean;
begin
Result := Check[3].Checked;
end;
procedure GetCheck(Sender: TObject);
begin
case sender of
Check[0]: begin if Check[0].Checked then begin Check[1].Checked := False; Check[2].Checked := False; end; end;
Check[1]: begin if Check[1].Checked then begin Check[2].Checked := False; Check[0].Checked := False; end; end;
Check[2]: begin if Check[2].Checked then begin Check[1].Checked := False; Check[0].Checked := False; end; end;
end;
end;
procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectDirPage;
Checked := True;
Left:=ScaleX(4);
Top := ScaleY(100);
Width:=ScaleX(280);
OnClick := @GetCheck;
// Будет Win_7.txt
Caption := ' Стандартные иконки в стиле Win 7';
end;
Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectDirPage;
Left:=ScaleX(4);
Top := ScaleY(125);
Width:=ScaleX(280);
OnClick := @GetCheck;
// Будет Win_10.txt
Caption := ' Стандартные иконки в стиле Win 10';
end;
Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectDirPage;
Left:=ScaleX(4);
Top := ScaleY(150);
Width:=ScaleX(350);
OnClick := @GetCheck;
// Будет Win_10_2.txt
Caption := ' Станадартные иконки в стиле Win 7 + Win 10';
end;
Check[3] := TCheckBox.Create(WizardForm);
with Check[3] do
begin
Parent := WizardForm.SelectDirPage;
Left:=ScaleX(4);
Top := ScaleY(175);
Width:=ScaleX(280);
// Будет Dop_Win_7.txt
Caption := ' Дополнительные иконки в стиле Win 7';
end;
end;
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox? »
На сколько мне известно, то никак.
Dodakaedr,
procedure GetCheck(Sender: TObject);
begin
case sender of
Check[0]: if Check[0].Checked then begin Check[1].Checked := False; Check[2].Checked := False; end;
Check[1]: if Check[1].Checked then begin Check[2].Checked := False; Check[0].Checked := False; end;
Check[2]: if Check[2].Checked then begin Check[1].Checked := False; Check[0].Checked := False; end;
end;
end;
Зачем нам лишние begin, end :)
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox? »
На сколько мне известно, то никак. »
Но, можно сделать собственную форму сообщения при нажатии на нужную кнопку, и на ней уже разместить всё, что нужно.
ErikPshat
20-11-2018, 13:40
ну если уж сокращать, то »
Согласен, там лишние begin и end;
[ Code ]
var
Check: array [0..3] of TCheckBox;
function Check0(): boolean; begin Result := Check[0].Checked; end;
function Check1(): boolean; begin Result := Check[1].Checked; end;
function Check2(): boolean; begin Result := Check[2].Checked; end;
function Check3(): boolean; begin Result := Check[3].Checked; end;
Но, можно сделать собственную форму сообщения при нажатии на нужную кнопку, и на ней уже разместить всё, что нужно.
Да, погуглил это дело и везде предлагают только через создание новой формы. Мне как раз сейчас нужно вставить чекбоксы этого красивого кода, подготовленного выше. И у меня стандартный MessageBox отображает окно выбранной папки, которую я собираюсь разделить на части по 4 ГБ для флешек FAT32 с последующей упаковкой. И как раз здесь мне нужны 3 чекбокса, чтобы дать возможность выбора разделения не только по "4 ГБ", но и по "2 ГБ" и "Без ограничений".
if MsgBox(ExpandConstant('Выбрана следующая папка :')+#10#10+FolderName+#10#10+ExpandConstant('Вы хотите упаковать папку в PKG менее 4 ГБ?'), mbInformation, MB_YESNO) = IDYES then
https://i5.imageban.ru/out/2018/11/20/2eb0e2a6b46f34c71a306992d85da86c.png
Есть какой-то готовый вариант для подобного MessageBox? А то у меня уже голова не шарит.
Есть какой-то готовый вариант для подобного MessageBox? А то у меня уже голова не шарит. »
[Setup]
AppName = MyApp
AppVerName = MyApp
DefaultDirname = {pf}\MyApp
OutputDir=.
[Code]
var
NewButton1: TNewButton;
NewForm: TSetupForm;
YesButton: TNewButton;
NoButton: TNewButton;
Check: array [0..3] of TCheckBox;
procedure NewFormButtonClick(Sender: TObject);
begin
case TNewButton(Sender) of
YesButton: MsgBox('Запустилась упаковка.', mbInformation, MB_OK); // Сюда вешаешь выполнение, если да
NoButton: MsgBox('Ничего не произошло.', mbInformation, MB_OK); // Сюда, если нет
end;
NewForm.Close;
end;
procedure GetCheck(Sender: TObject);
begin
case sender of
Check[0]: if Check[0].Checked then begin Check[1].Checked:= False; Check[2].Checked:= False; end;
Check[1]: if Check[1].Checked then begin Check[2].Checked:= False; Check[0].Checked:= False; end;
Check[2]: if Check[2].Checked then begin Check[1].Checked:= False; Check[0].Checked:= False; end;
end;
end;
procedure TestOnClick(Sender: TObject);
begin
NewForm:= CreateCustomForm();
with NewForm do begin
ClientWidth:= ScaleX(473);
ClientHeight:= ScaleY(233);
BorderIcons:= [];
Caption:= 'Тест';
Color:= clWindow;
CenterInsideControl(WizardForm, False);
end;
with TLabel.Create(NewForm) do begin
Parent:= NewForm;
SetBounds(ScaleX(-1), ScaleY(187), ScaleX(475), ScaleY(47));
Transparent:= false;
Color:= clBtnFace;
end;
with TLabel.Create(NewForm) do begin
Parent:= NewForm;
SetBounds(ScaleX(60), ScaleY(10), ScaleX(400), ScaleY(80));
AutoSize:= False;
Caption:= 'Вы хотите упаковать папку в PKG?';
end;
Check[0]:= TCheckBox.Create(NewForm);
with Check[0] do begin
Parent:= NewForm;
Checked:= True;
Left:=ScaleX(60);
Top:= ScaleY(90);
Width:=ScaleX(280);
OnClick:= @GetCheck;
Caption:= ' Тест 1';
end;
Check[1]:= TCheckBox.Create(NewForm);
with Check[1] do begin
Parent:= NewForm;
Left:=ScaleX(60);
Top:= ScaleY(115);
Width:=ScaleX(280);
OnClick:= @GetCheck;
Caption:= ' Тест 2';
end;
Check[2]:= TCheckBox.Create(NewForm);
with Check[2] do begin
Parent:= NewForm;
Left:=ScaleX(60);
Top:= ScaleY(140);
Width:=ScaleX(280);
OnClick:= @GetCheck;
Caption:= ' Тест 3';
end;
YesButton:= TNewButton.Create(NewForm);
with YesButton do begin
Parent:= NewForm;
SetBounds(ScaleX(304), ScaleY(200), ScaleX(75), ScaleY(23));
OnClick:= @NewFormButtonClick;
Caption:= SetupMessage(msgButtonYes);
end;
NoButton := TNewButton.Create(NewForm);
with NoButton do begin
Parent:= NewForm;
SetBounds(ScaleX(389), ScaleY(200), ScaleX(75), ScaleY(23));
OnClick:= @NewFormButtonClick;
Caption:= SetupMessage(msgButtonNo);
end;
NewForm.ShowModal;
NewForm.Free;
end;
procedure InitializeWizard();
begin
NewButton1:= TNewButton.Create(WizardForm);
with NewButton1 do
begin
Parent:= WizardForm;
SetBounds(ScaleX(10),ScaleY(327),ScaleX(75),ScaleY(23));
Caption:= 'Тест';
OnClick:= @TestOnClick;
end;
end;
И да, зачем ты в MsgBox пихаешь ExpandConstant? Совершенно лишнее.
if MsgBox('Выбрана следующая папка :'+#10#10+FolderName+#10#10+'Вы хотите упаковать папку в PKG менее 4 ГБ?', mbInformation, MB_YESNO) = IDYES then
ErikPshat
20-11-2018, 16:23
Набросал на скорую руку пример »
Спасибо большое! Вы уже в который раз меня выручаете. Кстати, этот MsgBox как раз из той секции, что в прошлый раз вы для меня написали. Тоже хорошее решение исходного кода и пойдёт в копилку однозначно.
Правда я хотел, чтобы это было именно так, как я указал на скриншоте. Я думал, если не получается вставить чекбоксы напрямую в MsgBox, тогда создать новую форму именно такого же MsgBox под замену с чекбоксами и подменить стандартный. Либо наверное лучше было бы вместо чекбоксов сделать там раскрывающийся список.
У вас же выходит кнопкой, опять же на том окне выбора папки. И мне кажется, тогда открывающееся окно по кнопке будет лишним.
Я решил тогда уж сразу использовать ранее предложенное решение на окне выбора папки с чекбоксами, так будет более разумнее с меньшим количеством телодвижений. То есть, в своей проге я откачусь назад на один шаг, где идёт выбор папки и там сразу буду отмечать размеры делений по ГБ. А в MsgBox, как на скрине, буду автоматом отображать выбранный ранее размер.
Только мне нужно заменить, в окне выбора папки, кнопки "Далее >" и "Отмена" на кнопки "Да" и "Нет", потому что у меня не инсталлятор, а как бы авторан.
Может вы мне подскажете, как это нужно организовать? Я просто сам только пару месяцев, как заинтересовался Inno Setup.
создать новую форму именно такого же MsgBox под замену с чекбоксами и подменить стандартный. »
Я немного переделал скрипт - как раз сделал похожим на стандартный MsgBox.
Только мне нужно заменить, в окне выбора папки, кнопки "Далее >" и "Отмена" на кнопки "Да" и "Нет", потому что у меня не инсталлятор, а как бы авторан. »
Я не знаю, как реализовано окно выбора папки.
ErikPshat
20-11-2018, 19:52
nik1967, в ообщем я сделал вот такую реализацию своей идеи, можете заценить и указать на ошибки:
#define Name "MyAppName"
#define Version "1.0 Build 1234"
[Setup]
AppName={#Name}
AppVersion={#Version}
DefaultDirName={src}
;[Files]
;Source: "{app}\4GB.txt"; DestDir: "{app}"; Check: Check0();
;Source: "{app}\2GB.txt"; DestDir: "{app}"; Check: Check1();
;Source: "{app}\NoLimit.txt"; DestDir: "{app}"; Check: Check2();
;Source: "{app}\Signed.txt"; DestDir: "{app}"; Check: Check3();
[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
[Messages]
ru.WizardSelectDir=Выбор папки для разделения
ru.SelectDirDesc=Какую папку вы хотите разделить на части и упаковать их в PKG?
ru.SelectDirLabel3=Программа разделит выбранную папку на части по размерам,%nв зависимости от сделанного вами выбора в чекбоксах.
ru.SelectDirBrowseLabel=Для выбора папки, которую вам необходимо разделить, нажмите «Обзор».
ru.DiskSpaceMBLabel=Требуется как минимум 2 или 4 ГБ свободного дискового пространства.
[CustomMessages]
ru.Check4GB=Разделить папку на части по 4 Гигабайта
ru.Check2GB=Разделить папку на части по 2 Гигабайта
ru.CheckNot=Не разделять папку, упаковать целиком
ru.CheckSig=Подписать PKG (создать "retail_signed.pkg")
[ Code ]
var
Check: array [0..3] of TCheckBox;
function Check0(): boolean; begin Result := Check[0].Checked; end;
function Check1(): boolean; begin Result := Check[1].Checked; end;
function Check2(): boolean; begin Result := Check[2].Checked; end;
function Check3(): boolean; begin Result := Check[3].Checked; end;
procedure GetCheck(Sender: TObject);
begin
case sender of
Check[0]: if Check[0].Checked then begin Check[1].Checked := False; Check[2].Checked := False; end;
Check[1]: if Check[1].Checked then begin Check[2].Checked := False; Check[0].Checked := False; end;
Check[2]: if Check[2].Checked then begin Check[1].Checked := False; Check[0].Checked := False; end;
end;
end;
procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectDirPage;
Checked := True;
Left:= ScaleX(4);
Top := ScaleY(115);
Width:=ScaleX(280);
OnClick := @GetCheck;
// Будет 4GB.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
Caption := ExpandConstant(' {cm:Check4GB}');
end;
Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectDirPage;
Left:= ScaleX(4);
Top := ScaleY(135);
Width:=ScaleX(280);
OnClick := @GetCheck;
// Будет 2GB.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
Caption := ExpandConstant(' {cm:Check2GB}');
end;
Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectDirPage;
Left:= ScaleX(4);
Top := ScaleY(155);
Width:=ScaleX(350);
OnClick := @GetCheck;
// Будет NoLimit.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
Caption := ExpandConstant(' {cm:CheckNot}');
end;
Check[3] := TCheckBox.Create(WizardForm);
with Check[3] do
begin
Parent := WizardForm.SelectDirPage;
Left:= ScaleX(4);
Top := ScaleY(185);
Width:=ScaleX(280);
// Будет Signed.txt, если имеется в них необходимость, нужно раскомментировать их в секции [Files]
Caption := ExpandConstant(' {cm:CheckSig}');
end;
end;
Только какие потом отлавливать переменные я пока не придумал )))
Выбранная папка вроде: {#AppName}
Выбранный чекбокс как-то так: Check()
потому что у меня не инсталлятор, а как бы авторан. Может вы мне подскажете, как это нужно организовать?»
Если у Вас не инсталляция, а «как бы авторан» — то используйте в качестве рабочего средства не Inno Setup, а другие, более подходящие для того инструменты, например, AutoPlay Media Studio и т.п.
Здравствуйте всем! Господа-товарищи, я так понимаю, в таком виде
[Code]
var
Check: array [0..3] of TCheckBox;
function Check_0(): Boolean;
begin
Result:= Check[0].Checked;
end;
function Check_1(): Boolean;
begin
Result:= Check[1].Checked;
end;
function Check_2(): Boolean;
begin
Result:= Check[2].Checked;
end;
function Check_3(): Boolean;
begin
Result:= Check[3].Checked;
end;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then begin
Check[1].Checked:= False;
Check[2].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[0].Checked:= True;
end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then begin
Check[0].Checked:= False;
Check[2].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin
if Check[2].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
Check[3].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[2].Checked:= True;
end;
procedure Check3(Sender: TObject);
begin
if Check[3].Checked then begin
Check[0].Checked:= False;
Check[1].Checked:= False;
Check[2].Checked:= False;
end;
if (Check[0].Checked = False) and (Check[1].Checked = False) and (Check[2].Checked = False) and (Check[3].Checked = False) then Check[3].Checked:= True;
end;
procedure InitializeWizard();
begin
Check[0]:= TCheckBox.Create(WizardForm);
with Check[0] do begin
Parent:= WizardForm.SelectTasksPage;
Checked:= True;
Left:=ScaleX(4);
Top:= ScaleY(90);
Width:=ScaleX(280);
OnClick:= @Check0;
// Будет Win_7.txt
Caption:= ' Стандартные иконки в стиле Win 7';
end;
Check[1]:= TCheckBox.Create(WizardForm);
with Check[1] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(115);
Width:=ScaleX(280);
OnClick:= @Check1;
// Будет Win_10.txt
Caption:= ' Стандартные иконки в стиле Win 10';
end;
Check[2]:= TCheckBox.Create(WizardForm);
with Check[2] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(140);
Width:=ScaleX(350);
OnClick:= @Check2;
// Будет Win_10_2.txt
Caption:= ' Станадартные иконки в стиле Win 7 + Win 10';
end;
Check[3]:= TCheckBox.Create(WizardForm);
with Check[3] do begin
Parent:= WizardForm.SelectTasksPage;
Left:=ScaleX(4);
Top:= ScaleY(165);
Width:=ScaleX(280);
OnClick:= @Check3;
// Будет Dop_Win_7.txt
Caption:= ' Дополнительные иконки в стиле Win 7';
end;
end;
чекбоксы прикрутить нельзя к самостоятельно созданной странице, только к стандартным?
Dodakaedr
21-11-2018, 15:13
Chudmin,
Типа такого
Check[0].Parent := CustomPage.Surface
CustomPage это созданная страница.
Типа такого »
Благодарствую, - ведь видел и в Справке и примерах, но вылетело из головы.
Дорогие форумчане, интересует следующий вопрос.
Возможно ли как-нибудь уловить ошибки которые возникают при установке программы? Например: если ставить с пацарапанного или грязного диска получим ошибку "The Source file is corrupted",
которая успешно отобразится на экране. Мне же нужно название этой ошибки отправить на сервер (Или возможно есть другой способ).
У кого какие мысли возникают?
Здравствуйте всем! Подскажите пожалуйста, функция UpdateReadyMemo действует только для стандартных страниц, или можно включать сюда и созданные пользователем тоже.
Мне же нужно название этой ошибки отправить на сервер »
Разве что отправить лог установки, где, возможно, будет отображена та или иная ошибка установки. Запускать инсталлятор нужно с параметром/ключом командной строки.
/LOG
Указывает инсталлятору создать log-файл в папке TEMP для подробного отчета о действиях и событиях при установке, обработке записей секции [Run], предпринятых в ходе установки. Применяется при отслеживании ошибок. Например, если вы подозреваете, что файл не был заменен, хотя должен был, log-файл сообщит, что файл был действительно пропущен и почему это произошло.
Log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не перезаписываются и не дополняются.)
Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята пользователем. Формат файла может измениться без уведомления.
/LOG="filename"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет заменен. Если файл не может быть создан, установка прервется и выдаст сообщение об ошибке.
I want create custom setup with inno setup like this:
https://drive.google.com/open?id=1L2EhT2XXcvFZuRFLn0MJ7viq2KvhR6sA
Please help for iss code!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.