Jump to content
Korean Random
EvilAlex

Создание инсталляторов для модпаков на базе Inno Setup

Recommended Posts

3 часа назад, ЛОМ сказал:

 

лучше бы на английском написал )))) так вообще ничего не понятно )))  вот это тебе нужно? 

 


#define Patch               "0.9.20.1.2"
#include "SHFileOperation.iss"

[Code]
var
  DeleteRadioButton, MoveRadioButton, NoneRadioButton: TRadioButton;
  DeleteCashAndLogsCheckBox, DeleteUpdatesCheckBox: TCheckBox;

const
  DeleteDescText =
    'Установщик удалит все файлы в папках.';
  MoveDescText =
    'Установщик сделает резервную копию файлов.';
  NoneDescText =
    'Установщик не будет ничего трогать.';

function BackupCheck_1(): Boolean;
var
  DeleteDescLabel, MoveDescLabel, NoneDescLabel: TLabel;
begin
  DeleteRadioButton:=TRadioButton.Create(WizardForm);
  DeleteRadioButton.SetBounds(0, 120, WizardForm.RunList.Width, 20)
  DeleteRadioButton.Checked:=True;
  DeleteRadioButton.Caption:='Удалить моды';
  DeleteRadioButton.Parent:=WizardForm.SelectDirPage;
  DeleteDescLabel:=TLabel.Create(WizardForm);
  DeleteDescLabel.Parent:=WizardForm.SelectDirPage;
  DeleteDescLabel.Left:=0;
  DeleteDescLabel.Top:=DeleteRadioButton.Top + DeleteRadioButton.Height;
  DeleteDescLabel.Width:=WizardForm.SelectDirPage;
  DeleteDescLabel.Height:=20;
  DeleteDescLabel.AutoSize:=False;
  DeleteDescLabel.Wordwrap:=True;
  DeleteDescLabel.Caption:=DeleteDescText;

  MoveRadioButton:=TRadioButton.Create(WizardForm);
  MoveRadioButton.SetBounds(0, 160, WizardForm.RunList.Width, 20)
  MoveRadioButton.Checked:=False;
  MoveRadioButton.Caption:='Сделать резервную копию модов';
  MoveRadioButton.Parent:=WizardForm.SelectDirPage;
  MoveDescLabel:=TLabel.Create(WizardForm);
  MoveDescLabel.Parent:=WizardForm.SelectDirPage;
  MoveDescLabel.Left:=0;
  MoveDescLabel.Top:=MoveRadioButton.Top + MoveRadioButton.Height;
  MoveDescLabel.Width:=WizardForm.SelectDirPage;
  MoveDescLabel.Height:=20;
  MoveDescLabel.AutoSize:=False;
  MoveDescLabel.Wordwrap:=True;
  MoveDescLabel.Caption:=MoveDescText;

  NoneRadioButton:=TRadioButton.Create(WizardForm);
  NoneRadioButton.SetBounds(0, 200, WizardForm.RunList.Width, 20)
  NoneRadioButton.Checked:=False;
  NoneRadioButton.Caption:='Ничего не трогать';
  NoneRadioButton.Parent:=WizardForm.SelectDirPage;
  NoneDescLabel:=TLabel.Create(WizardForm);
  NoneDescLabel.Parent:=WizardForm.SelectDirPage;
  NoneDescLabel.Left:=0;
  NoneDescLabel.Top:=NoneRadioButton.Top + NoneRadioButton.Height;
  NoneDescLabel.Width:=WizardForm.SelectDirPage;
  NoneDescLabel.Height:=20;
  NoneDescLabel.AutoSize:=False;
  NoneDescLabel.Wordwrap:=True;
  NoneDescLabel.Caption:=NoneDescText;

  DeleteCashAndLogsCheckBox:=TCheckBox.Create(WizardForm);
  DeleteCashAndLogsCheckBox.SetBounds(0, 240, WizardForm.RunList.Width, 20)
  DeleteCashAndLogsCheckBox.Checked:=True;
  DeleteCashAndLogsCheckBox.Caption:='Очистить кэш и логи';
  DeleteCashAndLogsCheckBox.Parent:=WizardForm.SelectDirPage;

  DeleteUpdatesCheckBox:=TCheckBox.Create(WizardForm);
  DeleteUpdatesCheckBox.SetBounds(150, 240, WizardForm.RunList.Width, 20)
  DeleteUpdatesCheckBox.Checked:=True;
  DeleteUpdatesCheckBox.Caption:='Очистить папку Updates, освободив место на диске';
  DeleteUpdatesCheckBox.Parent:=WizardForm.SelectDirPage;
end;

function BackupCheck_2(): Boolean;
begin
  If DeleteRadioButton.Checked then
begin
  DelTree(ExpandConstant('{app}\res_mods'), True, True, True);
  CreateDir(ExpandConstant('{app}\res_mods\{#Patch}'));

  DelTree(ExpandConstant('{app}\mods'), True, True, True);
  CreateDir(ExpandConstant('{app}\mods\{#Patch}'));
end;
end;

function BackupCheck_3(): Boolean;
begin
  If MoveRadioButton.Checked then
begin
  MoveDir(ExpandConstant('{app}\res_mods\'),ExpandConstant('{app}\res_mods\backup\res_mods'));
  CreateDir(ExpandConstant('{app}\res_mods\{#Patch}'));

  MoveDir(ExpandConstant('{app}\mods\'),ExpandConstant('{app}\mods\backup\mods'));
  CreateDir(ExpandConstant('{app}\mods\{#Patch}'));
end;
end;

function BackupCheck_4(): Boolean;
begin
  If DeleteCashAndLogsCheckBox.Checked then
begin
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\account_caches\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\awesomium_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\battle_results\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\clan_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\custom_data\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\dossier_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\messenger_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\tutorial_cache\'), True, True, True);
  DelTree(ExpandConstant('{userappdata}\wargaming.net\WorldOfTanks\xvm'), True, True, True);
end;
end;

function BackupCheck_5(): Boolean;
begin
  If DeleteUpdatesCheckBox.Checked then
begin
  DelTree(ExpandConstant('{app}\Updates'), True, True, True);
  CreateDir(ExpandConstant('{app}\Updates'));
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
BackupCheck_2();
BackupCheck_3();
BackupCheck_4();
BackupCheck_5();
end;
end;

procedure InitializeWizard1();
begin
  BackupCheck_1();
end;




procedure InitializeWizard2();
begin
InitInfo();
end;

procedure InitializeWizard();
begin
 InitializeWizard1();
 InitializeWizard2();
end;

 

 

 

I try it but i see a wrong some...

 

 

hata1.JPG

Share this post


Link to post

Short link
Share on other sites

как можно сделать отключалку для компонента если выбран другой опред. компонент?

конкретно на примере disable_Components.iss

если выбран subComponent1 отключался бы subComponent3
если выбран subComponent2 отключался бы subComponent4

 

Edited by tunut

Share this post


Link to post

Short link
Share on other sites
5 часов назад, tunut сказал:

как можно сделать отключалку для компонента если выбран другой опред. компонент?

конкретно на примере disable_Components.iss

если выбран subComponent1 отключался бы subComponent3
если выбран subComponent2 отключался бы subComponent4

 

 

А так не? 

 

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "My Program"
#define MyAppVersion "1.5"
#define MyAppPublisher "My Company, Inc."
#define MyAppURL "http://www.example.com/"
#define MyAppExeName "MyProg.exe"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{E19D7322-450D-48AC-8AE6-9C0BF2A42CE6}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
OutputDir=.

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Components]

Name: Component0; Description: на выбор; Flags:  disablenouninstallwarning

Name: F\1; Description: ПЕРВЫЙ ВАРИАНТ; Flags: exclusive disablenouninstallwarning
Name: F\1\1; Description: Component 1
Name: F\1\2; Description: Component 2

Name: FF\0; Description: ВТОРОЙ ВАРИАНТ; Flags: exclusive disablenouninstallwarning
Name: FF\0\1; Description: Component 3
Name: FF\0\2; Description: Component 4

[Files]
Source: "C:\Program Files (x86)\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

 

Share this post


Link to post

Short link
Share on other sites
30 минут назад, ЛОМ сказал:

А так не?

спасибо но нет, 

нужно именно чтобы отключался т.е. стал серым

если поставить галочку на Component1 - Component3 стал бы серым

галочку снять = оба доступны

 

Share this post


Link to post

Short link
Share on other sites
3 минуты назад, tunut сказал:

спасибо но нет, 

нужно именно чтобы отключался т.е. стал серым

если поставить галочку на Component1 - Component3 стал бы серым

галочку снять = оба доступны

 

Флагом Flags: exclusive поиграйся я так делал, но он не всегда подходит читай справку и примеры с этим флагом

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
1 минуту назад, Nowik1971 сказал:

Флагом Flags: exclusive поиграйся

поигрался и в справке читал, это не то

 

Share this post


Link to post

Short link
Share on other sites
17 минут назад, tunut сказал:

поигрался и в справке читал, это не то

 

Fixed в конце поставь и будет серым

 

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

да ему не именно серым надо))) он имеет ввиду если выбран 1 пункт то нельзя выбрать 3 а если выбран 2 то нельзя выбрать 4. Fixed тут не прокатит ведь. а серым он должен становится потому что нельзя уже выбрать)))  

Edited by ЛОМ

Share this post


Link to post

Short link
Share on other sites
10 минут назад, enisgecgen сказал:

Hello again,

how can we display the photos in a separate window ?

Example : Aslain.com have show preview window button

 

если гугл переводчик правильно перевёл то это то что тебе нужно :biggrin: https://koreanrandom.com/forum/topic/9050-создание-инсталляторов-для-модпаков-на-базе-inno-setup/?do=findComment&comment=137089

Edited by ЛОМ

Share this post


Link to post

Short link
Share on other sites
3 минуты назад, ЛОМ сказал:

 

если гугл переводчик правильно перевёл то это то что тебе нужно :biggrin: https://koreanrandom.com/forum/topic/9050-создание-инсталляторов-для-модпаков-на-базе-inno-setup/?do=findComment&comment=137089

 

Now i can see this style :)

 

but i want to aslain stlye :) one sec i will add pictures.

 

 

asla1.JPG

asla2.JPG

Share this post


Link to post

Short link
Share on other sites
6 hours ago, tunut said:

как можно сделать отключалку для компонента если выбран другой опред. компонент?

конкретно на примере disable_Components.iss

если выбран subComponent1 отключался бы subComponent3
если выбран subComponent2 отключался бы subComponent4

 

Например:

[Code]
Procedure ComponentsListOnClickCheck(Sender: TObject);
begin
 with WizardForm.ComponentsList do
 begin
  if IsComponentSelected('Component0\subComponent1') then
   CheckItem(Items.IndexOf('Component 3'), coUncheck);

  if IsComponentSelected('Component0\subComponent2') then
   CheckItem(Items.IndexOf('Component 4'), coUncheck);
 end;
end;

Procedure InitializeWizard();
begin
 WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;

Но это не удобно. Можно сделать универсальнее.

Edited by Kotyarko_O
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
12 минуты назад, Kotyarko_O сказал:

Например:

вот:no1:

только серым отключаемый компонент не становиться, просто невозможно его выбрать

 

13 минуты назад, Kotyarko_O сказал:

Можно сделать универсальнее.

эмммк ак ?

Share this post


Link to post

Short link
Share on other sites

@tunut 
В идеале, сделать регистрацию "несовместимых" компонентов в более-менее удобном виде, однострочно. Ну и проверка, естественно, автоматическая, а не "вручную".

Типа такого в итоге:

Procedure InitializeWizard();
begin
 ...
 SetUncompatibleItems(['Component 1'], ['Component 2', 'Component 3']);
 SetUncompatibleItems(['Component 2'], ['Component 3']);
end;

То есть, при выборе какого-нибудь компонента из заданного первого массива, будут отключаться все заданные из второго. В реализации ничего сложного: заполняем тип, проверку делаем из того же события (OnClickCheck), в котором просто подстановка и действия.

А чтобы сделать компонент "серым", просто ему допиши Enabled := False.

  • Upvote 1

Share this post


Link to post

Short link
Share on other sites
2 часа назад, Kotyarko_O сказал:

В реализации ничего сложного

ещё бы... прочел дальше и понял что это текст заклинания какого то, ничего  в ум не пришло что и как сделать.

Share this post


Link to post

Short link
Share on other sites

@tunut 
Как-то так: disable_Components.iss

Теперь группы компонентов, которые нужно сделать "зависимыми", указываются просто:

SetUncompatibleItems(CheckListBox, [priority components 1], [depended components 1]);
SetUncompatibleItems(CheckListBox, [priority components 2], [depended components 2]);

 

Edited by Kotyarko_O
  • Upvote 2

Share this post


Link to post

Short link
Share on other sites
6 часов назад, Kotyarko_O сказал:

указываются просто:

круть,

а где прикрутить Enabled := False. ?

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...