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