Inno setup NextButtonClick

0

Mam problem z przyciskiem z funkcją NextButtonClick. Mam dwie strony custompage, obie przechwytują kliknięcia przycisku dalej aby uruchomić program EXE i chciałbym wiedzieć, jak mogę zrobić to aby nie było duplikatu tej funkcji gdy kompiluję kod. To samo miałem z InitializeWizard ale już sobie poradziłem z dublem tej procedury. Gdy wykorzystuję ten sam kod do NextButtonClick to nie działa wyskakuję błąd Unknown identifier 'NextButtonClick1'.

Mój kod to:

function NextButtonClick(CurPageID: Integer): Boolean; 
begin
NextButtonClick1(CurPageID: Integer): Boolean; 
NextButtonClick2(CurPageID: Integer): Boolean; 
end;
0

no ale co to w ogóle ma być? wewnątrz bloku begin-end umieszczasz nagłówki jakichś innych funkcji…
nie chciałeś ich przypadkiem wywołać?

0

Wrzuć cały kod, który już stworzyłeś, a pomyśli się czego brakuje lub jest źle. Tak w ogóle, to brakuje Ci podstaw użycia języka Pascal (co pokazałeś w tym fragmencie kodu), więc jeśli planujesz dłuższą przygodę z Delphi lub Inno Setup-em, to radzę poczytać nie tylko helpa do niego, ale jakąś książkę o programowaniu w Delphi, bo za chwilę będziesz znowu miał problem, który nie wymaga nawet średniej wiedzy programistycznej.

0

To jest kod na dodatkową stronę który zrobił dla mnie kolega marogo (w innym temacie). Jest tu jeszcze kod Splash screen(to jest sprawne).

[Code]
//Splash
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure Splash();
begin
    ExtractTemporaryFile('isgsg.dll');
    ExtractTemporaryFile('Splash.png');
//  Splash.png',1000(oznacza ilość czasu "narastania" obrazu (1000-1 sekunda)itd),1000(oznacza ilość czasu przez jaki jest wyświetlanay (3000-3 sekundy) itd.),1000(oznacza ilość czasu "wygasania" obrazu (1000-1 sekunda)itd)
    ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;                                                                                        
 
procedure InitializeWizard1();
begin
Splash();
end;

//Str
Var
 Page: TWizardPage;                       
 RadioButtonLightMode, RadioButtonSponsoredMode: TRadioButton;
 
procedure RadioButtonLightModeClick(Sender: TObject);
begin
end;
 
procedure RadioButtonSponsoredModeClick(Sender: TObject);
begin
end;
 
procedure InitializeWizard2();
Begin
  Page := CreateCustomPage(wpWelcome, '1str', 'Testowanie'); //ddatkowa strona po stronie wpWelcome
 
  RadioButtonLightMode:= TRadioButton.Create(Page);  
  RadioButtonLightMode.Top:=60;
  RadioButtonLightMode.Left:=20;
  RadioButtonLightMode.Caption:='Nie instaluj';  
  RadioButtonLightMode.Parent:=Page.Surface;
  RadioButtonLightMode.OnClick:=@RadioButtonLightModeClick;
 
  RadioButtonSponsoredMode:=TRadioButton.Create(Page);
  RadioButtonSponsoredMode.Top:=80;
  RadioButtonSponsoredMode.Left:=20;
  RadioButtonSponsoredMode.Caption:='Instaluj';
  RadioButtonSponsoredMode.Checked:=True;
  RadioButtonSponsoredMode.OnClick:=@RadioButtonSponsoredModeClick;
  RadioButtonSponsoredMode.Parent:=Page.Surface;

End;
 
function BackButtonClick1(CurPageID: Integer): Boolean; 
  Var
  ResultCode: Integer;
Begin
  Result:=true;
  If (CurPageID=100) and RadioButtonSponsoredMode.Checked then
    If Exec('c:\windows\notepad.exe', '', 'c:\windows', SW_SHOW, ewWaitUntilTerminated, ResultCode) 
      then 
      else MsgBox('Błąd uruchomienia programu! Kod błędu: '+IntToStr(ResultCode), mbInformation, MB_OK);  
End;


//2Str
Var
 Pages: TWizardPage;                       
 RadioButtonLihtMode, RadioButtonSponoredMode: TRadioButton;
 
procedure RadioButtonLihtModeClick(Sender: TObject);
begin
end;
 
procedure RadioButtonSponoredModeClick(Sender: TObject);
begin
end;
 
procedure InitializeWizard3();
Begin
  Page := CreateCustomPage(wpInfoBefore, '2str', 'Testowanie'); //ddatkowa strona po stronie wpWelcome
 
  RadioButtonLihtMode:= TRadioButton.Create(Page);  
  RadioButtonLihtMode.Top:=60;
  RadioButtonLihtMode.Left:=20;
  RadioButtonLihtMode.Caption:='Nie instaluj';  
  RadioButtonLihtMode.Parent:=Page.Surface;
  RadioButtonLihtMode.OnClick:=@RadioButtonLightModeClick;
 
  RadioButtonSponoredMode:=TRadioButton.Create(Page);
  RadioButtonSponoredMode.Top:=80;
  RadioButtonSponoredMode.Left:=20;
  RadioButtonSponoredMode.Caption:='Instaluj';
  RadioButtonSponoredMode.Checked:=True;
  RadioButtonSponoredMode.OnClick:=@RadioButtonSponsoredModeClick;
  RadioButtonSponoredMode.Parent:=Page.Surface;

End;
 
function NextButtonClick2(CurPageID: Integer): Boolean; 
  Var
  ResultCode: Integer;
Begin
  Result:=true;
  If (CurPageID=100) and RadioButtonSponoredMode.Checked then
    If Exec('c:\windows\regedit.exe', '', 'c:\windows', SW_SHOW, ewWaitUntilTerminated, ResultCode) 
      then 
      else MsgBox('Błąd uruchomienia programu! Kod błędu: '+IntToStr(ResultCode), mbInformation, MB_OK);  
End;

procedure InitializeWizard();
begin
 InitializeWizard1();
 InitializeWizard2();
 InitializeWizard3();
 InitializeWizard4();
end; 

function NextButtonClick(CurPageID: Integer): Boolean; 
begin
NextButtonClick1(CurPageID: Integer): Boolean; 
NextButtonClick2(CurPageID: Integer): Boolean; 
end;
1

[Code]

 Var
 Page1, Page2: TWizardPage;                       
 RadioButtonLightModePage1,RadioButtonLightModePage2,
 RadioButtonSponsoredModePage1, RadioButtonSponsoredModePage2: TRadioButton;

 
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';


procedure Splash;
begin
    ExtractTemporaryFile('isgsg.dll');
    ExtractTemporaryFile('Splash.png');
//  Splash.png',1000(oznacza ilość czasu "narastania" obrazu (1000-1 sekunda)itd),1000(oznacza ilość czasu przez jaki jest wyświetlanay (3000-3 sekundy) itd.),1000(oznacza ilość czasu "wygasania" obrazu (1000-1 sekunda)itd)
    ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;  
   

procedure InitializeWizard(); //taka procedura może być tylko jedna (patrz help i przykłady!)
Begin
  Splash;

  Page1:=CreateCustomPage(wpWelcome, '1str', 'Testowanie strona 1'); //dodatkowa strona po stronie wpWelcome
 
  RadioButtonLightModePage1:= TRadioButton.Create(Page1);  
  RadioButtonLightModePage1.Top:=60;
  RadioButtonLightModePage1.Left:=20;
  RadioButtonLightModePage1.Caption:='Nie instaluj (str1)';  
  RadioButtonLightModePage1.Parent:=Page1.Surface;

  RadioButtonSponsoredModePage1:=TRadioButton.Create(Page1);
  RadioButtonSponsoredModePage1.Top:=80;
  RadioButtonSponsoredModePage1.Left:=20;
  RadioButtonSponsoredModePage1.Caption:='Instaluj (str1)';
  RadioButtonSponsoredModePage1.Checked:=True;
  RadioButtonSponsoredModePage1.Parent:=Page1.Surface;


  Page2:=CreateCustomPage(wpInfoBefore, '2str', 'Testowanie strona 2'); //dodatkowa strona po stronie wpInfoBefore
 
  RadioButtonLightModePage2:= TRadioButton.Create(Page2);  
  RadioButtonLightModePage2.Top:=60;
  RadioButtonLightModePage2.Left:=20;
  RadioButtonLightModePage2.Caption:='Nie instaluj (str2)';  
  RadioButtonLightModePage2.Parent:=Page2.Surface;  
 
  RadioButtonSponsoredModePage2:=TRadioButton.Create(Page2);
  RadioButtonSponsoredModePage2.Top:=80;
  RadioButtonSponsoredModePage2.Left:=20;
  RadioButtonSponsoredModePage2.Caption:='Instaluj (str2)';
  RadioButtonSponsoredModePage2.Checked:=True;  
  RadioButtonSponsoredModePage2.Parent:=Page2.Surface;


 // InitializeWizard4();  ///tu nie wiem co to, sam musisz dopisać

End;

function BackButtonClick(CurPageID: Integer): Boolean; //taka procedura może być tylko jedna (patrz help i przykłady!)
  Var
  ResultCode: Integer;
Begin
  Result:=true; //sprawdź w helpie jakie znaczenie ma rezultat funkcji
  Case CurPageID of
    100: Begin //obsługa kliknięcia przycisku Back na stronie 1
           MsgBox('Wcisnąłeś przycisk Back na stronie 1.', mbInformation, MB_OK);  
           If RadioButtonSponsoredModePage1.Checked then 
           Begin 
              //przy zaznaczonym radiobuttonie 'Instaluj' na str1 ma się uruchomić program przy cofnięciu ze str1 na strone powitalną
             If Exec('c:\windows\notepad.exe', '', 'c:\windows', SW_SHOW, ewWaitUntilTerminated, ResultCode) 
               then MsgBox('Uruchomiony program się zakończył (rezultat wykonania:'+InttoStr(ResultCode)+'). Przejście do strony powitalnej.', mbInformation, MB_OK)
               else MsgBox('Błąd uruchomienia programu! Kod błędu: '+IntToStr(ResultCode), mbInformation, MB_OK);  
           End;
         End;
    101: Begin //obsługa kliknięcia przycisku Back na stronie 2
           MsgBox('Wcisnąłeś przycisk Back na stronie 2.', mbInformation, MB_OK);  
           If RadioButtonSponsoredModePage2.Checked then
           Begin
             //przy zaznaczonym radiobuttonie 'Instaluj' na str2 ma się uruchomić program przy cofnięciu ze str2 na str1
             If Exec('c:\windows\notepad.exe', '', 'c:\windows', SW_SHOW, ewWaitUntilTerminated, ResultCode) 
               then MsgBox('Uruchomiony program się zakończył (rezultat wykonania:'+InttoStr(ResultCode)+'). Przejście do poprzedniej strony.', mbInformation, MB_OK)
               else MsgBox('Błąd uruchomienia programu! Kod błędu: '+IntToStr(ResultCode), mbInformation, MB_OK);  
           End;
         End;
  End;{Case}
End;


function NextButtonClick(CurPageID: Integer): Boolean; //taka procedura może być tylko jedna (patrz help i przykłady!)
  Var
  ResultCode: Integer;
Begin
  Result:=true; //sprawdź w helpie jakie znaczenie ma rezultat funkcji
  Case CurPageID of
    100: Begin //obsługa kliknięcia przycisku Next na stronie 1
           MsgBox('Wcisnąłeś przycisk Next na stronie 1.', mbInformation, MB_OK);  
           If RadioButtonSponsoredModePage1.Checked then 
           Begin 
              //przy zaznaczonym radiobuttonie 'Instaluj' na str1 ma się uruchomić program przy przejściu ze str1 na str2
             If Exec('c:\windows\notepad.exe', '', 'c:\windows', SW_SHOW, ewWaitUntilTerminated, ResultCode) 
               then MsgBox('Uruchomiony program się zakończył (rezultat wykonania:'+InttoStr(ResultCode)+'). Przejście do następnej strony.', mbInformation, MB_OK)
               else MsgBox('Błąd uruchomienia programu! Kod błędu: '+IntToStr(ResultCode), mbInformation, MB_OK);  
           End;
         End;
    101: Begin //obsługa kliknięcia przycisku Next na stronie 2
           MsgBox('Wcisnąłeś przycisk Next na stronie 2.', mbInformation, MB_OK);  
           If RadioButtonSponsoredModePage2.Checked then
           Begin
             //przy zaznaczonym radiobuttonie 'Instaluj' na str2 ma się uruchomić program przy przejściu ze str2 na dalszą jaką tam masz
             If Exec('c:\windows\notepad.exe', '', 'c:\windows', SW_SHOW, ewWaitUntilTerminated, ResultCode) 
               then MsgBox('Uruchomiony program się zakończył (rezultat wykonania:'+InttoStr(ResultCode)+'). Przejście do następnej strony.', mbInformation, MB_OK)
               else MsgBox('Błąd uruchomienia programu! Kod błędu: '+IntToStr(ResultCode), mbInformation, MB_OK);  
           End;
         End;
  End;{Case}
End;

 
0

Dzięki serdeczne za kod. Rzeczywiście ta funkcja podwójnie być nie może bo w żadnym przykładzie tego nie widziałem, w internecie też ale myślałem, że słabo szukam.
Co do tego //InitializeWizard4(); to znalazłem to na jakimś rosyjskim forum o skryptach do inno setup i jeśli się ma tą procedurę podwójnie lub więcej razy
to stosuję się ten skrypt:

[Code]
procedure InitializeWizard();
begin
 InitializeWizard1();
 InitializeWizard2();
 InitializeWizard3();
 InitializeWizard4();
end; 

Jedna procedura jest do wszystkich. Jeszcze jedno pytanie jeśli będę chciał mieć 2. stronę koło 1. a nie koło (wpInfoBefore, to jakie ID ma strona 1.

1
marcin55246 napisał(a)

Jeszcze jedno pytanie jeśli będę chciał mieć 2. stronę koło 1. a nie koło (wpInfoBefore, to jakie ID ma strona 1.

W helpie InnoSetup-a (rozdział "Pascal Scripting", na dole strony "Event Functions") masz wylistowane nazwy wszystkich stron od wpWelcome do wpFinished. ID tychże stron mieści się odpowiednio w zakresie od 1 do 14, a dla własnych stron ID leci od 100 w górę. Zresztą łatwo sprawdzić ID strony stawiając pułapkę w procedurze np. NextButtonClick strony i klikając przycisk Next. I teraz jeśli chcesz aby np. strona PageB pokazywała się po stronie PageA, to przy tworzeniu strony PageB jako pierwszy parametr funkcji CreateCustomPage dajesz ID strony PageA, czyli PageA.ID.

0

Dzięki za odpowiedź. To w rozdziale "Pascal Scripting" to już widziałem. Ale nie mogłem znaleźć odpowiedzi na moje pytanie toteż napisałem tutaj. Udało mi się połączyć też ten skrypt na dwie strony w jedną całość z #3 postu wzorując się na twoim skrypcie więc jakiś postęp jest.

0

Jeszcze jedno pytanie z innej beczki. Co muszę poszukać (procedura, funkcja) żeby instalator najpierw poszukał plik exe w katalogu do którego chcę zainstalować a potem zainstalował program. To ma działać na zasadzie patch'a, znajdzie plik w folderze to zainstaluję program a kiedy nie znajdzie to nie pozwoli zainstalować. Czy do tego wykorzystuje się funkcję FindFirst, czy coś innego?

0
marcin55246 napisał(a)

To ma działać na zasadzie patch'a, znajdzie plik w folderze to zainstaluję program a kiedy nie znajdzie to nie pozwoli zainstalować. Czy do tego wykorzystuje się funkcję FindFirst, czy coś innego?

Widzę, że jeszcze mało wiesz o programowaniu... Do szukania plików na dysku o konkretnych kryteriach służą dwie funkcje - FindFirst i FindNext - poczytaj o nich;

0

Mało... ja nic nie wiem o programowaniu zacząłem się tym interesować jakiś tydzień temu. Co do tych odnośników to już próbowałem to zrobić i za każdym razem błąd nieznany typ TSearchRec, próbowałem też szukać w helpie inno setup ale tam coś wymaga kropki ('.') i nie wiem gdzie ją wstawić.

1
marcin55246 napisał(a)

Jeszcze jedno pytanie z innej beczki. Co muszę poszukać (procedura, funkcja) żeby instalator najpierw poszukał plik exe w katalogu do którego chcę zainstalować a potem zainstalował program. To ma działać na zasadzie patch'a, znajdzie plik w folderze to zainstaluję program a kiedy nie znajdzie to nie pozwoli zainstalować. Czy do tego wykorzystuje się funkcję FindFirst, czy coś innego?

Proponuję użyć takiego mechanizmu:

 
[Files]
Source: ProgramPatchujacy.exe; DestDir: {app}; Check: JestPlikDoSpatchowania

[Run]
Filename: {app}\ProgramPatchujacy.exe; Check: JestPlikDoSpatchowania

[Code]
Function JestPlikDoSpatchowania: Boolean;
  Var
   SR: TFindRec;
Begin
    Result:=FindFirst(ExpandConstant('{app}')+'PlikDoSpatchowania.exe', SR);    
    FindClose(SR);
End;

//jeśli chcesz usunąć po instalacji program patchujący to dodatkowo ta procedurka:
procedure DeinitializeSetup(); 
begin
  If FileExists(ExpandConstant('{app}')+ProgramPatchujacy.exe) then 
    DeleteFile(ExpandConstant('{app}')+ProgramPatchujacy.exe);
end;

ProgramPatchujacy to oczywiście program, który się zainstaluje i uruchomi w lokalizacji docelowej (zakładam, że tam chcesz go instalować), lecz stanie się to tylko wtedy, gdy instalator znajdzie plik PlikDoSpatchowania.exe w folderze docelowym, którego wybierzesz w czasie instalacji (funkcja JestPlikDoSpatchowania zwróci true). Zakładam, że Twój program patchujący wie jaka jest nazwa pliku do spatchowania i sobie go otworzy w swojej bieżącej lokalizacji.

0

Kod działać działa, ale nie wiem czemu ProgramPatchujacy.exe nie zostaję skopiowany do folderu {app} a tym samym się nie zamienia z PlikDoSpatchowania.exe.

Edit
mało tego to program nawet nie pokazuję czy jest plik "plikdospatchowania"

0
marcin55246 napisał(a)

Kod działać działa, ale nie wiem czemu ProgramPatchujacy.exe nie zostaję skopiowany do folderu {app} a tym samym się nie zamienia z PlikDoSpatchowania.exe.

Edit
mało tego to program nawet nie pokazuję czy jest plik "plikdospatchowania"

Pokaż sekcję [Setup] skryptu, bo może to kwestia nieodpowiednich ustawień ogólnych instalatora.

P.S. Zauważyłem, że w skrypcie który Ci podałem brakuje ** i cudzysłowi w ścieżkach, tzn. ma być:

Result:=FindFirst(ExpandConstant('{app}')+'\PlikDoSpatchowania.exe', SR);

oraz:

procedure DeinitializeSetup();
begin
If FileExists(ExpandConstant('{app}')+'\ProgramPatchujacy.exe') then
DeleteFile(ExpandConstant('{app}')+'\ProgramPatchujacy.exe');
End;

Sorki pisałem z pamięci, dość późno w nocy.

P.S.2.

marcin55246 napisał(a)

ProgramPatchujacy.exe nie zostaję skopiowany do folderu {app} a tym samym się nie zamienia z PlikDoSpatchowania.exe.

Zaraz, zaraz, to Ty chcesz swoim programem ProgramPatchujacy.exe (po skopiowaniu go do folderu docelowego) coś modyfikować w pliku ProgramDoSpatchowania.exe, czy ProgramPatchujacy.exe ma tylko nadpisać plik ProgramDoSpatchowania.exe (zastąpić go)? To co Ci napisałem wykonuje tą pierwszą operację.

0

Zauważyłem brak tych cudzysłowów po różnicy w linijce result, ale trzeba było widocznie jeszcze dodać \ przed exe ('\ProgramPatchujacy.exe') bo wcześniej tego nie było i teraz działa kopiuję program do folderu i uruchamia ten program, lecz pozwala zainstalować program nawet jeśli pliku nie ma w folderze (oczywiście nie przekopiuję PlikDoSpatchowania i go nie uruchomi). Tak,tak ProgramPatchujacy.exe ma nadpisać plik ProgramDoSpatchowania.exe (zastąpić go) ale cały instalator ma się zainstalować dopiero jeśli plik ProgramDoSpatchowania jest folderze a jeśli go nie ma to nie pozwoli przejść za stronę wpSelectDir i wyskoczy komunikat że pliku nie znaleziono.

mój cały kod:

#define MyAppName "Mass Effect 2"
#define MyAppVersion "1.1"
#define MyAppPublisher "EA Games"
#define MyAppExeName "MassEffect2.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppID={{7F7752D3-C604-4238-9F40-F967B55F176D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
InfoBeforeFile=C:\Users\Marcin\Desktop\Nowy folder\q.txt
OutputDir=C:\Users\Marcin\Desktop\Nowy folder
OutputBaseFilename=Mass effect 2 Spolszczenie
SetupIconFile=C:\Users\Marcin\Desktop\Nowy folder\Icon_1.ico
Compression=lzma2/Ultra64
SolidCompression=false
InternalCompressLevel=Ultra64
DiskSpanning=true
DiskSliceSize=2100000000
UninstallFilesDir={app}\uninstall
WizardImageFile="C:\Users\Marcin\Desktop\Nowy folder\Mass2.bmp"
WizardSmallImageFile="C:\Users\Marcin\Desktop\Nowy folder\mass.bmp"

[Languages]
Name: "polish"; MessagesFile: "compiler:Languages\Polish.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Users\Marcin\Desktop\Mass Effect 2\data\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: ProgramPatchujacy.exe; DestDir: {app}; Check: JestPlikDoSpatchowania
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\\Binaries\MassEffect2.exe"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\\Binaries\MassEffect2.exe"; Tasks: desktopicon ;IconFilename: "{app}\Icon_1.ico"

[Files]
Source: "Splash.png"; DestDir: {tmp}; Flags: dontcopy
Source: "isgsg.dll"; DestDir: {tmp}; Flags: dontcopy

[Code]
procedure ShowSplashScreen(p1:HWND;p2:AnsiString;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';
procedure Splash();
begin
    ExtractTemporaryFile('isgsg.dll');
    ExtractTemporaryFile('Splash.png');
//  Splash.png',1000(oznacza ilość czasu "narastania" obrazu (1000-1 sekunda)itd),3000(oznacza ilość czasu przez jaki jest wyświetlanay (3000-3 sekundy) itd.),1000(oznacza ilość czasu "wygasania" obrazu (1000-1 sekunda)itd)
    ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;                                                                                        
 
procedure InitializeWizard();
begin
Splash();
end;

[Run]
Filename: {app}\ProgramPatchujacy.exe; Check: JestPlikDoSpatchowania
 
[Code]
Function JestPlikDoSpatchowania: Boolean;
  Var
   SR: TFindRec;
Begin
    Result:=FindFirst(ExpandConstant('{app}')+'\PlikDoSpatchowania.exe', SR);    
    FindClose(SR);
End;

[Messages]
ConfirmUninstall=Czy chcesz usunać program %1 spolszcznie
BeveledLabel=Mass Effect 2
0
marcin55246 napisał(a)

ProgramPatchujacy.exe ma nadpisać plik ProgramDoSpatchowania.exe (zastąpić go) ale cały instalator ma się zainstalować dopiero jeśli plik ProgramDoSpatchowania jest folderze

O jaki folder* tu chodzi? Czy go się wybiera, czy jest ustawiony na sztywno?

a jeśli go nie ma to nie pozwoli przejść za stronę wpSelectDir

Blokada przejścia do okna wyboru folderu, jeśli w jakimś folderze* nie ma pliku?
A jeśli jest plik w folderze*, to w jakim celu użytkownik będzie kolejny raz wybierał folder (strona wpSelectDir)?

Co do blokady przejścia na stronę wpSelectDir, to w Twoim skrypcie nie ma niczego, co by to (nie)umożliwiało jeśli są spełnione jakieś warunki, tzn. przede wszystkim brakuje obsługi zdarzenia NextButtonClick. Dzięki rezultatowi tej funkcji możesz pozwolić (lub nie) przejść użytkownikowi na kolejną stronę (cza więcej czytać helpa!). I teraz jeśli wynik funkcji NextButtonClick uzależnisz od wyniku funkcji FindFirst (w połączeniu z jakimiś tam dodatkowymi warunkami, np. zaznaczony jakiś radiobutton), to masz gotowy mechanizm, który zadziała tak jak chcesz. To nie jest wielka filozofia. ;-)

0

Chodzi o folder aplikacji {app}. folder aplikacji ma mieć zawsze tą samą nazwę tylko litera dysku (C,D,E) i podfoldery (np.programfiles) są zmienne zależy kto jak zainstaluję, ja np. zainstaluję w "C:\Program Files{app}" a ktoś w "D:\programy{app}". Blokada przejścia ma nastąpić wtedy kiedy w folderze {app} nie będzie exe, więc coś mi się zdaję, że musi być tak jak napisałeś funkcja NextButtonClick musi być zależna od wyniku funkcji FindFirst

0
marcin55246 napisał(a)

Chodzi o folder aplikacji {app}. folder aplikacji ma mieć zawsze tą samą nazwę tylko litera dysku (C,D,E) i podfoldery (np.programfiles) są zmienne zależy kto jak zainstaluję, ja np. zainstaluję w "C:\Program Files{app}" a ktoś w "D:\programy{app}". Blokada przejścia ma nastąpić wtedy kiedy w folderze {app} nie będzie exe, więc coś mi się zdaję, że musi być tak jak napisałeś funkcja NextButtonClick musi być zależna od wyniku funkcji FindFirst

Zajrzyj do helpa InnoSetup-a i przeczytaj jak jest interpretowana stała {app}, bo nie jest tak, jak Ty to opisujesz, np. "C:\Program Files{app}", przez co możesz się nie raz zdziwić, że InnoSetup robi coś nie po Twojej myśli ;-)

0

Z tego co zrozumiałem to {app} to nie zawsze folder aplikacji. bardziej by pasowało {#MyAppName}.

0

Po wielu nieudanych próbach udało mi się w końcu NextButtonClick uzależnić od wyniku funkcji.

function NextButtonClick(CurPageID: Integer): Boolean; 
  Var
  ResultCode: Integer;
  SR: TFindRec; 

begin
    Result := true;
    if CurPageID=wpSelectDir then
  If FindFirst(ExpandConstant('{app}')+'\PlikDoSpatchowania.exe', SR) then
  else begin
  Result := False;
  if CurPageID=wpSelectDir then
  MsgBox('Instalator wykrył, że ścieżka do folderu jest nie prawidłowa.' , mbInformation, MB_OK);
  end;
  end;

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