Могу ли я каким-то образом передать страницы TInput / TOutput функции в качестве одного параметра в Inno Setup?

#parameters #inno-setup

#параметры #inno-настройка

Вопрос:

Интересно, могу ли я каким-то образом передать TInputQueryWizardPage , TInputOptionWizardPage , TInputDirWizardPage , TInputFileWizardPage , TOutputMsgWizardPage , TOutputMsgMemoWizardPage , TOutputProgressWizardPage страницы функции в качестве одного параметра?

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

Вот один из примеров:

 procedure SetPropertiesForPages(InputOptionWP: TInputOptionWizardPage; TextWP: TOutputMsgWizardPage; SelectDirWP: TInputDirWizardPage; InputQueryWP: TInputQueryWizardPage; Mode: String; AWordWrap: Boolean; AWidth, AHeight, ALeft, ATop: Integer);
begin
  case Lowercase(Mode) of
    'text':
      begin
         biLeftSideImage := CreateBitmapImage(TextWP, ExpandConstant('{tmp}LefthandsideImg.bmp'), True, 0, 0);
         with TextWP do
           begin
             MsgLabel.WordWrap := AWordWrap;
             MsgLabel.Width := AWidth;
             MsgLabel.Height := AHeight;
             MsgLabel.Left := ALeft;
           end;   
      end;
    'inputoption1':
      begin
        biLeftSideImage := CreateBitmapImage(InputOptionWP, ExpandConstant('{tmp}LefthandsideImg.bmp'), True, 0, 0);
        with InputOptionWP do
           begin
             SubCaptionLabel.WordWrap := AWordWrap;
             SubCaptionLabel.Width := AWidth;
             SubCaptionLabel.Left := ALeft;
             SubCaptionLabel.Top := ATop;
             CheckListBox.Width := AWidth;
             CheckListBox.Height := AHeight;
             CheckListBox.Left := ALeft;
             CheckListBox.Top := ATop   SubCaptionLabel.Height   ScaleY(20);
           end;   
      end;
    'inputoption2':
      begin
        biLeftSideImage := CreateBitmapImage(InputOptionWP, ExpandConstant('{tmp}LefthandsideImg.bmp'), True, 0, 0);
        with InputOptionWP do
          begin
            SubCaptionLabel.WordWrap := AWordWrap;
            SubCaptionLabel.Width := AWidth;
            SubCaptionLabel.Height := 6 * AHeight   ScaleY(5);
            SubCaptionLabel.Left := ALeft;
            SubCaptionLabel.Top := ATop;
            CheckListBox.Width := AWidth;
            CheckListBox.Height := AHeight   ScaleY(40);
            CheckListBox.Left := ALeft;
            CheckListBox.Top := ATop   SubCaptionLabel.Height   ScaleY(5);  
          end; 
      end;
    'selectdir':
      begin
        biLeftSideImage := CreateBitmapImage(SelectDirWP, ExpandConstant('{tmp}LefthandsideImg.bmp'), True, 0, 0);
        with SelectDirWP do
          begin
            Edits[0].ReadOnly := True;
            Edits[1].ReadOnly := True;
            Edits[0].Left := ALeft;
            Edits[1].Left := ALeft;
            Edits[0].Width := AWidth - ScaleX(70);
            Edits[1].Width := AWidth - ScaleX(70);
            Buttons[0].Left := Edits[0].Left   Edits[0].Width   ScaleX(10);
            Buttons[1].Left := Edits[1].Left   Edits[1].Width   ScaleX(10);
            PromptLabels[0].Left := ALeft;
            PromptLabels[1].Left := ALeft;
            SubCaptionLabel.WordWrap := AWordWrap;
            SubCaptionLabel.Width := AWidth;
            SubCaptionLabel.Left := ALeft;
            SubCaptionLabel.Top := ATop;
          end;
      end;
    'inputquery':
      begin
        biLeftSideImage := CreateBitmapImage(InputQueryWP, ExpandConstant('{tmp}LefthandsideImg.bmp'), True, 0, 0);
        with InputQueryWP do
          begin
            Edits[0].Left := ALeft;
            Edits[0].Width := AWidth - ScaleX(75);
            PromptLabels[0].Left := ALeft;
            SubCaptionLabel.WordWrap := AWordWrap;
            SubCaptionLabel.Width := AWidth;
            SubCaptionLabel.Height := AHeight;
            SubCaptionLabel.Left := ALeft;
            SubCaptionLabel.Top := ATop;
          end;
      end;
  end;
end;
 

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

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

1. Что будет делать функция?

2. @MartinPrikryl Я добавил пример.

3. Почему вы вообще хотите поместить все это в одну функцию? Вряд ли есть какой-либо общий код. Создайте отдельную функцию только с одним параметром страницы для каждого типа страницы.

Ответ №1:

Если вы хотите, чтобы функция работала над любой из этих страниц, if должен использовать только их общий API / функциональность. Их общий API / функциональность — это их базовый класс, TWizardPage :

 procedure DoSomethingWithAnyCustomPage(WizardPage: TWizardPage);
begin
  // ...
end;
 

Во многих случаях вы также можете реализовать общую функциональность, используя ту же / общую реализацию событий pages.