Войти

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


Страниц : 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

saurn
21-05-2013, 15:33
Aquila, я просто не совсем понял, что подразумевается под использовать несколько ключей установки. Имеется ввиду установка через ком.строку с различными параметрами?

Aquila
21-05-2013, 15:37
Имеется ввиду установка через ком.строку с различными параметрами? »
Да

saurn
21-05-2013, 15:40
Aquila, всё, что могу подсказать по этому вопросу: использовать файл ответов - свой для каждой конфигурации.
/LOADINF="filename"
Указывает инсталлятору загрузить параметры установки из указанного файла после проверки командной строки. Этот файл может быть подготовлен с помощью '/SAVEINF=' command.

Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

/SAVEINF="filename"
Указывает инсталлятору сохранять параметры установки в указанный файл.

Не забудьте ставить кавычки при использовании имен, содержащих пробелы.

Все параметры командной строки Inno (http://jrsoftware.org/ishelp/topic_setupcmdline.htm)

Aquila
21-05-2013, 15:44
saurn, Об этом я знаю :sorry: Придётся использовать NSIS (там есть то что я хочу).

saurn
21-05-2013, 15:50
Aquila, насчет добавления ярлыков в различные дериктории: в секции [Tasks] можно задать опционально для всех ярлыков, а потом через ком. строку выбирать необходимые ярлыки
/TASKS="desktopicon,groupicon" Тот же способ и для компонентов. Пожалуй это и всё.

Crazy Noise
21-05-2013, 16:00
saurn, Благодарю!
Скрипт рабочий, если добавить в него [Dirs].
[Dirs]
Name: {userdocs}\GameEX

[code]
var
SerialPage: TWizardPage;
Block_1, Block_2, Block_3, Block_4: TNewEdit;
sNumber: String;

procedure InitializeWizard();
begin
SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');

Block_1 := TNewEdit.Create(nil);
with Block_1 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;

Block_2 := TNewEdit.Create(nil);
with Block_2 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;

Block_3 := TNewEdit.Create(nil);
with Block_3 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;

Block_4 := TNewEdit.Create(nil);
with Block_4 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
case CurStep of
ssPostInstall: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
end;
end;

Но что делать если использовать второй вариант //или вместо шага CurStepChanged записывать серийник в файл при нажатии "Далее" на этой странице.
(*function NextButtonClick(CurPageID:integer): Boolean;
begin
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
case CurPageID of
SerialPage.ID: SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
end;
Result := True;
end;*)
где создание папки GameEX через [Dirs] не прокатит?

saurn
21-05-2013, 16:06
Crazy Noise, не подумал, что папки изначально не существует)
function NextButtonClick(CurPageID:integer): Boolean;
begin
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
case CurPageID of
SerialPage.ID:
begin
CreateDir(ExpandConstant('{userdocs}\GameEX'));
SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, True);
end;
end;
Result := True;
end;

Crazy Noise
21-05-2013, 16:50
saurn, Благодарю.
не подумал, что папки изначально не существует) »Да это я ничего про папку не упомянул, не думал что так получится.


Aquila, Попробую привести пример на основе bat+ini, т.е bat-ник подхватывает настройки указанные в файле ini


[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DefaultGroupName=My Application
OutputBaseFilename=setup
OutputDir=.

[Icons]
Name: "{group}\{cm:UninstallProgram,My Application}"; Filename: "{uninstallexe}"

[Components]
Name: a; Description: A; Types: full custom compact; Flags: checkablealone
Name: a\a; Description: A\A; Types: custom compact; Flags: dontinheritcheck
Name: a\b; Description: A\B; Types: custom compact; Flags: dontinheritcheck
Name: a\c; Description: A\C; Types: custom compact; Flags: dontinheritcheck

[Tasks]
Name: a; Description: A; Flags: checkablealone
Name: a\a; Description: A\A; Flags: dontinheritcheck
Name: a\b; Description: A\B; Flags: unchecked dontinheritcheck
Name: a\c; Description: A\C; Flags: unchecked dontinheritcheck


setup.exe /LoadInf=".\unattended.ini"

[Setup]
Components=a,a\b,a\c
Tasks=a,a\b,a\c

таким образом, можно ювелирно всё настроить.
Так же можно подсмотреть в ветке реестра
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Application_is1
Inno Setup: Selected Components
Inno Setup: Selected Tasks
и т.д.

аналогично без использования ini, будет выглядеть примерно так setup.exe /Components="a,a\b,a\c" /Tasks="a,a\b,a\c"

Ниже прикрутил архив.

saurn
21-05-2013, 16:58
Crazy Noise, еще можно реализовать проверку на присутствие файла с серийником, и если он есть, не создавать или пропускать страницу ввода(например при переустановке поверх).

Crazy Noise
21-05-2013, 17:08
saurn, И об этом я не подумал. Угадываешь мысли?
Пример можно? Не силён в таких мелочах.

saurn
21-05-2013, 17:26
Crazy Noise, вот самодостаточный пример. Единственный его минус, точнее два минуса: будет работать только, если всегда вводится один и тот же серийник, и второй минус - чувствительность к регистру букв в серийнике. Ну а принцип прост: если определенный серийный номер(серийник задается в константе) не найден, страница создается. В противном случае пропускается. Короче, если даже *.ini файл присутствует, но он пустой, или в нем указан другой серийник страница будет создана. Чтение строки из файла воспроизвел по мотивам примера от Johny777)
[Code]
const
SERIAL_NUMBER = '1234-5678-ABCD-EFGH';

var
SerialPage: TWizardPage;
Block_1, Block_2, Block_3, Block_4: TNewEdit;
sNumber, OldNumber: String;

function PreviousData(const SearchNumber: String): Boolean;
begin
if OldNumber = '' then LoadStringFromFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), OldNumber);
Result := Pos(SearchNumber, OldNumber) > 0;
end;

procedure InitializeWizard();
begin
SerialPage := CreateCustomPage(wpSelectTasks, 'Serial number', 'Please insert serial number');

Block_1 := TNewEdit.Create(nil);
with Block_1 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(96), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;

Block_2 := TNewEdit.Create(nil);
with Block_2 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(152), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;

Block_3 := TNewEdit.Create(nil);
with Block_3 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(208), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;

Block_4 := TNewEdit.Create(nil);
with Block_4 do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(265), ScaleY(98), ScaleX(50), ScaleY(21));
Text := '';
MaxLength := 4;
end;
end;

function NextButtonClick(CurPageID:integer): Boolean;
begin
case CurPageID of
SerialPage.ID:
begin
CreateDir(ExpandConstant('{userdocs}\GameEX'));
sNumber := ExpandConstant(Block_1.Text + '-' + Block_2.Text + '-' + Block_3.Text + '-' + Block_4.Text);
SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), sNumber, False);
end;
end;
Result := True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageID of
SerialPage.ID: Result := PreviousData(SERIAL_NUMBER);
end;
end;

Crazy Noise
21-05-2013, 17:48
Единственный его минус, точнее два минуса: будет работать только, если всегда вводится один и тот же серийник, и второй минус - чувствительность к регистру букв в серийнике. »Ну с этим проблем нет, точнее проверка присутствия ключа в файле *.ini не обязательна, т.к сам файл не может быть пустым в любом случае. Потому что файла либо нет совсем, либо есть но с серийным номером, по другому никак. Тут либо инсталлятор создаст серийный номер, либо при запуске игры/прогаммы запросит ввод ключа.
Тут может быть только одно, это проверка присутствия самого файла ini.

by_gangster
21-05-2013, 18:43
Gnom_aka_Lexander, Пришёл домой и скачал с nanozip.net, но там нету скриптов... Где их взять ?

saurn
21-05-2013, 18:53
Crazy Noise, ну если так, то можно ограничится только поиском файла. Изменил условие, плюс немного переделал скрипт. Получился короче. Но, опять таки же, не проверял)
[CustomMessages]
MESSAGES_1=Ввод серийного номера
MESSAGES_2=Серийный номер нужен для активации программного обеспечения.
MESSAGES_3=Для активации необходимо ввести серийный номер поставляемый в комплекте с программным обеспечением.

[code]
var
SerialPage: TWizardPage;
Edits: array [1..4] of TEdit;
I, E: Integer;
SerialPage_Label: TNewStaticText;
sNumber: String;

function EditsNumber(): string;
begin
for I := 1 to 4 do
begin
sNumber := sNumber + Edits[I].Text + '-';
end;
sNumber := Copy(sNumber, 1, Length(sNumber) - 1);
Result := sNumber;
end;

procedure InitializeWizard();
begin
SerialPage := CreateCustomPage(wpSelectTasks, CustomMessage('MESSAGES_1'), CustomMessage('MESSAGES_2'));
SerialPage_Label := TNewStaticText.Create(nil);
with SerialPage_Label do
begin
Parent := SerialPage.Surface;
SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(28));
WordWrap := True;
Caption := CustomMessage('MESSAGES_3');
end;

E := ScaleX(73);

for I := 1 to 4 do
begin
Edits[I]:= TEdit.Create(nil);
with Edits[I] do
begin
Parent:= SerialPage.Surface;
SetBounds(0 + (E*I), ScaleY(47), ScaleX(47), ScaleY(21));
MaxLength:= 4;
end;
end;
end;

function NextButtonClick(CurPageID:integer): Boolean;
begin
case CurPageID of
SerialPage.ID:
begin
CreateDir(ExpandConstant('{userdocs}\GameEX'));
SaveStringToFile(ExpandConstant('{userdocs}\GameEX\keysgame.ini'), EditsNumber, False);
end;
end;
Result := True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
case PageID of
SerialPage.ID: Result := FileExists(ExpandConstant('{userdocs}\GameEX\keysgame.ini'));
end;
end;

Gnom_aka_Lexander
21-05-2013, 18:57
by_gangster, а кто сказал, что там обязаны быть скрипты под инно? я-ж писал - с функциями exec думаю, разберешься без посторонней помощи? в справке к нанозипу однозначно есть пример распаковки командами.

by_gangster
21-05-2013, 19:57
Gnom_aka_Lexander, Короче просто напросто подскажи как сжать игру размером 8.52 ГБ ? У меня сжимет только до 7.20 Гб

Mailchik
21-05-2013, 20:01
Короче просто напросто подскажи как сжать игру размером 8.52 ГБ ? У меня сжимет только до 7.20 Гб »
Короче никак.
----------------------------------------------------------------------------------------------------
Здравствуйте. Моя трабла такова, хочу сделать установочник в котором хотел бы использовать несколько ключей установки, в частности для добавления в различные директории ярлыки программы, подскажите пожалуйста кто чем может. »
Накидал пример..
Если среди ключей запуска есть 'iGroup' - создаётся ярлык в меню пуск, 'iDesktop' - создаётся ярлык на рабочем столе, если оба ключа - создаются оба ярлыка.. Принцип думаю ясен.
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Icons]
Name: {group}\test; Filename: {srcexe}; WorkingDir: {src}; IconFilename: {srcexe}; Check: CheckParam('iGroup');
Name: {commondesktop}\test; Filename: {srcexe}; WorkingDir: {src}; IconFilename: {srcexe}; Check: CheckParam('iDesktop');

[Code]
function CheckParam(s: string): boolean;
var
i: integer;
begin
for i := 0 to ParamCount do begin
Result := ParamStr(i) = s;
if Result then Break;
end;
end;

Aquila
21-05-2013, 20:07
Mailchik, А можно по подробнее? Например в командной строке какой ключ надо ввести чтобы создался ярлык на рабочем столе? Или это опять же через /LOADINF?

Gnom_aka_Lexander
21-05-2013, 20:14
какой ключ надо ввести чтобы создался ярлык на рабочем столе? »
'iDesktop' - создаётся ярлык на рабочем столе »

Mailchik
21-05-2013, 20:15
Aquila, setup.exe iDesktop - создастся ярлык на рабочем столе..
изучите код, который я выше написал.. в секции Icons идёт проверка на каждый ярлык. Для рабочего стола идёт Check: DesktopIcon;, для меню "Пуск" - Check: GroupIcon;




© OSzone.net 2001-2012