2012-04-12 14 views
6

Ho preparato uno script semplice che visualizza l'immagine sotto ProgressGauge bar su wpInstalling Pagina.Inno Setup - Visualizzazione di più immagini (slideshow) su wpInstallazione della pagina nella barra ProgressGauge

Ma ... Ho bisogno di funzionalità più complesse.

Quello che mi serve sono le immagini multiple mostrano, ciascuna dopo X (ad esempio 7) secondi (con loop quando l'installazione è più lunga di X secondi * numero di immagini) o ciascuna dopo X (per esempio 10) percento di installazione. Ho provato a incorporare le immagini in ProgressGauge.Position, ma non sono riuscito.

Ecco quello che ho:

procedure CurPageChanged(CurPageID: Integer); 
var 
    BmpFile: TBitmapImage; 
begin 
    ExtractTemporaryFile('01.bmp'); 
    ExtractTemporaryFile('02.bmp'); 
    ExtractTemporaryFile('03.bmp'); 

    if CurPageID = wpInstalling then 
    begin 
    BmpFile:= TBitmapImage.Create(WizardForm); 
    BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\01.bmp')); 
    BmpFile.Width:= ScaleX(420); 
    BmpFile.Height:= ScaleY(180); 
    BmpFile.Left := WizardForm.ProgressGauge.Left + ScaleX(0); 
    BmpFile.Top := WizardForm.ProgressGauge.Top + ScaleY(35); 

    // BmpFile.Parent:= WizardForm.InstallingPage; 
    // BmpFile:= TBitmapImage.Create(WizardForm); 
    // BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\03.bmp')); 
    // BmpFile.Width:= ScaleX(420); 
    // BmpFile.Height:= ScaleY(400); 
    // BmpFile.Left := WizardForm.ProgressGauge.Left + ScaleX(0); 
    // BmpFile.Top := WizardForm.ProgressGauge.Top + ScaleY(35); 
    // BmpFile.Parent:= WizardForm.InstallingPage; 

    // BmpFile:= TBitmapImage.Create(WizardForm); 
    // BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\03.bmp')); 
    // BmpFile.Width:= ScaleX(420); 
    // BmpFile.Height:= ScaleY(400); 
    // BmpFile.Left := WizardForm.ProgressGauge.Left + ScaleX(0); 
    // BmpFile.Top := WizardForm.ProgressGauge.Top + ScaleY(35); 
    // BmpFile.Parent:= WizardForm.InstallingPage; 
    end; 
end; 

L'obiettivo è:
Sul wpInstalling ci dovrebbe essere X immagini visualizzate, ogni successivo per X secondi o dopo X per cento di installazione.

risposta

7

Poiché lo ProgressGauge non ha eventi di modifica dell'avanzamento e non è possibile elaborare i messaggi dell'applicazione di installazione, è necessario utilizzare il timer dell'API di Windows. Questo timer ha bisogno di una funzione di callback che non è possibile definire nello script Inno Setup, quindi è necessario disporre di una libreria esterna per svolgere questo compito. Tuttavia c'è la libreria InnoCallback che può fare esattamente questo.

Per il seguente codice di copiare la libreria InnoCallback.dll nella vostra directory di installazione, si fondono questo codice con lo script di Inno Setup e mettere in atto una sorta di pagina di presentazione di svolta nel caso OnSlideTimer che si chiamerà periodicamente (con le impostazioni correnti ogni secondo).

[Files] 
Source: "InnoCallback.dll"; DestDir: "{tmp}"; Flags: dontcopy 

[code] 
var 
    TimerID: Integer; 

type 
    TTimerProc = procedure(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD); 

function WrapTimerProc(Callback: TTimerProc; ParamCount: Integer): LongWord; 
    external '[email protected]:InnoCallback.dll stdcall';  
function SetTimer(hWnd: HWND; nIDEvent, uElapse: UINT; 
    lpTimerFunc: UINT): UINT; external '[email protected] stdcall'; 
function KillTimer(hWnd: HWND; uIDEvent: UINT): BOOL; 
    external '[email protected] stdcall'; 

procedure OnSlideTimer(Wnd: HWND; Msg: UINT; TimerID: UINT_PTR; 
    SysTime: DWORD); 
begin 
    { here you can turn your slideshow pages; use some variable to store the } 
    { current index of the slide you are on, note that this procedure is called } 
    { periodically each 1000 ms (see below why), so here you can also check the } 
    { progress value, if you want to } 
end; 

procedure StartSlideTimer; 
var 
    TimerCallback: LongWord; 
begin 
    TimerCallback := WrapTimerProc(@OnSlideTimer, 4); 
    { third parameter here is the timer's timeout value in milliseconds } 
    TimerID := SetTimer(0, 0, 1000, TimerCallback); 
end; 

procedure KillSlideTimer; 
begin 
    if TimerID <> 0 then 
    begin 
    if KillTimer(0, TimerID) then 
     TimerID := 0; 
    end; 
end; 

function InitializeSetup: Boolean; 
begin 
    Result := True; 
    TimerID := 0; 
end; 

procedure DeinitializeSetup; 
begin 
    KillSlideTimer; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
begin 
    if CurPageID = wpInstalling then 
    StartSlideTimer 
    else 
    KillSlideTimer; 
end; 
+0

Questo ha risolto il mio problema! Ho aggiunto il Global Var Index: Integer; e leggermente modificato il codice per le immagini (IntToStr) – RobeN

+1

Sì, lì si può avere il contatore del tempo o accedere allo stato di avanzamento se necessario. Ecco perché ho mostrato solo come implementare l'evento del timer per il tuo caso ;-) Ma forse dovresti anche controllare lo stato del tuo stato di avanzamento lì, perché non apparirebbe così bello se si verifica un errore e ruoterai comunque la tua presentazione. Penso che dovresti far scorrere le tue immagini solo quando 'WizardForm.ProgressGauge.State = npbsNormal', ma è anche su di te. Vedi ['here'] (http://www.jrsoftware.org/ishelp/topic_scriptclasses.htm#TNewProgressBarState) per gli stati di avanzamento disponibili. – TLama

+1

L'ho fatto. Funzione speciale per 'Paused', per' Error' e per 'Position = Max' (durante l'installazione di app di terze parti). Grazie per l'aiuto e il supporto! – RobeN

2

Perché non utilizzare AfterInstall su ogni voce di file per modificare l'immagine?

+0

Non è quello che mi serve. La soluzione di TLama è decisamente migliore (almeno per me). – RobeN

+0

Sarà bello vedere un esempio del tuo lavoro ... ho ancora problemi a far funzionare correttamente questo script. – Dielo