1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Компоненты в Inno Setup

Тема в разделе "Inno Setup", создана пользователем Darthame, 17 сен 2018.

  1. Новичок

    Регистрация:
    24 мар 2018
    Сообщения:
    13
    Симпатии:
    0
    Здравствуйте. Мне нужна помощь в создании инсталлятора. На этом же форуме мне подсказали скрипт для вывода описания и превью компонентов через библиотеку botva2

    Код (Inno):
    #include "Modules\botva2.iss"

    [Setup]
    AppName=My Program
    AppVerName=My Program 1.5
    DefaultDirName={pf}\My Program
    DefaultGroupName=My Program
    OutputDir=.

    [Files]
    Source: Files\*; Flags: dontcopy

    [Languages]
    Name: russian; MessagesFile: compiler:Languages\Russian.isl

    [CustomMessages]
    russian.ComponentsName1=Моя программа™
    russian.ComponentsName2=Помощь
    russian.ComponentsName2_1=Документация
    russian.ComponentsName2_2=Руководство пользователя
    russian.ComponentsInfoPanel1=Описание
    russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
    russian.ComponentsDescription1=Устанавливается обязательно
    russian.ComponentsDescription2=Помощь
    russian.ComponentsDescription3=Прочитать документацию
    russian.ComponentsDescription4=Прочитать руководство пользователя

    [Types]
    Name: full; Description: Full installation; Flags: iscustom

    [Components]
    Name: text; Description: Язык субтитров; Types: full; Flags: fixed
    Name: text\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 100000000
    Name: text\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 200000000
    Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
    Name: voice\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 500000000
    Name: voice\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 600000000

    [Code]
    type
      TComponentDesc = record Description: String; Index: Integer; end;

    var
      Descs: array of TComponentDesc;
      Info: TNewStaticText;
      InfoCaption: TNewStaticText;
      InfoPanel: TPanel;
      ImgPanel: TPanel;
      Indx: Integer;
      Img: array of Longint;

    procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
    var i: Integer;
    begin
      Indx:=-1;
      for i:= 0 to GetArrayLength(Descs)-1 do begin
      if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
      if (Indx >=0)and(Area=iaItem) then Info.Caption:= Descs[Indx].Description else Info.Caption:= ExpandConstant('{cm:ComponentsInfoPanel2}');
    //
      ImgSetVisibility(Img[0],False);
      ImgSetVisibility(Img[1],False);
      ImgSetVisibility(Img[2],False);
      ImgPanel.Caption := 'Превью';
    case Index of
      1: begin ImgPanel.Caption := ''; ImgSetVisibility(Img[0],True); end;
      2: begin ImgPanel.Caption := ''; ImgSetVisibility(Img[1],True); end;
      3: begin ImgPanel.Caption := ''; ImgSetVisibility(Img[2],True); end;
    end;
      ImgApplyChanges(ImgPanel.Handle);
    end;

    procedure AddDescription(AIndex: Integer; ADescription: String);
    var i, k: Integer;
    begin
    i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
    Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
    end;

    function InitializeSetup:boolean;
    begin
      if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
      Result:=True;
    end;

    procedure ImgCreate(Filename: string; i: integer);
    begin
      Img[i]:= ImgLoad(ImgPanel.Handle, Filename, 0, 0, ScaleX(200), ScaleY(181) - WizardForm.TypesCombo.Top, True,True);
      ImgSetVisibility(Img[i],False);
    end;

    procedure InitializeWizard();
    begin
      WizardForm.TypesCombo.Visible:=False;
      WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
      WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
      WizardForm.ComponentsList.Width := ScaleX(207);
      WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription

      ImgPanel := TPanel.Create(WizardForm);
      ImgPanel.Parent := WizardForm.SelectComponentsPage;
      ImgPanel.Caption := 'Превью';
      ImgPanel.Top := WizardForm.TypesCombo.Top;
      ImgPanel.Left := ScaleX(217);
      ImgPanel.Width := ScaleX(200);
      ImgPanel.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
      ImgPanel.BevelInner := bvRaised;
      ImgPanel.BevelOuter := bvLowered;
    //
      SetArrayLength(Img, WizardForm.ComponentsList.ItemCount);
    //
      ImgCreate('1.jpg', 0);
      ImgCreate('2.jpg', 1);
      ImgCreate('3.jpg', 2);
    //
      ImgApplyChanges(ImgPanel.Handle);

      InfoPanel := TPanel.Create(WizardForm);
      InfoPanel.Parent := WizardForm.SelectComponentsPage;
      InfoPanel.Caption := '';
      InfoPanel.Top := ScaleY(190);
      InfoPanel.Left := ScaleX(0);
      InfoPanel.Width := ScaleX(417);
      InfoPanel.Height := ScaleY(40);
      InfoPanel.BevelInner := bvRaised;
      InfoPanel.BevelOuter := bvLowered;
      InfoCaption := TNewStaticText.Create(WizardForm);
      InfoCaption.Parent := WizardForm.SelectComponentsPage;
      InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
      InfoCaption.Left := ScaleX(7);
      InfoCaption.Top := InfoPanel.Top - ScaleY(6);
      InfoCaption.Font.Color := clActiveCaption;

      Info := TNewStaticText.Create(WizardForm);
      Info.Parent := InfoPanel;
      Info.AutoSize := False;
      Info.Left := ScaleX(6);
      Info.Width := ScaleX(403);
      Info.Top := ScaleY(12);
      Info.Height := ScaleY(24);
      Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
      Info.WordWrap := true;

      AddDescription(1, 'Справка'); //первый параметр - это номер компонента, идет последовательно от начала записи компонентов
      AddDescription(2, 'Английская справка'); //Второй параметр - это собственно описание компонента
      AddDescription(3, 'Русская справка');
      AddDescription(4, 'Плагины');
      AddDescription(5, 'Внутреннего просмотра');
      AddDescription(6, 'Архиваторные');
      AddDescription(7, 'Системные');
      AddDescription(8, 'CanonCam');
      AddDescription(9, 'PluginManager');
      AddDescription(10, 'Registry');
      AddDescription(11, 'Services');
      AddDescription(12, 'StartupGuard');
      AddDescription(13, 'Другие');
    end;

    procedure DeinitializeSetup;
    begin
      gdipShutDown;
    end;

    Можно ли прикрепить подобный скрипт для чекбоксов и радиокнопок, созданных на новой странице (через CreateCustomPage)? На этой странице должен быть CheckListBox, а в нем все чекбоксы и по наведению мыши инсталлятор должен выводить описание и показывать превью.

    P.S. Хотелось бы еще увидеть, как устанавливать файлы, если чекбокс отмечен.
     
  2. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    380
    Симпатии:
    402
    Пол:
    Мужской
    Darthame, здравствуйте. На счет примерного функционала вот (пример снизу), о по поводу установки, то нужно добавить условие.

    Например для ISDone, выглядит как-то так:
    Код (Inno):
        TmpValue:=1;
        if clbIsItemCheckedByIndex(ComponentList, 0) then Comps1:=Comps1+TmpValue; //компонент 1
        TmpValue:=TmpValue*2;
        ...
        if not IS7ZipExtract(1, 0, ExpandConstant('{src}\архив.7z'), ExpandConstant('{app}\'), False, '') then break;
    А без ISDone, нужно например использовать параметр Check в секциях [Files] или [Components], а потом в секции [Сode] перебрать через оператор case of посланное сообщение и возвращать Boolean, в случае если выбран CheckBox.
     

    Вложения:

    • Exp.7z
      Размер файла:
      88 КБ
      Просмотров:
      12
    Последнее редактирование: 17 сен 2018
    Darthame нравится это.
  3. Новичок

    Регистрация:
    24 мар 2018
    Сообщения:
    13
    Симпатии:
    0
    Спасибо, то, что нужно. Но я в коде не очень разбираюсь. Как правильно написать этот скрипт?

    Нашел где-то код, не уверен, что он правильный:
    Код (Inno):
    [Files]
    Source: "Files\*"; DestDir: "{app}"; Check: IsChecked('Компонент_01');

    function IsCompChecked(const CheckListBox: TNewCheckListBox; Name: String): Boolean;
    var
    I: Integer;
    begin
    Result := False;
    for I := 0 to CheckListBox.ItemCount - 1 do
    begin
       Result := CheckListBox.Checked[I];
       if Result then
       Exit;
    end;
    end;

    function IsChecked(Name: String): Boolean;
    begin
    Result := IsCompChecked(CheckListBox, Name);
    end;
     
  4. Ветеран Супер модератор

    Регистрация:
    5 мар 2016
    Сообщения:
    380
    Симпатии:
    402
    Пол:
    Мужской
    Darthame, похоже что да, пример правильный. Копирование директории последует, если CheckBox c именем 'Компонент_01' был отмечен.
     
  5. Новичок

    Регистрация:
    24 мар 2018
    Сообщения:
    13
    Симпатии:
    0
    Что-то не работает. После нажатия кнопки установить выделяется строка:
    for I := 0 to CheckListBox.ItemCount - 1 do
    с ошибкой Could not call proc.
     
  6. Ветеран Модератор

    Регистрация:
    26 июн 2011
    Сообщения:
    1.212
    Симпатии:
    781
    Darthame,
    Код (Inno):

    [Files]
    Source: "Files\*"; DestDir: "{app}"; Check: IsChecked(1);
    //...
    function IsChecked(Index: integer): Boolean;
    begin
      Result := clbIsItemCheckedByIndex(ComponentList, Index);
    end;
     
    и да, какой-то код не правильный и для TNewCheckListBox'a он.
    этого было бы там достаточно.
    Код (Inno):
     Result := NewCheckListBox1.Checked[NewCheckListBox1.Items.IndexOfName(Name)];
     
    Последнее редактирование: 17 сен 2018
    agent555 и Darthame нравится это.
  7. Новичок

    Регистрация:
    24 мар 2018
    Сообщения:
    13
    Симпатии:
    0
    Заработало! Большое спасибо за помощь!
     

Поделиться этой страницей