2017-01-09 74 views
1

根據用戶的選擇,我已經制作了自定義頁面來管理特定的redist工具安裝。Inno setup:ExtractTemporaryFile導致嚮導凍結

這些工具鏈接到用戶檢查的複選框,如果他想要或不需要安裝這些工具。 然後在那裏只顯示一個頁面,向用戶顯示每個工具的安裝進度。

我在這裏的問題是,只有當工具設置的第一個ExtractTemporaryFile完成時才顯示進度頁面,顯示最後一頁,就好像它已經凍結一樣。

在ExtractTemporaryFile發生之前,我必須讓進度頁面顯示的唯一方法是在任何安裝函數之前放置一個MsgBox。 但即使在這種情況下,當ExtractTemporaryFile啓動,進度條動畫被凍結,直到ExtractTemporaryFile後...

下面是代碼的這樣的部分:

procedure CurPageChanged(CurPageID: Integer); 
begin 
    If CurPageID=PageInstallationPersonnalisee.ID then 
    begin 
     ProgressBarLabelPageInstPerso.Caption := 'Initialisation...'; 
     if InstallTool1 = True then 
     begin 
      ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool1...'; 
      F_InstallTool1(); 
     end; 
     if InstallTool2 = True then 
     begin 
      ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool2...'; 
      F_InstallTool2(); 
     end; 
     if InstallTool3 = True then 
     begin 
      ProgressBarLabelPageInstPerso.Caption := 'Installing InstallTool3...'; 
      F_InstallTool3(); 
     end; 

     ProgressBarPageInstPerso.Style := npbstMarquee; 
     //ProgressBarPageInstPerso.Style := npbstNormal; 
     ProgressBarPageInstPerso.Position := 100; 

     CancelWithoutPrompt:=True; 
     WizardForm.Close; 
    end; 
end; 

注意ExtractTemporaryFile()是在每個F_InstallTooln()功能。

其他設置和文件的部分的一部分,可以幫助:

[Setup] 
SolidCompression=no 

[Files] 
;Temporary redists 
Source: "{#MyRessourcesPath}InstallTool1_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy 
Source: "{#MyRessourcesPath}InstallTool2_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy 
Source: "{#MyRessourcesPath}InstallTool3_Setup.exe"; DestDir: "{tmp}"; Flags: deleteafterinstall noencryption dontcopy 

在這裏,沒有顯示在網頁PageInstallationPersonnalisee直到第一ExtractTemporaryFile後...

我知道,ExtractTemporaryFile可能會導致一些延遲安裝過程,但爲什麼它應該導致嚮導凍結?

所以我的問題是:在我的情況下,有沒有辦法強制嚮導刷新,以便他在任何ExtractTemporaryFile程序啓動之前出現?

+0

對於提取到臨時文件夾的文件,最好使用'nocompression'標誌。也建議將它們放在'[Files]'部分的最開始處。它也取決於你的文件的大小。 – RobeN

+0

你好。如果情況下我添加了無壓縮參數,並且文件已經在文件部分的開頭。 但我仍然凍結,直到ExtractTemporaryFile程序完成.... – BenDev

+0

文件有多大? –

回答

0

ExtractTemporaryFile確實掛死了嚮導窗體。像大多數代碼一樣。

允許強制Windows消息隊列被抽取的唯一自定義頁面是TOutputProgressWizardPage(由CreateOutputProgressPage創建)。

你可以做這樣的事情:

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    ProgressPage: TOutputProgressWizardPage; 
begin 
    if CurPageID = wpReady then 
    begin 
    ProgressPage := CreateOutputProgressPage('Preparing installations', ''); 
    ProgressPage.Show; 
    try 
     ProgressPage.Msg1Label.Caption := 'Installing 1 ...'; 
     ProgressPage.SetProgress(0, 100); 
     ExtractTemporaryFile('1.exe'); 
     Exec(...); 

     ProgressPage.Msg1Label.Caption := 'Installing 2 ...'; 
     ProgressPage.SetProgress(33, 100); 
     ExtractTemporaryFile('2.exe'); 
     Exec(...); 

     ProgressPage.Msg1Label.Caption := 'Installing 3 ...'; 
     ProgressPage.SetProgress(66, 100); 
     ExtractTemporaryFile('3.exe'); 
     Exec(...); 

     ProgressPage.SetProgress(100, 100); 
     ProgressPage.Hide; 
    finally 
    end; 
    end; 
    Result := True; 
end; 

雖然它不具有動畫花哨的進度條,如果你不能調用SetProgress頻繁Windows現代版本中的工作真的太好。請注意,SetProgress調用是在後臺抽取消息隊列的內容。因此,即使參數不改變,也可以調用它。但是你不能,因爲ExtractTemporaryFile塊。


或者,你可以離開部署到[Files]部分,並具有安裝從AfterInstall event執行。

[Files] 
;Temporary redists 
Source: "{#MyRessourcesPath}InstallTool1_Setup.exe"; DestDir: "{tmp}"; \ 
    Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install1 
Source: "{#MyRessourcesPath}InstallTool2_Setup.exe"; DestDir: "{tmp}"; \ 
    Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install2 
Source: "{#MyRessourcesPath}InstallTool3_Setup.exe"; DestDir: "{tmp}"; \ 
    Flags: deleteafterinstall noencryption dontcopy; AfterInstall: Install3 
+0

非常感謝,它與CreateOutputProgressPage()非常相稱。 由於ProgressPage.Show真的顯示了ExtractTemporaryFile之前的頁面。 我仍然想知道爲什麼在ExtractTemporaryFile過程之前,即使在啓動ExtractTemporaryFile之前初始化它,爲什麼CreateCustomPage不會顯示... 您的替代解決方案無法爲我工作,因爲它是關於在主安裝之後管理這些工具的安裝,是安裝程序方案的一個側面部分,它不會執行整個主安裝,只要安裝了該工具就會強制一個WizardForm.Close。 – BenDev

+0

替代解決方案:使用['Check'參數](http://www.jrsoftware.org/ishelp/index.php?topic=scriptcheck)仍然可行。 –

+0

檢查參數不匹配'在這種情況下原因這些工具被安裝爲獨立文件之前的主要安裝和主要安裝是自願不執行,然後......但我的問題只是關於進度頁面不顯示,現在解決了;) – BenDev