Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 9]


Страниц : 1 2 3 4 5 6 7 [8] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Chudmin
07-11-2018, 20:44
Здравствуйте! Воспользовался скинами (ISSkinU.dll и *.cjstyle), и заметил, что на странице Лицензионного соглашения, полоса прокрутки не отображается в Win 10 (виртуалка), в Win 7 отображается - как я понял это не лечится?

Chudmin
18-11-2018, 20:51
Здравствуйте! Потихоньку (очень потихоньку) пытаюсь вникнуть в 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" нужно, но вот как, тяму не хватает, картина как разобранная мозаика, там что-то понимаю, здесь о чём-то догадываюсь. Господа, направьте на путь истинный.

nik1967
19-11-2018, 21:25
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;

Chudmin
19-11-2018, 22:45
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? »
На сколько мне известно, то никак.

nik1967
20-11-2018, 11:04
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? А то у меня уже голова не шарит.

nik1967
20-11-2018, 15:10
Есть какой-то готовый вариант для подобного 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.

nik1967
20-11-2018, 16:33
создать новую форму именно такого же 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()

Iska
20-11-2018, 19:56
потому что у меня не инсталлятор, а как бы авторан. Может вы мне подскажете, как это нужно организовать?»
Если у Вас не инсталляция, а «как бы авторан» — то используйте в качестве рабочего средства не Inno Setup, а другие, более подходящие для того инструменты, например, AutoPlay Media Studio и т.п.

Chudmin
21-11-2018, 11:06
Здравствуйте всем! Господа-товарищи, я так понимаю, в таком виде


[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 это созданная страница.

Chudmin
21-11-2018, 20:57
Типа такого »
Благодарствую, - ведь видел и в Справке и примерах, но вылетело из головы.

RbwKz
22-11-2018, 11:38
Дорогие форумчане, интересует следующий вопрос.
Возможно ли как-нибудь уловить ошибки которые возникают при установке программы? Например: если ставить с пацарапанного или грязного диска получим ошибку "The Source file is corrupted",
которая успешно отобразится на экране. Мне же нужно название этой ошибки отправить на сервер (Или возможно есть другой способ).
У кого какие мысли возникают?

Chudmin
22-11-2018, 12:33
Здравствуйте всем! Подскажите пожалуйста, функция UpdateReadyMemo действует только для стандартных страниц, или можно включать сюда и созданные пользователем тоже.

boss911
22-11-2018, 17:10
Мне же нужно название этой ошибки отправить на сервер »

Разве что отправить лог установки, где, возможно, будет отображена та или иная ошибка установки. Запускать инсталлятор нужно с параметром/ключом командной строки.

/LOG
Указывает инсталлятору создать log-файл в папке TEMP для подробного отчета о действиях и событиях при установке, обработке записей секции [Run], предпринятых в ходе установки. Применяется при отслеживании ошибок. Например, если вы подозреваете, что файл не был заменен, хотя должен был, log-файл сообщит, что файл был действительно пропущен и почему это произошло.
Log-файлу присваивается уникальное имя на базе текущей даты. (Существующие файлы не перезаписываются и не дополняются.)
Информация, содержащаяся в log-файле, техническая и поэтому не может быть понята пользователем. Формат файла может измениться без уведомления.

/LOG="filename"
Параметр похож на /LOG, но в отличие от него позволяет указать фиксированный путь/имя файла для log-файла. Если файл с указанным именем уже существует, он будет заменен. Если файл не может быть создан, установка прервется и выдаст сообщение об ошибке.

magsood
02-12-2018, 11:30
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