ShouldSkipPage Inno Setup

0

Czy da się uruchomić funkcję ShouldSkipPage dopiero po wciśnięciu przycisku "Nowy" na jednej ze stron instalatora? Tak by nie była zależna od przycisku next ale od przycisku "Nowy".

[code]
var
  Strona1: TWizardPage;
  NowyButton: TButton;
procedure NowyButtonOnClick(Sender: TObject);
begin
end;

procedure InitializeWizard();
begin
Strona1 := CreateCustomPage(wpselectdir, 'Strona1', 'Text');

 NowyButton:= TButton.create(Wizardform);
 with NowyButton do
 begin
  NowyButton.Left := 20
  NowyButton.Top := WizardForm.CancelButton.Top;
  NowyButton.Width := WizardForm.CancelButton.Width;
  NowyButton.Height := WizardForm.CancelButton.Height;
  NowyButton.Caption := 'Nowy';
  NowyButton.OnClick := @NowyButtonOnClick;
  NowyButton.Parent := WizardForm
end;
end;

function ShouldSkipPage(PageID: Integer): Boolean; //Jeśli przycisk "nowy"=kliknięty funkcja pomija strony
begin
  if  (PageID = wpWelcome) or (PageID = wpSelectDir) then
  begin
    result := True;
    exit;
  end;
  result := false;
end;
1

Nie znam się na InnoSetup bo nigdy z niego nie korzystałem (wolałem samodzielnie tworzyć instalatory - bardzo fajna zabawa), ale mam tylko jedną uwagę co do tego kodu:

function ShouldSkipPage(PageID: Integer): Boolean; //Jeśli przycisk "nowy"=kliknięty funkcja pomija strony
begin
  if  (PageID = wpWelcome) or (PageID = wpSelectDir) then
  begin
    result := True;
    exit;
  end;
  result := false;
end;

Można go skrócić do jednej linii:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := (PageID = wpWelcome) or (PageID = wpSelectDir);
end;

lub tak:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := PageID in [wpWelcome, wpSelectDir];
end;
0

Furious Programming ta pierwsza opcja działa ale ta druga monituję błąd "Type Mismatch". A czy można zrobić tak aby po naciśnięciu przycisku przeniosło do mojej strony?

1

Może podam przykładowy kod, z którego mechanizmy możesz wykorzystać, bo nie wiem, co tam dokładnie chcesz zrobić:

[Code]
var
  Strona1: TWizardPage;
  NowyButton: TButton;
  BtnNowyClicked: Boolean;//globalna zmienna logiczna określająca, że przycisk "Nowy" został już kliknięty

procedure NowyButtonOnClick(Sender: TObject); //przechwycenie kliknięcia przycisku "Nowy"
begin
  If WizardForm.CurPageID=Strona1.ID {wpSelectSir} then //jeśli kliknąłeś przycisk "Nowy" gdy aktywna była Twoja strona {wyboru folderu}
    MsgBox('Kliknąłeś przycisk "Nowy" gdy Twoja strona jest widoczna!', mbInformation, MB_OK);  
  BtnNowyClicked:=true; //włączenie aktywności funkcji ShouldSkipPage (pominięcie 1 strony i wyboru folderu)
end;
 
procedure InitializeWizard();
begin
  BtnNowyClicked:=false; //początkowy stan flagi określającej, że przycisk "Nowy" został już kliknięty

  Strona1 := CreateCustomPage(wpselectdir, 'Strona1', 'Text');
 
  NowyButton:= TButton.create(WizardForm);
  with NowyButton do
  begin
    NowyButton.Left := 20;
    NowyButton.Top := WizardForm.CancelButton.Top;
    NowyButton.Width := WizardForm.CancelButton.Width;
    NowyButton.Height := WizardForm.CancelButton.Height;
    NowyButton.Caption := 'Nowy';
    NowyButton.OnClick := @NowyButtonOnClick;
    NowyButton.Parent := WizardForm;
  end;
end;
 
function ShouldSkipPage(PageID: Integer): Boolean; //jeśli funkcja zwróci true, strona o ID=PageID nie będzie wyświetlana
begin
  Result := BtnNowyClicked and ((PageID=wpWelcome)or(PageID=wpSelectDir));//Jeśli przycisk "Nowy" został kliknięty, nie będzie wyświetlana 1 strona i wyboru folderu
end;

function NextButtonClick(CurPageID: Integer): Boolean; //przechwycenie kliknięcia przycisku "Next" (lub "Install")
Begin
  If CurPageID=wpReady then //jeśli kliknięto przycisk "Next" gdy ma Caption "Install"
  Begin
    MsgBox('Kliknąłeś przycisk "Install"', mbInformation, MB_OK);  
    Result:=false; //np. jeśli ma być zablokowane rozpoczęcie instalacji (brak reakcji na kliknięcie przycisku "Install")
  End
  else Result:=true; //w tej sytuacji kliknięcie przycisku "Next" wywoła właściwą akcję, czyli przeskok na następną stronę)
End; 

Mam nadzieję, że to się kompiluje, bo pisałem z pamięci. ;)

0

Wymyśliłem też troszkę inną drogę by osiągnąć pożądany efekt.

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
var
  Strona1: TWizardPage;
  NowyButton, Nowy1Button, Nowy2Button, Nowy3Button: TButton;
  label1, label2: Tlabel;

procedure konfiguracjaOnClick(Sender: TObject);    
begin
NowyButton.hide
nowy2button.show
Nowy2Button.left:=100
Nowy1Button.Show
Nowy1Button.left:=nowybutton.left
Nowy3Button.hide
Wizardform.WelcomeLabel1.Hide;
Wizardform.WelcomeLabel2.Hide;
Wizardform.wizardbitmapimage.hide
Wizardform.diredit.Show
Wizardform.DirBrowseButton.show
Wizardform.DirBrowseButton.Parent:= WizardForm.welcomepage;
label1.show;
wizardform.dirbrowsebutton.show
end;

procedure WsteczOnClick(Sender: TObject);    
begin
NowyButton.Show
Nowy1Button.hide
Nowy1Button.left:=nowybutton.left
Nowy2Button.hide
label1.hide
Wizardform.DirBrowseButton.hide
Wizardform.diredit.hide
Wizardform.wizardbitmapimage.show
Wizardform.WelcomeLabel1.show;
Wizardform.WelcomeLabel2.show;
end;

procedure DalejOnClick(Sender: TObject);    
begin
Nowy3Button.Show
Nowy3Button.left:= NowyButton.left
Nowy2Button.hide
NowyButton.Hide
Nowy1Button.Hide
Wizardform.diredit.Hide
Wizardform.diredit.parent:=Wizardform.welcomepage
Wizardform.diredit.left:= 40
Wizardform.diredit.top:= 160
Wizardform.DirBrowseButton.Hide
label1.Hide
label2.show
end;

procedure Wstecz2OnClick(Sender: TObject);   
begin
label2.hide
nowy3button.hide
Wizardform.diredit.Show
Wizardform.diredit.parent:=Wizardform.welcomepage
Wizardform.diredit.left:= 40
Wizardform.diredit.top:= 160
Wizardform.DirBrowseButton.show
label1.show;
wizardform.dirbrowsebutton.show
nowy1button.show
nowy2button.show
end;

procedure InitializeWizard();
begin
WizardForm.Position:=poscreencenter;
Strona1 := CreateCustomPage(wpselectdir, 'Strona1', 'Text');
 
 NowyButton:= TButton.create(Wizardform);
 with NowyButton do
 begin
  NowyButton.Left := 20
  NowyButton.Top := WizardForm.CancelButton.Top;
  NowyButton.Width := WizardForm.CancelButton.Width;
  NowyButton.Height := WizardForm.CancelButton.Height;
  NowyButton.Caption := 'Dalej';
  NowyButton.OnClick := @konfiguracjaOnClick;
  NowyButton.Parent := WizardForm
end;

 Nowy1Button:= TButton.create(Wizardform);
 with Nowy1Button do
 begin
  Nowy1Button.Left := 120
  Nowy1Button.Top := WizardForm.CancelButton.Top;
  Nowy1Button.Width := WizardForm.CancelButton.Width;
  Nowy1Button.Height := WizardForm.CancelButton.Height;
  Nowy1Button.Caption := 'Wstecz';
  Nowy1Button.OnClick := @WsteczOnClick;
  Nowy1Button.Parent := WizardForm
end;

 Nowy2Button:= TButton.create(Wizardform);
 with Nowy2Button do
 begin
  Nowy2Button.Left := 200
  Nowy2Button.Top := WizardForm.CancelButton.Top;
  Nowy2Button.Width := WizardForm.CancelButton.Width;
  Nowy2Button.Height := WizardForm.CancelButton.Height;
  Nowy2Button.Caption := 'Dalej';
  Nowy2Button.OnClick := @DalejOnClick;
  Nowy2Button.Parent := WizardForm
end;

 Nowy3Button:= TButton.create(Wizardform);
 with Nowy3Button do
 begin
  Nowy3Button.Left := 240
  Nowy3Button.Top := WizardForm.CancelButton.Top;
  Nowy3Button.Width := WizardForm.CancelButton.Width;
  Nowy3Button.Height := WizardForm.CancelButton.Height;
  Nowy3Button.Caption := 'Wstecz';
  Nowy3Button.OnClick := @Wstecz2OnClick;
  Nowy3Button.Parent := WizardForm
end;

label1:= Tlabel.create(Wizardform);
 with label1 do
 begin
  AutoSize:=False;
  WordWrap:=True;
  Left := 40
  Top := 120
  Width := 200
  Caption := 'Konfiguracja.';
  Parent := WizardForm.welcomepage
  transparent:= true;
  font.size:= 15
  font.style:= [fsBold]
  height:= 30
end;

label2:= Tlabel.create(Wizardform);
 with label2 do
 begin
   AutoSize:=False;
  WordWrap:=True;
  Left := 40
  Top := 120
  Width := 500
  Caption := 'Instalowanie dodatkowych programów.';
  Parent := WizardForm.welcomepage          
  transparent:= true;
  font.size:= 15
  height:= 30
  font.style:= [fsBold]
end;
nowy1button.hide
nowy3button.hide
nowy2button.hide
label1.hide
label2.hide
Wizardform.diredit.hide
wizardform.dirbrowsebutton.hide
wizardform.dirbrowsebutton.left:= 380
wizardform.dirbrowsebutton.top:= 160
Wizardform.diredit.parent:=Wizardform.welcomepage
Wizardform.diredit.left:= 40
Wizardform.diredit.top:= 160
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID =wpLicense) or (PageID =wpInfoBefore)or(PageID =wpUserInfo)or(PageID =wpSelectDir)or(PageID =wpSelectComponents)or(PageID =wpSelectProgramGroup)or(PageID =wpSelectTasks)or(PageID =wpReady)then
  Result:= True;
end;

Procedure CurPageChanged(CurPageID: Integer);
 begin
if CurPageID = wpWelcome then
begin
WizardForm.nextbutton.Caption:= 'Na stronę'
end;
end;
1

Co do przełączenia na Twoją stronę po kliknięciu przycisku "Nowy":

Procedure ScrollToStrona1; 
Begin
 If WizardForm.CurPageID<=wpSelectDir then //jeśli jesteś na którejś ze stron przed Twoją stroną
   While WizardForm.CurPageID<>Strona1.ID do //pętla przewijania stron w przód aż będzie aktywna Twoja strona
     WizardForm.NextButton.OnClick(WizardForm.NextButton);
 If WizardForm.CurPageID>=wpSelectComponents then //jeśli jesteś na którejś ze stron po Twojej stronie
   While WizardForm.CurPageID<>Strona1.ID do //pętla przewijania stron w tył aż będzie aktywna Twoja strona
     WizardForm.BackButton.OnClick(WizardForm.BackButton);
End;

procedure NowyButtonOnClick(Sender: TObject); //przechwycenie kliknięcia przycisku "Nowy"
begin 
  BtnNowyClicked:=true; //włączenie aktywności funkcji ShouldSkipPage (pominięcie 1 strony i wyboru folderu)
  ScrollToStrona1; //przewinięcie na stronę Strona1
end;
 

1 użytkowników online, w tym zalogowanych: 0, gości: 1