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

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

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

Ветеран


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


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

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


Изменения
Автор: Serega
Дата: 13-08-2011
Вложения
Тип файла: 7z Inno Setup [все вопросы] часть 1.7z
(1.34 Mb, 908 просмотров)
Тип файла: 7z Inno Setup [все вопросы] часть 2.7z
(3.12 Mb, 806 просмотров)
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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] - Скачать;

  • InnoSetup Script Joiner - Программа для объединения нескольких скриптов InnoSetup в один;

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


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2

-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.


Отправлено: 00:28, 04-11-2010

 

Новый участник


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

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


45king,
Цитата:
а как сделать чтобы при удалении игры появлялась сообщение вы хотите удалить сохранение игры да или нет? »
Так можно:
читать дальше »

[Registry]
Root: HKLM; SubKey: SOFTWARE\Chuvakstepan\Spider-man3; ValueType: string; ValueName: PathGame; ValueData: {app}; Flags: uninsdeletekey

[code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var ResultStr:String;
begin
if CurUninstallStep=usPostUninstall then
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Chuvakstepan\Spider-man3', 'UnInstConfirm', ResultStr)
if DirExists(ExpandConstant('{userdocs}')+'\Activision\Spider-Man 3') then
if MsgBox('Удалить сохраненные игры',mbconfirmation, mb_YesNo) = IDYES then
begin
if not DelTree(ExpandConstant('{userdocs}')+'\Activision\Spider-Man 3', True, True, True)
then
MsgBox('Папка не удалена!' #13#13 'Папка не существует или задействована.', mbError, MB_OK);
end;
end;
end;

P.S> На этом сайте ты можешь найти всё что тебе нужно
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:07, 24-07-2011 | #2401



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

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


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


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

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


Доброго времени суток!

Нашел на форуме как добавить дополнительное окно в скрипт, которое просит ввести какую то доп информацию до установки приложения:

Код: Выделить весь код
var
  UserPage: TInputQueryWizardPage;

procedure InitializeWizard;
begin
  UserPage := CreateInputQueryPage(wpWelcome,
    'Доп. информация', 'ВНИМАНИЕ! доп инфо ');
  UserPage.Add('Количество :', False);
  UserPage.Add('ни о чем:', True);
end;
Все хорошо. Я даже нашел как проверить, что данные введены:
Код: Выделить весь код
function NextButtonClick(CurPageID: Integer): Boolean;
var
  I: Integer;
begin
  Result := True;
  if CurPageID = UserPage.ID then begin
    if UserPage.Values[0] = '' then begin
      MsgBox('Вы должны че нить ввести в первое поле', mbError, MB_OK);
      Result := False;
    end;
  end;
end;
Вопрос! Как проверить, что в UserPage.Values[0] введено число, а не просто текст?
И, если это возможно, как проверить что число попало в промежуток, например от -10 до 10.
Заранее благодарен.

Отправлено: 18:42, 25-07-2011 | #2402


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Gugle:
Вопрос! Как проверить, что в UserPage.Values[0] введено число, а не просто текст?
И, если это возможно, как проверить что число попало в промежуток, например от -10 до 10. »
Так, както:

читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
var
UserPage: TInputQueryWizardPage;

procedure InitializeWizard;
begin
UserPage:= CreateInputQueryPage(wpWelcome, 'название страницы','Тема страницы','Служебная подпись страницы');
UserPage.Add('Количество :', False);
UserPage.Add('ни о чем:', True);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
// проверяем, что поле не пустое
if CurPageID = UserPage.ID then begin if UserPage.Values[0] = '' then begin
MsgBox('Вы должны что-нибудь ввести в первое поле', mbError, MB_OK);
Result := False; Exit; end;
// проверяем, что введено именно число
if AnsiUppercase(UserPage.Values[0])<>AnsiLowercase(UserPage.Values[0]) then begin
MsgBox('Допустимо вводить только цифры', mbError, mb_Ok);
Result := False; Exit; end;
// проверяем, что модуль числа, не зависимо от знака, не превышает 10. (как раз попадаем в диапазон от -10 до 10)
if Abs(StrToInt(UserPage.Values[0]))>10 then begin
MsgBox('за пределами допустимых значений', mbError, mb_Ok); Result := False; Exit; end;
end; end;

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.


Последний раз редактировалось Gnom_aka_Lexander, 25-07-2011 в 20:49.

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

Отправлено: 20:03, 25-07-2011 | #2403


Аватара для Gnom_aka_Lexander

Ветеран


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

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


Цитата Neutron:
страницу выбора папки установки, папки меню пуск и.т.д »
А их всего два во всем инсталляторе -
Код: Выделить весь код
procedure InitializeWizard();
begin
WizardForm.DirEdit.AutoSelect:= False;
WizardForm.GroupEdit.AutoSelect:= False;
end;

-------
Я люблю помогать. Но не путайте: "Помогите мне" и "Сделайте за меня" - это совершенно разные понятия.

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

Отправлено: 20:42, 25-07-2011 | #2405


Новый участник


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

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


есть код декодирования OGG. Нужно сделать что бы еще и WV декодировалось. Объединяю оба один за другим, но беда в том, что oни получаются идентичны (кроме переменных) и используют одну и туже функцию StringToArray и при компиляции ругается, что во втором куске она продублирована.
Как прописать ее для обоих участков кода, для 3х участков?

читать дальше »


[code1]
var
Files1: Array of String;
S1: String;
n1: Integer;

Function StringToArray(Text, Cut: String): array of String;

var i1, k1: Integer;

Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k1:= Pos(Cut,Text);
if k1 = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i1:= GetArrayLength(Result) -1;
if k1 = 0 then
Result[i1]:=Text
else begin
Result[i1]:= Copy(Text, 1, k1 -1); Delete(Text, 1, Length(Result[i1]) + Length(Cut));
end;
Until Length(Text) * k1 = 0;
End;

procedure FindFiles(FromDir: String; Mask: String);
var FSR, DSR: TFindRec; FindResult: Boolean;
begin
FindResult:= FindFirst(AddBackslash(FromDir)+Mask, FSR)
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
S1:= S1 + AddBackslash(fromDir) + FSR.Name +'|';
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR)
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
FindFiles(AddBackSlash(FromDir)+ DSR.Name, Mask)
end;
FindResult:= FindNext(DSR);
end;
FindClose(FSR); FindClose(DSR)
end;

procedure RecodeOgg;
var ResultCode: integer;
CurFile: String;

begin
FindFiles(ExpandConstant('{app}\ogg\sound\'), '*.ogg') //Находим все файлы по маске, в выбранной папке
Files1:= StringToArray(S1, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files1)-1; //Получаем кол-во файлов
for n1:=(GetArrayLength(Files1)-1) downto 0 do begin
CurFile:= Files1[n1]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}\ogg\sound\')), '')
Exec(ExpandConstant('{app}\ogg\sound\oggdec.exe'), '-Q '+ AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files1[n1]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files1[n1]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\ogg\sound\oggdec.exe'))
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.ProgressGauge.Position := 0;
WizardForm.StatusLabel.Caption := 'Decompressing audio files, please wait...';
RecodeOgg;
end;
end;



//-------распаковка WV ------------------------------------------------


[code2]
var
Files2: Array of String;
S2: String;
n2: Integer;

Function StringToArray(Text, Cut: String): array of String; //стопор, т.к уже дублируется в предыдущем коде

var i2, k2: Integer;

Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k2:= Pos(Cut,Text);
if k2 = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i2:= GetArrayLength(Result) -1;
if k2 = 0 then
Result[i2]:=Text
else begin
Result[i2]:= Copy(Text, 1, k2 -1); Delete(Text, 1, Length(Result[i2]) + Length(Cut));
end;
Until Length(Text) * k2 = 0;
End;

procedure FindFiles(FromDir: String; Mask: String);
var FSR, DSR: TFindRec; FindResult: Boolean;
begin
FindResult:= FindFirst(AddBackslash(FromDir)+Mask, FSR)
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
S2:= S2 + AddBackslash(fromDir) + FSR.Name +'|';
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR)
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
FindFiles(AddBackSlash(FromDir)+ DSR.Name, Mask)
end;
FindResult:= FindNext(DSR);
end;
FindClose(FSR); FindClose(DSR)
end;

procedure RecodeWV;
var ResultCode: integer;
CurFile: String;

begin
FindFiles(ExpandConstant('{app}\WV\sound\'), '*.wv') //Находим все файлы по маске, в выбранной папке
Files2:= StringToArray(S2, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files2)-1; //Получаем кол-во файлов
for n2:=(GetArrayLength(Files2)-1) downto 0 do begin
CurFile:= Files2[n2]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}\WV\sound\')), '')
Exec(ExpandConstant('{app}\WV\sound\wvunpack.exe'), '-t -q -y '+ AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files2[n2]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files2[n2]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\WV\sound\wvunpack.exe'))
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.ProgressGauge.Position := 0;
WizardForm.StatusLabel.Caption := 'Decompressing audio files, please wait...';
RecodeWV;
end;
end;


Отправлено: 21:39, 25-07-2011 | #2406


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


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

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


Лександер, спасибо большое.

Еще вопросы:
1. Можно ли в *.ini файлы добавлять секции не "[название_секции]", а ";название_секции"? Если да, то как?
2. Как добавить полученное мной значение из предыдущего примера "UserPage.Values[0]" в *.ini файл? По всей вероятности надо использовать глобальную переменную, но пока понятного для себя примера не нашел.

Заранее благодарен!

Отправлено: 10:04, 26-07-2011 | #2407


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


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

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


Второй вопрос отпал. Нашел описание, разобрался.
первый вопрос, об изменении записи названия секции остался.

Отправлено: 11:51, 26-07-2011 | #2408


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


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

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


По поводу первого вопроса.
Собрав инфу по частям сделал следующий пример:
[code]
Код: Выделить весь код
procedure UpdateIni();
var
  IniFileName: String;
  StrArray: TArrayOfString;
begin
  IniFileName := ChangeFileExt(ExpandConstant(CurrentFileName), '.ini'); // 1
  if not IniKeyExists('settings', 'TestName', IniFileName) then begin            // 2
    SetArrayLength(StrArray, 2);
    StrArray[0] := '; name и по русски то же';
    StrArray[1] := 'TestName=name.txt';
    SaveStringsToFile(IniFileName, StrArray, True);
  end else begin
    SetIniString('settings', 'newTestName', 'newname.txt', IniFileName);     // 3
  end;
end;
Проблема в том, что для отработки кода в строке 2, в *.ini файле необходима запись:
Цитата:
[settings]
TestName=firstName.txt
А мне нужна реакция на
Цитата:
;settings
TestName=firstName.txt
Строка кода 3, вставляет в *.ini файл данные следующего содержания:
Цитата:
[settings]
newTestName=newname.txt
А мне опять таки надо:
Цитата:
;settings
newTestName=newname.txt
Гуру, помогите плз.

Отправлено: 13:59, 26-07-2011 | #2409


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


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

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


Все. Первый вопрос отпал сам собой. Однако, если кто-то найдет решение, то я с удовольствием его посмотрю, т.к. проблема может возникнуть снова.

Родился следующий вопрос.
После инсталяции приложения, мне необходимо размножить (или скопировать) одну из папок. Скачав InnoSetupFAQ_ru-board.chm я нашел там решение этой проблемы с помощью скрипта "SHFileOperation.iss". Однако при удалении приложения эти размноженные папки не удаляются, а хотелось бы, что бы удалялись.
Что для этого нужно сделать?

Отправлено: 15:07, 26-07-2011 | #2410



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Утилиты - [addon] Inno Setup CrOsP Наборы обновлений для Windows XP/2003/Windows 7 33 11-05-2011 16:03
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Inno Setup 5.3.6 OSZone Software Новости программного обеспечения 0 15-11-2009 17:30
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход