Inno setup NextButtonClick

Inno setup NextButtonClick
M5
  • Rejestracja:około 13 lat
  • Ostatnio:ponad 8 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:około 3 godziny
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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 8 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:minuta
  • Lokalizacja:Tuchów
  • Postów:12163
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:ponad 8 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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 16 lat
  • Ostatnio:12 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:ponad 8 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:ponad 8 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.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)