Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Ответить
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 9]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1271
Благодарности: 1029


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 06-06-2020
Внимание! Данная тема предназначена только для обсуждения написания скриптов!
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:

Показать/скрыть: Ссылки на примеры скриптов:

Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;

  • RegExporter - Бесплатная утилита для экспорта реестра и конвертации файлов *.reg и *.ini в инсталляционные скрипты Inno Setup и NSIS.
    Последняя версия: 1.3.0 [17.01.2015] - Скачать;



Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Скрипты Inno Setup. Помощь и советы [часть 6] | Скрипты Inno Setup. Помощь и советы [часть 6].7z
Скрипты Inno Setup. Помощь и советы [часть 7] | Скрипты Inno Setup. Помощь и советы [часть 7].7z
Скрипты Inno Setup. Помощь и советы [часть 8] | Скрипты Inno Setup. Помощь и советы [часть 8].7z
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:09, 04-04-2018

 

Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:44, 07-11-2018 | #141



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:51, 18-11-2018 | #142


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Chudmin,
Три варианта

Первый: самый простой, но через секцию Components

Код: Выделить весь код
[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;

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:25, 19-11-2018 | #143


Аватара для Chudmin

Пользователь


Сообщения: 98
Благодарности: 13

Профиль | Отправить PM | Цитировать


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;

Отправлено: 22:45, 19-11-2018 | #144


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


nik1967, и у меня в нагрузку подобный вопрос.

Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox?
Могу ли я использовать вместо этого:
Код: Выделить весь код
Check[3]:= TCheckBox.Create(WizardForm);
аот это?
Код: Выделить весь код
Check[3]:= TCheckBox.Create(MsgBox);

Отправлено: 23:12, 19-11-2018 | #145


Аватара для Dodakaedr

Ветеран


Сообщения: 860
Благодарности: 259

Профиль | Отправить PM | Цитировать


Вставлю свои пять копеек
Цитата Chudmin:
А вот как "привязать" чекбоксы к файлам »
Цитата Chudmin:
из первых трёх чекбоксов должен быть выбран обязательно только какой-то один, а четвёртый по желанию »
Example

Код: Выделить весь код
[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;

Цитата ErikPshat:
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox? »
На сколько мне известно, то никак.

-------
Inno Setup 5 Ultra Unicode

Это сообщение посчитали полезным следующие участники:

Отправлено: 23:29, 19-11-2018 | #146


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


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


Цитата ErikPshat:
Как вывести эти же чекбоксы, то только не в главное окно, а в MsgBox? »
Цитата Dodakaedr:
На сколько мне известно, то никак. »
Но, можно сделать собственную форму сообщения при нажатии на нужную кнопку, и на ней уже разместить всё, что нужно.

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Последний раз редактировалось nik1967, 20-11-2018 в 11:14.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:04, 20-11-2018 | #147


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата nik1967:
ну если уж сокращать, то »
Согласен, там лишние 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;

Цитата nik1967:
Но, можно сделать собственную форму сообщения при нажатии на нужную кнопку, и на ней уже разместить всё, что нужно.
Да, погуглил это дело и везде предлагают только через создание новой формы. Мне как раз сейчас нужно вставить чекбоксы этого красивого кода, подготовленного выше. И у меня стандартный MessageBox отображает окно выбранной папки, которую я собираюсь разделить на части по 4 ГБ для флешек FAT32 с последующей упаковкой. И как раз здесь мне нужны 3 чекбокса, чтобы дать возможность выбора разделения не только по "4 ГБ", но и по "2 ГБ" и "Без ограничений".
Код: Выделить весь код
if MsgBox(ExpandConstant('Выбрана следующая папка :')+#10#10+FolderName+#10#10+ExpandConstant('Вы хотите упаковать папку в PKG менее 4 ГБ?'), mbInformation, MB_YESNO) = IDYES then
Скрин, где вместо 4 ГБ хочу поставить 3 чекбокса:

Есть какой-то готовый вариант для подобного MessageBox? А то у меня уже голова не шарит.

Последний раз редактировалось ErikPshat, 20-11-2018 в 13:59.


Отправлено: 13:40, 20-11-2018 | #148


Аватара для nik1967

Старожил


Сообщения: 440
Благодарности: 251

Профиль | Сайт | Отправить PM | Цитировать


Цитата ErikPshat:
Есть какой-то готовый вариант для подобного 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

-------
Если сообщение оказалось полезным для Вас, то помимо спасибо, можно нажать на "Полезное сообщение".


Последний раз редактировалось nik1967, 20-11-2018 в 16:04.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:10, 20-11-2018 | #149


Аватара для ErikPshat

Пользователь


Сообщения: 54
Благодарности: 11

Профиль | Отправить PM | Цитировать


Цитата nik1967:
Набросал на скорую руку пример »
Спасибо большое! Вы уже в который раз меня выручаете. Кстати, этот MsgBox как раз из той секции, что в прошлый раз вы для меня написали. Тоже хорошее решение исходного кода и пойдёт в копилку однозначно.

Правда я хотел, чтобы это было именно так, как я указал на скриншоте. Я думал, если не получается вставить чекбоксы напрямую в MsgBox, тогда создать новую форму именно такого же MsgBox под замену с чекбоксами и подменить стандартный. Либо наверное лучше было бы вместо чекбоксов сделать там раскрывающийся список.

У вас же выходит кнопкой, опять же на том окне выбора папки. И мне кажется, тогда открывающееся окно по кнопке будет лишним.
Я решил тогда уж сразу использовать ранее предложенное решение на окне выбора папки с чекбоксами, так будет более разумнее с меньшим количеством телодвижений. То есть, в своей проге я откачусь назад на один шаг, где идёт выбор папки и там сразу буду отмечать размеры делений по ГБ. А в MsgBox, как на скрине, буду автоматом отображать выбранный ранее размер.

Только мне нужно заменить, в окне выбора папки, кнопки "Далее >" и "Отмена" на кнопки "Да" и "Нет", потому что у меня не инсталлятор, а как бы авторан.
Может вы мне подскажете, как это нужно организовать? Я просто сам только пару месяцев, как заинтересовался Inno Setup.

Отправлено: 16:23, 20-11-2018 | #150



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 9]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 7] El Sanchez Автоматическая установка приложений 2499 02-02-2015 08:59
Скрипты Inno Setup. Помощь и советы [часть 6] El Sanchez Автоматическая установка приложений 2494 10-03-2014 11:51
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58




 
Переход