Отключить элементы управления на основе выбора компонентов в Inno Setup

Я хочу отключить элементы управления на своей странице (VST2DirPage) на основе выбранных компонентов. Я попробовал условие:

if IsComponentSelected('VST64') then  
begin
  VST2DirPage.Buttons[0].Enabled := False;
  VST2DirPage.PromptLabels[0].Enabled := False;
  VST2DirPage.Edits[0].Enabled := False;
end

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

[Types]
Name: "full"; Description: "{code:FullInstall}";
Name: "custom"; Description: "{code:CustomInstall}"; Flags: iscustom

[Components]
Name: "VST64"; Description: "64-bit VST2"; Types: full; Check: Is64BitInstallMode
Name: "VST"; Description: "32-bit VST2"; Types: full; Check: Is64BitInstallMode
Name: "VST"; Description: "32-bit VST2"; Types: full; Check: not Is64BitInstallMode

[Code]
var VST2DirPage: TInputDirWizardPage;

procedure InitializeWizard;
begin
  VST2DirPage := CreateInputDirPage(wpSelectComponents,
    'Confirm VST2 Plugin Directory', '',
    'Select the folder in which setup should install the VST2 Plugin, then click Next.',
    False, '');

  VST2DirPage.Add('64-bit folder');
  VST2DirPage.Values[0] := ExpandConstant('{reg:HKLM\SOFTWARE\VST,VSTPluginsPath|{pf}\Steinberg\VSTPlugins}');
  VST2DirPage.Add('32-bit folder');
  VST2DirPage.Values[1] := ExpandConstant('{reg:HKLM\SOFTWARE\WOW6432NODE\VST,VSTPluginsPath|{pf32}\Steinberg\VSTPlugins}');

  if not Is64BitInstallMode then
  begin
    VST2DirPage.Buttons[0].Enabled := False;
    VST2DirPage.PromptLabels[0].Enabled := False;
    VST2DirPage.Edits[0].Enabled := False;
  end;
end;

1 ответ

Решение

InitializeWizard Функция события происходит еще до того, как показывается установщик. На данный момент вы еще не знаете, какие компоненты выберет пользователь.

Вы должны обновлять состояние элементов управления только тогда, когда вы знаете, какие компоненты выбраны:

  • Либо при выходе из страницы "Выбор компонентов".
  • Или при входе на пользовательскую страницу.

Это показывает более поздний подход (реализованный с использованием CurPageChanged функция события):

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = VST2DirPage.ID then
  begin
    VST2DirPage.Buttons[0].Enabled := not IsComponentSelected('VST64');
    VST2DirPage.PromptLabels[0].Enabled := VST2DirPage.Buttons[0].Enabled;
    VST2DirPage.Edits[0].Enabled := VST2DirPage.Buttons[0].Enabled;
  end;
end;

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


Смотрите также похожий вопрос:
Inno Setup - измените цвет метки описания задачи и сделайте разрыв строки.

Другие вопросы по тегам