Jump to content
Korean Random
EvilAlex

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

Recommended Posts

Добрый день!

Как добиться такого, чтобы кнопка "Далее" становилась неактивна, когда не выбран ни один компонент [Components] во время установки? Ведь нет никакого смысла ставить, если ничего не выбрано!

Делал так:

 

procedure ComponentOnClick(Sender: TObject);
begin
if WizardSelectedComponents(False) = '' then
WizardForm.NextButton.Enabled:= False
else WizardForm.NextButton.Enabled:= True;
end;

procedure InitializeWizard();
begin
WizardForm.ComponentsList.OnClick := @ComponentOnClick;
end;

 

но дальше первой страницы не пускает, не выбран компонент (из-за картинки не видно).

Как отключить первую страницу?

 

Может кому надо InnoSetupFAQ:InnoSetupFAQ_ru-board.rar

Edited by sergey spb

Share this post


Link to post

Short link
Share on other sites

@sergey spb, ну по твоему варианту лучше будет использовать свойство OnClickCheck.

А вообще, для работы с кнопкой "далее", лучше использовать выделенную под неё функцию:

Function NextButtonClick(CurPageID: Integer): Boolean;
begin
 Result := True;
 case CurPageID of
 wpSelectComponents:
  begin
   if WizardSelectedComponents(False) = '' then
   begin
    MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
    Result := False;
   end;
  end;
 end;
end;
Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

 

@sergey spb, ну по твоему варианту лучше будет использовать свойство OnClickCheck.

А вообще, для работы с кнопкой "далее", лучше использовать выделенную под неё функцию:



Function NextButtonClick(CurPageID: Integer): Boolean;
begin
 Result := True;
 case CurPageID of
 wpSelectComponents:
  begin
   if WizardSelectedComponents(False) = '' then
   begin
    MsgBox('Ни один из компонентов не выбран!', mbInformation, MB_OK);
    Result := False;
   end;
  end;
 end;
end;

Большое СПАСИБО!!!

Share this post


Link to post

Short link
Share on other sites

Добрый вечер.

 

Делаю картинку внизу страницы со ссылкой:

 

 

[Files]
Source: logo.bmp; DestDir: {tmp}; Flags: dontcopy nocompression


var
LogoImage:TBitmapImage;
LogoPanel: TPanel;
LogoLabel: TLabel;

procedure LogoLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
  ShellExec('open', 'http ://forum.ru-board.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure InitializeWizard();
/////////////////
begin
  LogoPanel := TPanel.Create(WizardForm);
with LogoPanel do
begin
  Parent := WizardForm;
  Left := ScaleX(8);
  Top := ScaleY(327);
  Width := ScaleX(120);
  Height := ScaleY(28);
  BevelOuter := bvNone;
end;

  LogoImage := TBitmapImage.Create(WizardForm);
with LogoImage do
begin
  Parent := LogoPanel;
  Left := ScaleX(0);
  Top := ScaleY(0);
  AutoSize:=true;
  ReplaceColor:=clFuchsia;
  ReplaceWithColor:=clBtnFace;
  ExtractTemporaryFile('logo.bmp');
  Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
end;

  LogoLabel := TLabel.Create(WizardForm);
with LogoLabel do
begin
  Parent := LogoPanel;
  Width := LogoPanel.Width;
  Height := LogoPanel.Height;
  Transparent:=True;
  Cursor := crHand;
  OnClick:=@LogoLabelOnClick;
end;
end;

 

Ругаеться:

post-31076-0-92635900-1427817546_thumb.jpg

Edited by sergey spb

Share this post


Link to post

Short link
Share on other sites


Procedure InitializeWizard1();
begin
...
...
end;

Procedure InitializeWizard2();
begin
...
...
end;

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

 

Share this post


Link to post

Short link
Share on other sites


Procedure InitializeWizard1();
begin
 ...
 ...
end;

Procedure InitializeWizard2();
begin
 ...
 ...
end;

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

Спасибо!!!

Буду пробовать.

По другому:

.....

procedure RedesignWizardForm;

var

i: integer;

  BtnPanel: TPanel;

  BtnImage: TBitmapImage;

begin

  ExtractTemporaryFile('logo.bmp')

  BtnPanel:=TPanel.Create(WizardForm)

  with BtnPanel do begin

    Left:=1

    Top:=314

    Width:=46

    Height:=45

    Cursor:=crHand

    OnClick:=@logoOnClick

    Parent:=WizardForm

  end;

  BtnImage:=TBitmapImage.Create(WizardForm)

  with BtnImage do begin

    AutoSize:=True;

    Enabled:=False;

    Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo.bmp')

    Parent:=BtnPanel

  end;

  with WizardForm do

  begin

    Caption := ExpandConstant('{cm:Main}');

  end;

  with WizardForm.WizardBitmapImage do

  begin

    Width := ScaleX(502);

  end;

  with WizardForm.WelcomeLabel2 do

  begin

    Visible := False;

  end;

  with WizardForm.WelcomeLabel1 do

  begin

    Visible := False;

  end;

  with WizardForm.WizardSmallBitmapImage do

  begin

    Left := ScaleX(0);

    Width := ScaleX(502);

    Height := ScaleY(70);

  end;

  with WizardForm.PageDescriptionLabel do

  begin

    Visible := False;

  end;

  with WizardForm.PageNameLabel do

  begin

    Visible := False;

  end;

  with WizardForm.WizardBitmapImage2 do

  begin

    Width := ScaleX(502);

  end;

  with WizardForm.FinishedLabel do

  begin

    Visible := False;

  end;

  with WizardForm.FinishedHeadingLabel do

  begin

    Visible := False;

  end;

end;

procedure ShowPicHint(const PicFilePath: String);

var

    pt: TPoint;

begin

    if not GetCursorPos(pt) then Exit;

    InfoPic.Bitmap.LoadFromFile(PicFilePath);

    try

        with PicForm do

        begin

            SetBounds(ScaleX(pt.x + 16), ScaleY(pt.y + 7), InfoPic.Width, InfoPic.Height);

            Show;

        end;

    finally

        SetFocus(WizardForm.Handle);

    end;

end;

procedure CompOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);

var

    UndefPic: String;

begin

    if Index = -1 then Exit;

    if Index = LastIndex then Exit;

    try

//--------------------------------------------------------------------------------------------------Êàðòèíêè-----------------------------------

        case TNewCheckListBox(Sender).ItemCaption[index] of

            'Öèôðû': UndefPic := '1.bmp'; // ïèøåì òî÷íî òàê æå, êàê ïðîïèñàíî â êîìïîíåíòàõ

            'Èêîíêè': UndefPic := '2.bmp';

            'Òóíäðà': UndefPic := '3.bmp';

            'Ðåíãåí': UndefPic := '4.bmp';

            'Dendy': UndefPic := '5.bmp';

            'Çâóêîâîå îïîâåùåíèå: äî êîíöà áîÿ,ôðàãè + ìåäàëè': UndefPic := '6.bmp';

        else

            begin

                LastIndex := UNDEF_INDEX;

                PicForm.Hide;

                Exit;

            end;

        end;

        if not FileExists(TempPath + UndefPic) then ExtractTemporaryFile(UndefPic);

        ShowPicHint(TempPath + UndefPic);

    finally

        LastIndex := Index;

    end;

end;

procedure CompOnMouseLeave(Sender: TObject);

begin

    PicForm.Hide;

    LastIndex := -1;

end;

procedure InitInfo();

begin

    WizardForm.ComponentsList.OnItemMouseMove := @CompOnItemMouseMove;

    WizardForm.ComponentsList.OnMouseLeave := @CompOnMouseLeave;

    TempPath := AddBackslash(ExpandConstant('{tmp}'));

    LastIndex := UNDEF_INDEX;

    PicForm := TForm.Create(WizardForm)

    with PicForm do

    begin

        BorderStyle := bsNone;

        FormStyle := fsStayOnTop;

        InfoPic := TBitmapImage.Create(PicForm)

        with InfoPic do

        begin

            Parent := PicForm;

            AutoSize := True;

        end;

    end;

    SetWindowLong(PicForm.Handle, GWL_EXSTYLE, GetWindowLong(PicForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);

    SetLayeredWindowAttributes(PicForm.Handle, 0, ALPHA_BLEND_LEVEL, LWA_ALPHA);

end;

Procedure CurPageChanged(CurPageID: Integer);

var

Reg, UninstallPath: String;

ResultCode: Integer;

begin

case CurPageID of

wpSelectComponents:

  begin

   Reg := ExpandConstant('Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppID")}_is1');

   if RegValueExists(HKLM, Reg, 'UninstallString') then

    RegQueryStringValue(HKLM, Reg, 'UninstallString', UninstallPath);

   if Length(UninstallPath) > 0 then

   begin

    case MsgBoxEx(WizardForm.Handle, 'Ðåêîìåíäóåòñÿ óäàëèòü ðàíåå óñòàíîâëåííóþ âåðñèþ ñáîðêè.' + #13#10 + 'Õîòèòå ñäåëàòü ýòî ñåé÷àñ?', 'ModPack SG', MB_YESNO or MB_ICONQUESTION, 0, 0) of

     IDYES: Exec(RemoveQuotes(ExpandConstant(UninstallPath)), '/SILENT /SUPPRESSMSGBOXES', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);

     IDNO: Exit;

    end;

   end;

  end;

end;

end;

Function NextButtonClick(CurPageID: Integer): Boolean;

begin

Result := True;

case CurPageID of

wpSelectComponents:

  begin

   if WizardSelectedComponents(False) = '' then

   begin

    MsgBox('Íè îäèí èç êîìïîíåíòîâ íå âûáðàí!', mbInformation, MB_OK);

    Result := False;

   end;

  end;

end;

end;

procedure InitializeWizard();

begin

  RedesignWizardForm;

  InitInfo();

  RedesignWizardForm;

  InitializeWizard2();

  BackupCheck_1();

end;

 

 

post-31076-0-39948800-1427822622_thumb.jpg

  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

@sergey spb, во-первых, код ложи под тег спойлера (в панели управления, выше поля ввода есть).

Во-вторых, с RedesignWizardForm можно сделать то же самое, что и с InitializeWizard. Тем более, что процедура "RedesignWizardForm" может иметь почти любое название, не надо привязываться к названиям, которые были в примере (или откуда там был взят скрипт).

Edited by Kotyarko_O

Share this post


Link to post

Short link
Share on other sites

sergey spb, неужто так сложно нажать Ctrl + F и найти где у тебя по коду повторяется процедура RedesignWizardForm, переименовать вторую и подключить её в InitializeWizard? И, чёрт тебя дери, ПОЛЬЗУЙСЯ спойлерами! Стены текта тут не нужны!

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites

Коллеги, здравствуйте.

 

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

Однако, решения в теме так и не нашел, пролопатив по поиску с десяток страниц.

 

Прошу помочь знающих, проблема очень простая.

 

Суть: копирование папки audio из папки /res в папку /res_mods перед установкой аудио-модов.

 

1). создаваемый мод-пак содержит в себе несколько разных аудио-модов - юзер может выбрать компоненты, затем удалить старые и установить новые и т.д.

2). юзер уже мог до этого установить другие аудио-модов.

 

то есть в его папке res_mods уже может присутствовать папка audio.

 

Необходимо прописать в установщик, чтобы он проверял наличие в папке /res_mods/0.9.* папки audio - и если она есть, то при установке модов ничего не копировать.

А если ее нет - скопировать ее только один раз. И не копировать затем при доустановке / переустановке и других операциях.

 

Что уже сделано:

 

добавлена строчка


Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.7\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\P;

 

перед каждым компонентом.

 

Однако в этом случае каждый раз происходит копирование все папки.

 

Помогите, пожалуйста.

Share this post


Link to post

Short link
Share on other sites

xasic, с проверками шляпа конечно, знаю по инсталлятору "Озвучки WGTV".

Копай в сторону DirExists:

 

    DirPath:=ExpandConstant('{app}\res_mods\') + GetModsDir + ExpandConstant('\audio');
    If DirExists(DirPath) then
Не забывай ещё про проверку на наличие файлов в папке audio.

Запиши всё функцией, подключай на шаге CurStep=ssInstall, и через Check можно проверять копировать ли папку.

Edited by AtotIK
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

Что уже сделано:

 

добавлена строчка

Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.7\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\P;

 

перед каждым компонентом.

 

Однако в этом случае каждый раз происходит копирование все папки.

Ну  гораздо лучше будет сделать копирование один раз. Например, есть компонент KMP\AUDIO, и все остальные компоненты являются ему дочерними (KMP\AUDIO\VEHICLE, KMP\AUDIO\CREW и т.д.) и копирование папки audio из игровых ресурсов сделать так:

Source: "{app}\res\audio\*"; DestDir: "{app}\res_mods\0.9.7\audio\"; Flags: external recursesubdirs skipifsourcedoesntexist; Components: KMP\AUDIO;

В таком случае нет разницы, выбран один компонент или несколько - копироваться папка будет один раз. И описанная вами проблема исчезнет.

 

Необходимо прописать в установщик, чтобы он проверял наличие в папке /res_mods/0.9.* папки audio - и если она есть, то при установке модов ничего не копировать.

Это сделать не проблема, проверять наличие папки можно способом, описанным выше, @AtotIK`ом. И получившуюся функцию добавить как дополнительное условие в параметре "Check".

 

А если ее нет - скопировать ее только один раз. И не копировать затем при доустановке / переустановке и других операциях.

Ну так не получится. Вернее, получится, но будет не совсем правильно. Т.к. пользователь мог вручную установить какую-то звуковую модификацию после первой установки модПака. И при повторной установке этого модпака, папка не очистится от "лишнего". Так что это может быть проблемой.

Edited by Kotyarko_O
  • Upvote 3

Share this post


Link to post

Short link
Share on other sites

Добрый день.

А как убрать (заменить) надпись: "Установка-" (сверху слева)

Share this post


Link to post

Short link
Share on other sites

 

 

А как убрать (заменить) надпись: "Установка-" (сверху слева)
Например:
Procedure InitializeWizard();
begin
 WizardForm.Caption := 'Не установка';
end;

Имя приложения можно вытащить из секции Setup:

WizardForm.Caption := '{#emit SetupSetting("AppName")}';

Share this post


Link to post

Short link
Share on other sites

Например:



Procedure InitializeWizard();
begin
 WizardForm.Caption := 'Не установка';
end;

Имя приложения можно вытащить из секции Setup:



WizardForm.Caption := '{#emit SetupSetting("AppName")}';

Спасибо!!!

Share this post


Link to post

Short link
Share on other sites

@AtotIK,  @Kotyarko_O,

Комрады? Могу я попросить вас о помощи снова?

 

Ничего не получается с составлением самого скрипта: логику понимаю, составить правильно код - не могу.

Не сочтите за труд помочь вставить правильный код.

 

Проблема всё та же - проверка наличия папки аудио в папке 0.9.7.

Приложил файл, который при компиляции выдаёт ошибку. Или просто помогите составить правильный код.

 

 

Share this post


Link to post

Short link
Share on other sites

xasic, логика составления скрипта не правильная:

function MyDirName(S:String): String;
var
  InsPath: String;
  er: boolean;
  myFile:String;
  audio: boolean;
begin
  Result:=ExpandConstant('C:\World_of_Tanks\');
  er := RegQueryStringValue(HKLM, 'SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation', InsPath);
  if er and (InsPath<>'') then
  begin
    Result := InsPath;
  end;
  
 audio:=DirExists('{app}\res_mods\0.9.7\audio\');

    If NOT audio then
    begin
      CopyDir(ExpandConstant('{app}\res\audio\'),ExpandConstant('{app}\res_mods\0.9.7\audio\'));
    end;
end;

Проверять эти данные нужно непосредственно перед началом установки, а не при запуске инсталлятора. У многих игры нет ни в реестре, ни по выставляемому пути в этой процедуре. Приложенный выше скрипт конечно скомпилируется, но толку от этого не много.

Нужно перенести нужный код в отдельную процедуру и вызывать его на этапе ssInstall, тогда инсталлятор 100% знает в какую папку начинается установка:

[Files]
Source: "{app}\res\audio\*.*"; DestDir: "{app}\res_mods\0.9.7\audio"; Flags: uninsneveruninstall skipifsourcedoesntexist overwritereadonly ignoreversion external; Check: ModsInstallCheck;

[~Code~]
var
  DirPath, FilePath: AnsiString;
  SoundCheck: Boolean;

function ModsInstallCheck_1(): Boolean;
begin
  Result:=False;
  SoundCheck:=False;
  DirPath:=ExpandConstant('{app}\res_mods\') + GetModsDir + ExpandConstant('\audio');
  If DirExists(DirPath) then
  FilePath:=ExpandConstant('{app}\res_mods\') + GetModsDir + ExpandConstant('\audio\ingame_voice.fev');
  If DirExists(DirPath) and FileExists(FilePath) then
  begin
    Result:=True;
    SoundCheck:=True;
  end;
end;

function ModsInstallCheck(): Boolean;
begin
  Result:=False;
  If SoundCheck then Result:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  If CurStep=ssInstall then
begin
  ModsInstallCheck_1();
end;

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

 

З.Ы. Kotyarko_O, правильнее вот так:

RegQueryStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Uninstall\{1EAC1D02-C6AC-4FA6-9A44-96258C37C812RU}_is1', 'InstallLocation',  ResultCode);

Wow6432Node есть только на х64 системах. Так там отображается х86 разделы. Формально указанный мной путь существует, но отображается через Wow6432Node на х64.

Edited by AtotIK

Share this post


Link to post

Short link
Share on other sites

 

 

З.Ы. Kotyarko_O, правильнее вот так
Я не правил остальной код, а только пофиксил то, на что была жалоба.
  • Upvote 1

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