2012-03-02 224 views
1

我有一個INNO安裝程序,它像一個魅力一樣工作。現在我需要爲用戶預先安裝主題選項以選擇應用程序的主題。這些主題是在安裝時複製到{tmp}文件夾的部署目錄中定義的。INNO安裝程序在安裝前開始安裝時提取目錄樹

我想要做的是在這個目錄部分查找特定的目錄/文件來確定主題選項。當我找到一個主題時,我會將一個選項添加到組合框供用戶選擇。此選擇將影響應用程序的安裝(也來自{tmp}區域)。

我的問題是,直到點擊安裝按鈕,文件纔會被提取到{tmp}目錄。有沒有辦法在安裝之前查看壓縮文件結構或強制這些文件到{tmp}目錄?文件結構對於每個主題都是不同的,並且基於客戶只有某些主題可用。

我以前使用過ExtractTemporaryFile方法,但我不知道在運行時存在哪些主題,直到解壓目錄爲止。能夠提取整個目錄樹會很好,但我找不到一個簡單的方法來完成此操作。

感謝您的幫助。

下面是什麼,我本來想做一個示例腳本:

[Setup] 
AppName=Test 
AppVersion=1.5 
DefaultDirName={pf}\test 
OutputDir=Output 
OutputBaseFilename=tt 
DisableReadyPage=false 

[Files] 
;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme1; Flags: ignoreversion replacesameversion 
;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme2; Flags: ignoreversion  replacesameversion 
;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme3; Flags: ignoreversion replacesameversion 
;;Source: readme.txt; DestDir: {tmp}\App\deploy\themes\theme4; Flags: ignoreversion replacesameversion 
Source: App\*.*; DestDir: {tmp}\App; Flags: ignoreversion replacesameversion recursesubdirs createallsubdirs 
Source: readme.txt; DestDir: {app}; Flags: ignoreversion replacesameversion 

[Run] 

[Code] 

var 
    curDir : String; 
    TestPage : TWizardPage; 
    ThemeComboBox: TNewComboBox; 

procedure InitializeWizard; 
begin 
    TestPage := CreateCustomPage(wpSelectTasks, 'My test page', 'run test'); 

    // create the theme combo box 
    ThemeComboBox := TNewComboBox.Create(TestPage); 
    ThemeComboBox.Name := 'themeselection'; 
    ThemeComboBox.Width := TestPage.SurfaceWidth; 
    ThemeComboBox.Parent := TestPage.Surface; 
    ThemeComboBox.Style := csDropDownList; 
end; 

function NextButtonClick(CurPageID: Integer): Boolean; 
var 
    ThemeDir: String; 
begin 
    Result := True; 

    if CurPageID = wpSelectDir then 
    begin 
     // look for the networks and then add the ones that exist to the combo box 
     ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\tmeme1'); 
     MsgBox(ThemeDir, mbInformation, MB_OK); 
     if DirExists(ThemeDir) then 
     begin 
     // populate the combo box 
     // this is theme1 so it is Standard 
     ThemeComboBox.Items.Add('Standard'); 
     end; 

     ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\theme2'); 
     if DirExists(ThemeDir) then 
     begin 
     // populate the combo box 
     ThemeComboBox.Items.Add('theme2'); 
     end; 

     ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\theme3'); 
     if DirExists(ThemeDir) then 
     begin 
     // populate the combo box 
     ThemeComboBox.Items.Add('theme3'); 
     end; 

     ThemeDir := ExpandConstant('{tmp}\App\deploy\themes\theme4'); 
     if DirExists(ThemeDir) then 
     begin 
     // populate the combo box 
     ThemeComboBox.Items.Add('theme4'); 
     end; 
    end; 
end; 

回答

1

做到這一點,最好的辦法是使用ISPP枚舉文件,並建立相關的條目在編譯時列表你可以在運行時閱讀。

這可以直接輸出到一個pascal數組中,也可以輸出到一個文件,然後在運行時讀取並讀取它。

+1

你能舉個例子嗎?我不確定我是否知道你在說什麼。謝謝。 – 2012-03-05 13:11:19

+0

Steve,添加了一個例子(相當晚了:-) @Deanna,我認爲從InnoSetup預處理器輸出的東西不會輸出到運行時輸出(*輸出直接輸入到一個pascal數組*)。常量數組不受支持。 – TLama 2012-07-30 00:11:55

+1

@TLama正如你已經證明的那樣,它可以輸出代碼來填充數組,雖然:) – Deanna 2012-07-30 08:49:23

1

很晚,我知道:-)只是爲了完成你的問題與代碼示例;以下示例使用由SearchMask變量指定的路徑中找到的所有文件夾名稱填充組合框。每次它在該指定位置找到一個文件夾時,它都會將一行添加到字符串列表中。當通過位置搜索完成時,字符串列表被分配給組合框:

[Setup] 
AppName=My Program 
AppVersion=1.5 
DefaultDirName={pf}\My Program 

[Files] 
Source: App\*.*; DestDir: {tmp}\App; Flags: ignoreversion 

[Code] 
var 
    CustomPage: TWizardPage; 

procedure InitializeWizard; 
var 
    ThemeList: TStringList; 
    ThemeComboBox: TNewComboBox; 
begin 
    CustomPage := CreateCustomPage(wpWelcome, 'Theme selection page', ''); 

    ThemeComboBox := TNewComboBox.Create(WizardForm); 
    ThemeComboBox.Parent := CustomPage.Surface; 
    ThemeComboBox.Style := csDropDownList; 
    ThemeComboBox.Width := CustomPage.SurfaceWidth; 

    ThemeList := TStringList.Create; 
    try 
    #define SearchHandle 
    #define SearchResult 
    #define SearchMask "App\Deploy\Themes\*.*" 
    #sub ProcessFoundFile 
     #define FileName FindGetFileName(SearchHandle) 
     #if (FileName != ".") && (FileName != "..") 
     #emit ' ThemeList.Add(''' + FileName + ''');' 
     #endif 
    #endsub 
    #for {SearchHandle = SearchResult = FindFirst(SearchMask, faDirectory); \ 
     SearchResult; SearchResult = FindNext(SearchHandle)} ProcessFoundFile 
    #if SearchHandle 
     #expr FindClose(SearchHandle) 
    #endif 
    ThemeComboBox.Items.Assign(ThemeList); 
    finally 
    ThemeList.Free; 
    end; 
end; 

// you can save the current script file output after compilation preprocessing 
// to see the result 
#expr SaveToFile("d:\OutputScript.iss") 
相關問題