Inno setup NextButtonClick

Inno setup NextButtonClick
M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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:

Kopiuj
function NextButtonClick(CurPageID: Integer): Boolean; 
begin
NextButtonClick1(CurPageID: Integer): Boolean; 
NextButtonClick2(CurPageID: Integer): Boolean; 
end;
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:3 minuty
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ć?

MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
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.

M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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).

Kopiuj
[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;
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
1
Kopiuj

[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;

 
M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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:

Kopiuj
[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.

MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
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.

M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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.

M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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?

flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Tuchów
  • Postów:12172
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;


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
edytowany 1x, ostatnio: flowCRANE
M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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ć.

MA
Jak byś zajrzał do helpa InnoSetup na stronę Pascal Scripting->Support Functions Reference i tam jak byk jest napisane, że funkcja FindFirst nie ma drugiego parametru typu TSearchRec tylko TFindRec! Poniżej napisałem Ci przykładowy mechanizm, którego możesz użyć. Na ten tydzień dość już gotowców :P
flowCRANE
W sumie tak, InnoSetup obsługuje pascala, ale torchę to inaczej wygląda; Żeby cokolwiek napisać swojego trzeba znać po pierwsze pascala, po drugie czytać dokumentację wymienioną przez kolegę @marogo; Po jakimś czasie nabierzesz wprawy i będziesz mógł pisać już bez naszej pomocy (ale czytaj sam i ucz się!);
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
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:

Kopiuj
 
[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.

M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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"

edytowany 1x, ostatnio: marcin55246
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
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ę.

edytowany 3x, ostatnio: marogo
M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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:

Kopiuj
#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
edytowany 2x, ostatnio: marcin55246
flowCRANE
Zepsułeś parser...
MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
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. ;-)

M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
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

MA
  • Rejestracja:prawie 17 lat
  • Ostatnio:7 dni
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 ;-)

M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
0

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

edytowany 1x, ostatnio: marcin55246
M5
  • Rejestracja:około 13 lat
  • Ostatnio:prawie 9 lat
  • Postów:22
0

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

Kopiuj
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;
edytowany 1x, ostatnio: marcin55246
MA
1. A ja myślałem, że już dawno po sprawie :p 2. A co to za konstrukcja "then else begin"? Nie przejrzyściej dać "If Not FindFirst().." ? 3. Drugi warunek "if CurPageID=wpSelectDir" jest zbędny.
M5
Może i tak mogłoby być ale jeśli nie dodam 2. warunku to MsgBox monituję mi na każdej stronie.
MA
A to ciekawe, co piszesz, bo ja tu widzę, że to pierwszy warunek "if CurPageID=wpSelectDir then" określa, czy wykonanie programu w ogóle dojdzie do drugiego identycznego warunku, który zawsze będzie spełniony, gdy będzie spełniony ten pierwszy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.