2015-01-15 86 views
2

我正在尋找向用戶顯示如何在安裝可再發行程序期間繼續操作的註釋的可能性。使用inno-setup在安裝過程中顯示文本

背景: 我有一些組件需要第三方安裝,它們退出複雜。如果用戶選擇這些組件中的一個,則會顯示帶有指令的消息框。在這個盒子之後,通過exec/shellExec以'ewWaitUntilTerminated'執行可執行文件。不幸的是用戶在安裝過程中看不到盒子。

我試着打開記事本中的筆記並使用'ewNoWait',但是在每次安裝重新分佈後它都不會自動關閉。用戶可以選擇多個這些組件,並且此幫助只應在特定安裝期間可見。用taskkill殺死記事本不是一個選項,它可以殺死用戶打開的記事本。

有什麼優雅的方式來獲得這樣的行爲?

回答

0

我終於找到了我的問題的解決方案創建TOutputProgressWizardPage。基於Slappy的回答,我使用了一個std MsgPage,並根據需要調整它的大小。 Thx來TLama爲他的答案調整大小代碼的另一個主題!

[Code] 
var 
    RedistPage: TOutputMsgWizardPage; 

    DefaultTop, 
    DefaultLeft, 
    DefaultHeight, 
    DefaultBackTop, 
    DefaultNextTop, 
    DefaultCancelTop, 
    DefaultBevelTop, 
    DefaultBeveledLabelTop, 
    DefaultInnerHeight, 
    DefaultOuterHeight: Integer; 

procedure InitializeWizard(); 
var 
    ReadMe: AnsiString; 

begin 

DefaultTop     := WizardForm.Top; 
DefaultLeft     := WizardForm.Left; 
DefaultHeight    := WizardForm.Height; 
DefaultBackTop    := WizardForm.BackButton.Top; 
DefaultNextTop    := WizardForm.NextButton.Top; 
DefaultCancelTop   := WizardForm.CancelButton.Top; 
DefaultBevelTop    := WizardForm.Bevel.Top; 
DefaultBeveledLabelTop  := WizardForm.BeveledLabel.Top; 
DefaultOuterHeight   := WizardForm.OuterNotebook.Height; 
DefaultInnerHeight   := WizardForm.InnerNotebook.Height; 

// save the contents of Readme.txt (non Unicode) in a string and build custom page 
try 
    ExtractTemporaryFiles('{tmp}\readme.txt'); 
    if LoadStringFromFile(ExpandConstant('{tmp}\readme.txt'), ReadMe) then 
     RedistPage := CreateOutputMsgPage(wpReady, 
      'Information', 'Please read the following important information about the installation before continuing.',ReadMe); 
except 
    ShowExceptionMessage; 
end; 

function ShouldSkipPage(PageID: Integer): Boolean; 
begin 
    Result := False; // initialize result to not skip any page (not necessary, but safer) 
    if PageID = RedistPage.ID then // if the page that is asked to be skipped is your custom page, then... 
    Result := not IsTaskSelected('dexela_API'); // if the task is not selected, skip the page 
end; 

procedure ChangePageSize(HeightOffset: Integer); 
begin 
    WizardForm.Top := DefaultTop - (HeightOffset - DefaultHeight) div 2; 
    WizardForm.Height := WizardForm.Height + (HeightOffset - DefaultHeight); 
    WizardForm.InnerPage.Height := WizardForm.InnerPage.Height + (HeightOffset - DefaultHeight); 
    WizardForm.InnerNotebook.Height := WizardForm.InnerNotebook.Height + (HeightOffset - DefaultHeight); 
    WizardForm.OuterNotebook.Height := WizardForm.OuterNotebook.Height + (HeightOffset - DefaultHeight); 
    WizardForm.CancelButton.Top := DefaultCancelTop + (HeightOffset - DefaultHeight); 
    WizardForm.NextButton.Top := DefaultNextTop + (HeightOffset - DefaultHeight); 
    WizardForm.BackButton.Top := DefaultBackTop + (HeightOffset - DefaultHeight); 
    WizardForm.Bevel.Top := DefaultBevelTop + (HeightOffset - DefaultHeight); 
end; 

procedure CurPageChanged(CurPageID: Integer); 
var 
    ComponentsPageTextHeight: Integer; 
begin 
    if (CurPageID = RedistPage.ID) and (IsTaskSelected('dexela_API'))then begin 
     ChangePageSize(650); 
     //Sleep(2000); // time for the user to recognize the text, before it is hidden by installer 
     // Extract all Dexela files and launch them. 
     try 
      ExtractTemporaryFiles('{tmp}\Setup.msi'); 
     except 
      ShowExceptionMessage; 
     end; 
     ShellExec('',ExpandConstant('{tmp}\Setup.msi'), '', '',SW_SHOW, ewWaitUntilTerminated, ResultCode); 
    end; 
end; 
1

與功能http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_createoutputprogresspage

function CreateOutputProgressPage(const ACaption, ADescription: String): TOutputProgressWizardPage; 

[Code] 
 
var 
 
    ProgressPage: TOutputProgressWizardPage; 
 

 
procedure InitializeWizard; 
 
begin 
 
    ProgressPage := CreateOutputProgressPage('Finalization of installation',''); 
 
end; 
 

 
procedure CurPageChanged(CurPageID: Integer); 
 
var 
 
    I: Integer; 
 
begin 
 
    // Page is shown after installation when Finish page is shown 
 
    if CurPageID = wpFinish then begin 
 
    ProgressPage.SetText('Installing some 3rd party stuff...', ''); 
 
    ProgressPage.SetProgress(0, 0); 
 
    ProgressPage.Show; 
 
    try 
 
     // Use exec/shellExec here to execute 3rd party app 
 

 
     // Also you can adjust progress barr position here: 
 
     for I := 0 to 10 do begin 
 
     ProgressPage.SetProgress(I, 10); 
 
     Sleep(100); 
 
     end; 
 
    finally 
 
     ProgressPage.Hide; 
 
    end; 
 
    end else 
 
    Result := True; 
 
end;

+0

顯示進度條是個好主意。就在最後一頁顯示出來之前(在安裝開始之前更好,因爲它們是先決條件,如果我理解正確的話),我會說。而'CurPageChanged'事件方法是一個過程,你當前的代碼沒有'Result'變量。此外,來自CodeDlg.iss示例的* sleepy *循環可能會誤導某些人。我寧願顯示幾行「Exec」,並且正在取得進展。附:代碼片段僅適用於HTML,CSS和JavaScript語言;-) – TLama

+0

謝謝你們的迴應。我之前嘗試過使用ProgressWizardPage,但最終以與上面完全相同的代碼進行了無限循環。我知道,當忽略使用try ...文檔時,文檔會對此提出警告。這不是原因。每次顯示測試進度條後,安裝程序都會返回到wpFinished並重新開始。如何讓設置停止在這裏?此外,我想要顯示的文本比TOutputProgressWizardPage似乎允許的更長。 CreateOutputMsg(備忘錄)頁面會更好。 – Mykron

相關問題