Установить стандартный флажок Inno Setup

#inno-setup

#inno-настройка

Вопрос:

Я добавил страницу Inputoptionwizard для выбора задач. Это работает нормально, но я хотел бы добавить некоторые пользовательские функции. Одна задача зависит от другой, поэтому, если установлен второй флажок, первая должна быть установлена и выделена серым цветом.

Для этого мне нужно получить доступ к свойствам флажка. Я нашел способы сделать это, используя полностью пользовательскую страницу, где я бы сам явно создал флажок, но это потребовало бы много работы, поскольку большая часть того, что у меня есть на данный момент, удовлетворяет.

Как я могу установить флажок, созданный Inno Setup, с помощью MyInputOptionWizardPage.Add('This will add a checkbox with this caption') ?

Ответ №1:

В попытке ответить на ваш вопрос напрямую.

Я подозреваю, что вы использовали CreateInputOptionPage() , который возвращает TInputOptionWizardPage

Для этого используется метод ‘.Add(‘Example’)`, который вы упомянули.

TInputOptionWizard происходит, TWizardPage который происходит от TComponent , в котором есть нужные вам методы.

Обновление: Заменен исходный код, этот пример основан на обзоре опций, доступных в исходном коде InnoSetup ScriptClasses_C.в моем исходном примере я думал, что TRadioButton и TCheckBox где отдельные элементы управления. Вместо этого они вызвали его один элемент управления TNewCheckListBox . Есть несколько способов, которыми кто-то мог бы это сделать, но самый безопасный способ — использовать.

Этот пример представляет собой полный сценарий установки Inno.

 [Setup]
AppName='Test Date Script'
AppVerName='Test Date Script'
DefaultDirName={pf}test
[Code]

const
 cCheckBox = false;
 cRadioButton  = true;


var
  Opt : TInputOptionWizardPage; 

function BoolToStr(Value : Boolean) : String; 
begin
  if Value then
    result := 'true'
  else
    result := 'false';
end;

procedure ClickEvent(Sender : TObject);
var
 Msg : String;
 I   : Integer;
begin
   // Click Event, allowing inspection of the Values.
    Msg := 'The Following Items are Checked'  #10#13; 
    Msg := Msg   'Values[0]='   BoolToStr(Opt.Values[0])  #10#13;
    Msg := Msg   'Values[1]='   BoolToStr(Opt.Values[1])  #10#13;
    Msg := Msg   'Values[2]='   BoolToStr(Opt.Values[2]);

    MsgBox(Msg,mbInformation,MB_OK);
end;
procedure InitializeWizard();
var
  I : Integer; 
  ControlType : Boolean;
begin
  ControlType := cCheckBox;
  Opt := CreateInputOptionPage(1,'Caption','Desc','SubCaption',ControlType, false);
  Opt.Add('Test1');
  Opt.Add('Test2');
  Opt.Add('Test3');

  // Assign the Click Event.
  Opt.CheckListBox.OnClickCheck := @ClickEvent;  
end;
  

Комментарии:

1. @Robert — спасибо за это. Я получаю ошибку несоответствия типов в этой строке: Radio := (InputOptionPage as TRadioButton) ; . Вот код: For CompIndex := 0 to InputOptionPage.ComponentCount -1 do begin if (InputOptionPage is TRadioButton) then begin Radio := (InputOptionPage as TRadioButton) ; Radio.OnClick := RadioButtonClick ; end ; end ;

2. … Хотел бы я знать, как вы можете правильно форматировать код в комментариях. Вздох.

3. Я вижу ошибку… Это то, что я получаю за то, что не компилирую / тестирую код. Обратите внимание на добавление .components[I]

4. Radio := (InputOptionPage.Components[CompIndex] as TRadioButton) ; @Robert — та же ошибка — несоответствие типа!

5. Я действительно облажался, есть более простой способ. Обновлено.

Ответ №2:

Вы также можете управлять задачами с помощью родительских отношений, это дает вам поведение, аналогичное тому, о котором вы просите, но не на 100% одинаковое. Я знаю, что это не дает прямого ответа на ваш вопрос, но намеревается предоставить вам вариант, который, возможно, проще реализовать. Делая это таким образом, вам вообще не нужно беспокоиться об управлении пользовательским диалогом.

 [Setup]
;This allows you to show Lines showing parent / Child Relationships
ShowTasksTreeLines=yes

[Tasks]
;Parent Tasks don't use ""
Name: p1; Description: P1 Test; 
;Child Tasks are named ParentTaskNameChildTaskName
;Flag don't inheritcheck:Specifies that the task 
;should not automatically become checked when its parent is checked 
Name: p1c1; Description: C1 Test; Flags: dontinheritcheck;
Name: p1c2; Description: C2 Test; 
;Default behavior is that child must be selected 
;when a parent is selected
;this can be overridden using the:
;doninheritcheck flag and the checkablealone flag.
Name: p2; Description: P2 Test; Flags: checkablealone;
Name: p2c1; Description: P2-C1 Test; Flags: dontinheritcheck;
Name: p2c2; Description: P2-C2 Test; Flags: dontinheritcheck;