Jump to content
Korean Random
EvilAlex

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

Recommended Posts

В инсталляторе?

Проверь актуальность библиотеки.

была старая, ща все ок

как в CurPageChanged сделать проверку на страницу есть ли она или нет?

нужно для этого

procedure NextButtonChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectTasks then
  begin
    WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
  end else if CurPageID = ISCustomPage7.ID then
  begin
    WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
  end;
end;

как правильно записать?

Share this post


Link to post

Short link
Share on other sites
как в CurPageChanged сделать проверку на страницу есть ли она или нет?

нужно для этого

Отображение страниц wpSelectTasks или ISCustomPage7 зависит от чего-то в ходе работы программы? Если да, то какая страница и от чего зависит?

Просто проверку можно делать опираясь на эти зависимости.

 

Каждая стандартная страница есть всегда для самой программы, а вот показывается ли она пользователю - другой вопрос (кроме случаев со страницами, которые могут отключаться через [setup], тут проверку можно делать препроцессором). Что касается кастомных страниц, то тут всё зависит от того, как реализовано её создание. Например, если она создаётся всегда и в зависимости от определённых параметров, выбираемых пользователем, пропускается (ShouldSkipPage и т.д.), то это не совсем правильно. Т.к. она будет существовать вне зависимости от параметров, выбранных пользователем. И подобную проверку не сделать (разве что вводить сторонние переменные, от которых будет определяться её отображение). Если же страница создаётся на определённом этапе (что всё же правильней в твоём случае), то можно будет проверять её наличие. Типа такого:

procedure NextButtonChanged(CurPageID: Integer);
begin
 if Assigned(ISCustomPage7) then
  if CurPageID = ISCustomPage7.ID then
  begin
   WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
  end;
 else
  if CurPageID = wpSelectTasks then
   WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
end;
Edited by Kotyarko_O
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@Kotyarko_O, если есть [tasks] то заменять кнопку на стр таска, если нет то заменять на ISCustomPage7

Share this post


Link to post

Short link
Share on other sites
если есть [tasks] то заменять кнопку на стр таска, если нет то заменять на ISCustomPage7

Пфф. Тогда динамики тут никакой нет и придумывать ничего не надо, всё же очевидно. Редактируй перед компиляцией да и всё. Вводишь секцию [Tasks] - пишешь "CurPageID = wpSelectTasks"; убираешь секцию - "CurPageID = ISCustomPage7.ID".

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

Всем привет

 

Нужна помощ по такому вопросу. Есть три разные папки но с одинаковыми файлами внутри. Не спрашивайте почему и зачем так но так надо )  Хочется запаковать эти папки в инсталятор так что бы эти папки со своим содержимым не копировались внутрь самого установочного файла три раза , а только один ведь файлы внутри одинаковые. А  при установки инсталятор их содержимое разбросал бы по трем папкам сам. Пробовали три раза указать один и тотже source но разные distdir но выходит по логу что инсталятор все равно копирует в установочный файл все 3 раза одну и ту же папку. Такое реально сделать вобще или нет ?

Share this post


Link to post

Short link
Share on other sites

Всем привет

 

Нужна помощ по такому вопросу. Есть три разные папки но с одинаковыми файлами внутри. Не спрашивайте почему и зачем так но так надо )  Хочется запаковать эти папки в инсталятор так что бы эти папки со своим содержимым не копировались внутрь самого установочного файла три раза , а только один ведь файлы внутри одинаковые. А  при установки инсталятор их содержимое разбросал бы по трем папкам сам. Пробовали три раза указать один и тотже source но разные distdir но выходит по логу что инсталятор все равно копирует в установочный файл все 3 раза одну и ту же папку. Такое реально сделать вобще или нет ?

Чтобы не заморачиваться с кодом паскаля могу предложить такую схему:

Упаковываем все файлв в инталлятор и распаковываем их все в ТМП...

Source: {papka}\1.json; DestDir: {tmp}; Flags: ignoreversion deleteafterinstall; Components: c1 c2 c3

Затем устанавливаем из ТМП туда, куда надо:

Source: {tmp}\1.json; DestDir: {app}\res_mods\1\; Flags: external ignoreversion skipifsourcedoesntexist; Components: c1
Source: {tmp}\1.json; DestDir: {app}\res_mods\2\; Flags: external ignoreversion skipifsourcedoesntexist; Components: c2
Source: {tmp}\1.json; DestDir: {app}\res_mods\3\; Flags: external ignoreversion skipifsourcedoesntexist; Components: c3

 

 

по логу что инсталятор все равно копирует в установочный файл все 3 раза
 

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

  • Upvote 2
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Спасибо за помощ

Какая то ерунда творится. По логам он вроде бы пробегает по одной и той же папке несколько раз, а в итоге в инсталятор пакует только один раз. Сейчас для теста положил в одну папку архив с видосом на 100 мегабайт и написал в коде source тестовой папки destdir 5 раз с разными именами, в итоге размер инсталятора ни стал 500 мегабайт и больше. Получается инно все таки это отслеживает и в логах пишет одно а на самом деле не пакует все по нескольку раз. У нас просто папки были не большие по размерам вот и не могли сразу проверить как оно работает и ориинтрировались только на лог ) Извиняюсь за беспокойство. Проблема снята.

Share this post


Link to post

Short link
Share on other sites

Доброе время суток! У кого-то есть пример скрипта кнопки доната?

Edited by voin_123

Share this post


Link to post

Short link
Share on other sites

У кого-то есть пример скрипта кнопки доната ( Похожую на мод пак от Kotyarko_O)?

Только там у меня не кнопки доната, а просто переход по ссылкам. Но думаю, это тебе и нужно.

Сделано просто: ботвой загружается изображение (здесь), сверху накладывается прозрачный лейбл (здесь), в котором выполняется действие при нажатии (здесь).

 

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

Share this post


Link to post

Short link
Share on other sites

Народ, всем привет! Есть какой-нибудь скрипт для проверки версии клиента игры перед установкой?

на первых стр темы, читай, ищи

Share this post


Link to post

Short link
Share on other sites

 

 

Есть какой-нибудь скрипт для проверки версии клиента игры перед установкой?
Function FileVersion(const FilePath: String): String;
var
 oFS: Variant;
begin
 oFS := CreateOleObject('Scripting.FileSystemObject');
 try
  Result := oFS.GetFileVersion(FilePath);
 except
 end;
end;

То есть, в текущий момент, вызов вида:

FileVersion(ExpandConstant('{app}\WorldOfTanks.exe'))

вернёт: 0.9.14.0. Дальше сравнивайте это со своей объявленной версией.

Share this post


Link to post

Short link
Share on other sites

 

 

У меня че то не работает!
Показывайте код, который у вас не работает.

Share this post


Link to post

Short link
Share on other sites

У меня че то не работает! Мне нужно, чтобы на странице с выбором папки с игрой при нажатии на кнопку "Далее" происходила проверка версии клиента игры и, если она не актуальная (то есть не 0.9.14), выводил сообщение типа "Модпак предназначен для версии 0.9.14 игры! Обновите клиент игры до актуальной версии!".

 

'Code for "wpSelectDir" '

#define WotVersion "0.9.14"
#define WotExeVersion "0.9.14.0"

[code]

function FileVersion(const FilePath: String): String;
var
  oFS: Variant;
begin
  oFS:= CreateOleObject('Scripting.FileSystemObject');
    try
      Result:= oFS.GetFileVersion(FilePath);
    except
  end;
end;

function NextButtonClick(CurPage: Integer): Boolean; 
begin
  Result:= true;
  if CurPage = wpSelectDir then
    if FileExists(AddBackslash(WizardForm.DirEdit.Text) + 'WorldOfTanks.exe') and (FileVersion(AddBackslash(WizardForm.DirEdit.Text) + 'WorldOfTanks.exe') <> '{#WotExeVersion}') then 
    begin 
       if  MsgBox('Моды не подходят к данному патчу World of Tanks!' #13 'Сборка предназначена для версии патча {#WotVersion}' #13#13 'Скачайте актуальную версию на оффициальном сайте сборки.' #13#13 'P.S: Для перехода на сайт сборки нажмите на кнопку диалога в установщике.', mbConfirmation, MB_OK) = idOk then Result := false; 
    end;   
end;

Edited by night_dragon_on
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

[Code]
function FileVersion(const FilePath: String): String;
var
oFS: Variant;
begin
oFS:= CreateOleObject('Scripting.FileSystemObject');
try
Result:= oFS.GetFileVersion(FilePath);
except
end;
end;

function FileVersionMsgBox(const FilePath: String): String;
begin
GetVersionNumbersString(FilePath, Result)
Result := Copy(Result,1,6);
end;

//"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""//
Function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
begin
if not FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then begin
MsgBoxEx(0, 'Установка модов невозможна, так как по выбранному пути отсутствует клиент игры World of Tanks. Выберите правильный путь и продолжайте установку!','Внимание!!',MB_OK or MB_ICONERROR, 0, 0);
Result := False;
end;
if FileExists(ExpandConstant('{app}\WorldOfTanks.exe')) then begin
if FileVersion(ExpandConstant('{app}\WorldOfTanks.exe')) < '{#Patch}.0' then begin
MsgBoxEx(WizardForm.Handle, 'Моды не будут работать на данной версии игры [' + FileVersionMsgBox(ExpandConstant('{app}\WorldOfTanks.exe')) + '] ! Моды предназначены для версии патча [{#Patch}] ', 'Моды не подходят к данному патчу World of Tanks', MB_OK or MB_ICONWARNING, 0, 0);
Result:= false;
end;
if FileVersion(ExpandConstant('{app}\WorldOfTanks.exe')) > '{#Patch}.0' then begin
MsgBoxEx(WizardForm.Handle, 'Моды не будут работать на данной версии игры [' + FileVersionMsgBox(ExpandConstant('{app}\WorldOfTanks.exe')) + '] ! Моды предназначены для версии патча [{#Patch}] ', 'Моды не подходят к данному патчу World of Tanks', MB_OK or MB_ICONWARNING, 0, 0);
Result:= false;
end;
end;
end;
end;
end;

Share this post


Link to post

Short link
Share on other sites

 

 

на странице с выбором папки при указании такого пути: D:\Games\World_of_Tanks и при нажатии кнопки "Далее" выходит сообщение: "Папка D:\Games\World_of_Tanks уже существует. Все равно установить в эту папку?" Есть какой-нибудь скрипт, чтобы убрать это?
[Setup]
DirExistsWarning=no

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...