2017-05-23 32 views
2

我將嘗試使用此代碼來創建自定義表單,讓我找到文件解壓縮:Inno Setup - 如何創建自定義窗體,以便我可以找到要解壓縮的文件?

var 
    TNewDiskForm :TSetupForm; 
    DiskBitmapImage: TBitmapImage; 
    SelectDiskLabel,PathLabel: TLabel; 
    PathEdit: TEdit; 
    BrowseButton: TButton; 
    OKButton: TButton; 
    CancelButton: TButton; 
    Filename: String; 
    Path: String; 
    Dir: String; 
    ModalResult: Longint; 


//Пути поиска файла 
function GetSanitizedPath: String; 
begin 
    Result := Trim(PathEdit.Text); 
end; 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); 
begin 
    Cancel :=True; 
    Confirm :=False; 
end; 

//Кнопки Обзор 
procedure BrowseButtonClick(Sender: TObject); 
begin 
    Dir := GetSanitizedPath; 
    if BrowseForFolder(SetupMessage (msgSelectDirectoryLabel), Dir, False) then 
    PathEdit.Text := Dir + '\'; 
    TNewDiskForm.Show; 
end; 

// Форма зыкрытия (работает mrOK) 
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    Path := PathEdit.Text; 
    Filename:= ExpandConstant ('data.bin'); 

    case TNewDiskForm.ModalResult of 
    mrOK: 
    begin 
     if (Path = '') or not FileExists(Path + Filename) then 
     begin 
     CanClose := false 
     MsgBox(FmtMessage(SetupMessage(msgFileNotInDir2), [Filename, Path]), mbError, MB_OK); 
     end; 
    end; 
    mrCancel: 
    begin 
     CanClose := True; 
    end; 
    end; 
end; 

// запрос диска 
procedure SelectDisk(const DiskNumber: Integer; const Filename, Path: String); 
var 
    ExitFlag:Boolean; 
begin 
    repeat 
    TNewDiskForm:= CreateCustomForm(); 
    TNewDiskForm.SetBounds(ScaleX(0), ScaleY(0), ScaleX(377), ScaleY(200)); 
    TNewDiskForm.CenterInsideControl(WizardForm, False); 
    TNewDiskForm.Caption:=SetupMessage(msgChangeDiskTitle); 
    TNewDiskForm.Font.Color:= clWindowText 
    TNewDiskForm.Font.Height:= -11 
    TNewDiskForm.Font.Name:= 'MS Sans Serif' 
    TNewDiskForm.Font.Style:= [] 
    TNewDiskForm.OnCloseQuery:[email protected]; 

    SelectDiskLabel:=TLabel.Create(TNewDiskForm) 
    SelectDiskLabel.SetBounds(ScaleX(72),ScaleY(8), ScaleX(297), ScaleY(72)); 
    SelectDiskLabel.AutoSize:=False 
    SelectDiskLabel.WordWrap:=True 
    SelectDiskLabel.Transparent:=True 
    SelectDiskLabel.Font.Color:=clBlack 
    SelectDiskLabel.Font.Size:=8 
    SelectDiskLabel.Caption:=FmtMessage(SetupMessage(msgSelectDiskLabel2), [IntToStr(DiskNumber)]); 
    SelectDiskLabel.Parent:=TNewDiskForm 
    SelectDiskLabel.ShowAccelChar:= False 

    PathEdit:=TEdit.Create(TNewDiskForm) 
    PathEdit.SetBounds(ScaleX(8), ScaleY(96), ScaleX(281), ScaleY(21)); 
    PathEdit.TabOrder:=2 
    PathEdit.Text := ExpandConstant('{src}\'); 
    PathEdit.Parent := TNewDiskForm; 

    PathLabel:= TLabel.Create(TNewDiskForm); 
    PathLabel.SetBounds(ScaleX(8),ScaleY(80), ScaleX(5), ScaleY(14)); 
    PathLabel.Font.Color:=clBlack 
    PathLabel.FocusControl:= PathEdit 
    PathLabel.Caption := SetupMessage(msgPathLabel); 
    PathLabel.Parent:=TNewDiskForm 

    BrowseButton := TNewButton.Create(TNewDiskForm); 
    BrowseButton.SetBounds(ScaleX(296), ScaleY(95), ScaleX(73), ScaleY(23)); 
    BrowseButton.Parent := TNewDiskForm; 
    BrowseButton.OnClick:[email protected]; 
    BrowseButton.Caption := SetupMessage(msgButtonBrowse); 

    CancelButton := TNewButton.Create(TNewDiskForm); 
    CancelButton.SetBounds(ScaleX(296), ScaleY(137), ScaleX(73), ScaleY(23)); 
    CancelButton.ModalResult := mrCancel; 
    CancelButton.Parent := TNewDiskForm; 
    CancelButton.Caption := SetupMessage (msgButtonCancel); 

    OkButton := TNewButton.Create(TNewDiskForm); 
    OkButton.SetBounds(ScaleX(216), ScaleY(137), ScaleX(73), ScaleY(23)); 
    OkButton.ModalResult := mrOk; 
    OkButton.Parent := TNewDiskForm; 
    OKButton.Caption := SetupMessage(msgButtonOK); 

    TNewDiskForm.ShowModal; 

    //закрытие формы (работает mrCancel) 
    case TNewDiskForm.ModalResult of 
     mrCancel: 
     begin 

     TNewDiskForm.Free; 
     ExitFlag := ExitSetupMsgBox; 

     case ExitFlag of 
      True: WizardForm.Close; 
      False: SelectDisk (DiskNumber,Filename,Path); 
      True: TNewDiskForm.free; 
     end; 
    end; 
    end; 
    until ((TNewDiskForm.ModalResult=mrOk) or (TNewDiskForm.ModalResult = mrCancel)); 
end; 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    // Запуск формы распаковки   № диска   место поиска 
    //          |    | 
if not (FileExists('data.bin')) then 
if CurStep = ssInstall then SelectDisk (2, 'Filename','{src}'); 
end; 

此代碼工作正常(僅當該文件不存在開始,如果我表示它在哪裏,過程在繼續)在舊版本的inno setup(俄語版本)中,但我試圖修改以處理inno setup的最後一個版本(未知標識符「MODALRESULT」)。

1)如何修改代碼以使用最新版本的inno setup?

2)如何同時檢查多個文件? (文件名,文件名等)

+0

你試過了什麼?爲什麼定製表單?基於'TInputDirWizardPage'的自定義頁面將更容易實現。 –

+0

請參閱https://stackoverflow.com/q/12951327/850848 + *「安裝程序不會繼續」* =>我沒有看到,爲什麼它不應該。它有什麼作用? –

+0

[mcve],請! –

回答

1

我已經重構你的代碼,並使其與官方Inno Setup的和您的要求相適應。

有確實沒有TForm.ModalResult。您必須測試,點擊了哪個按鈕以瞭解OnCloseQuery處理程序中的「結果」形式。

var 
    SelectFilePathEdit: TEdit; 
    SelectFileFileName: string; 
    SelectFileDialogCanClose: Boolean; 
    WizardCancelled: Boolean; 

function GetSelectFilePath: string; 
begin 
    Result := AddBackslash(Trim(SelectFilePathEdit.Text)); 
end; 

procedure SelectFileBrowseButtonClick(Sender: TObject); 
var 
    Dir: string; 
begin 
    Dir := GetSelectFilePath; 
    if BrowseForFolder(SetupMessage(msgSelectDirectoryLabel), Dir, False) then 
    begin 
    SelectFilePathEdit.Text := AddBackslash(Dir); 
    end; 
end; 

procedure SelectFileOKButtonClick(Sender: TObject); 
begin 
    if not FileExists(GetSelectFilePath + SelectFileFileName) then 
    begin 
    MsgBox(
     FmtMessage(SetupMessage(msgFileNotInDir2), [SelectFileFileName, GetSelectFilePath]), 
     mbError, MB_OK); 
    end 
    else 
    begin 
    SelectFileDialogCanClose := True; 
    end; 
end; 

procedure SelectFileCancelButtonClick(Sender: TObject); 
begin 
    SelectFileDialogCanClose := ExitSetupMsgBox(); 
    Log(Format('SelectFileCancelButtonClick %d', [SelectFileDialogCanClose])); 
end; 

procedure SelectFileFormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    Log(Format('SelectFileFormCloseQuery %d', [SelectFileDialogCanClose])); 
    CanClose := SelectFileDialogCanClose; 
end; 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); 
begin 
    Confirm := not WizardCancelled; 
end; 

function ValidateFile(FileName: string; DefaultPath: string; var Path: string): Boolean; 
var 
    OKButton: TButton; 
    CancelButton: TButton; 
    SelectFileForm: TSetupForm; 
    SelectFileLabel, PathLabel: TNewStaticText; 
    BrowseButton: TButton; 
begin 
    Path := AddBackslash(DefaultPath) + FileName; 

    if FileExists(Path) then 
    begin 
    Result := True; 
    end 
    else 
    begin 
    SelectFileFileName := FileName; 

    SelectFileForm := CreateCustomForm(); 
    try 
     SelectFileForm.Width := ScaleX(377); 
     SelectFileForm.Position := poScreenCenter; 
     SelectFileForm.Caption := Format('Setup needs %s', [FileName]); 
     SelectFileForm.OnCloseQuery := @SelectFileFormCloseQuery; 

     SelectFileLabel := TNewStaticText.Create(SelectFileForm); 
     SelectFileLabel.Left := ScaleX(8); 
     SelectFileLabel.Top := ScaleY(8); 
     SelectFileLabel.Width := 
     SelectFileForm.ClientWidth - SelectFileLabel.Left - ScaleX(8); 
     SelectFileLabel.AutoSize := False; 
     SelectFileLabel.WordWrap := True; 
     SelectFileLabel.Caption := 
     Format('Select folder with file %s and click OK.', [FileName]); 
     SelectFileLabel.Parent := SelectFileForm; 
     SelectFileLabel.ShowAccelChar := False; 
     WizardForm.AdjustLabelHeight(SelectFileLabel); 

     PathLabel := TNewStaticText.Create(SelectFileForm); 
     PathLabel.Left := ScaleX(8); 
     PathLabel.Top := SelectFileLabel.Top + SelectFileLabel.Height + ScaleX(8); 
     PathLabel.Caption := SetupMessage(msgPathLabel); 
     PathLabel.Parent := SelectFileForm; 

     SelectFilePathEdit := TEdit.Create(SelectFileForm); 
     SelectFilePathEdit.Left := PathLabel.Left; 
     SelectFilePathEdit.Top := PathLabel.Top + PathLabel.Height + ScaleY(4); 
     SelectFilePathEdit.Text := AddBackslash(DefaultPath); 
     SelectFilePathEdit.Parent := SelectFileForm; 

     PathLabel.FocusControl := SelectFilePathEdit; 

     BrowseButton := TNewButton.Create(SelectFileForm); 
     BrowseButton.Width := ScaleX(75); 
     BrowseButton.Left := SelectFileForm.ClientWidth - BrowseButton.Width - ScaleX(8); 
     BrowseButton.Height := ScaleY(23); 
     BrowseButton.Top := 
     SelectFilePathEdit.Top - ((BrowseButton.Height - SelectFilePathEdit.Height) div 2); 
     BrowseButton.Parent := SelectFileForm; 
     BrowseButton.OnClick := @SelectFileBrowseButtonClick; 
     BrowseButton.Caption := SetupMessage(msgButtonBrowse); 

     SelectFilePathEdit.Width := 
     SelectFileForm.ClientWidth - SelectFilePathEdit.Left - 
     (SelectFileForm.ClientWidth - BrowseButton.Left) - ScaleX(8); 

     OkButton := TNewButton.Create(SelectFileForm); 
     OkButton.Width := BrowseButton.Width; 
     OkButton.Left := 
     SelectFileForm.ClientWidth - 2 * OkButton.Width - ScaleX(8) - ScaleX(8); 
     OkButton.Top := SelectFilePathEdit.Top + SelectFilePathEdit.Height + ScaleY(8); 
     OkButton.Height := BrowseButton.Height; 
     OkButton.ModalResult := mrOk; 
     OkButton.Parent := SelectFileForm; 
     OKButton.Caption := SetupMessage(msgButtonOK); 
     OKButton.Default := True; 
     OKButton.OnClick := @SelectFileOKButtonClick; 

     CancelButton := TNewButton.Create(SelectFileForm); 
     CancelButton.Width := OkButton.Width; 
     CancelButton.Left := OkButton.Left + OkButton.Width + ScaleX(8); 
     CancelButton.Top := OkButton.Top; 
     CancelButton.Height := OkButton.Height; 
     CancelButton.ModalResult := mrCancel; 
     CancelButton.Parent := SelectFileForm; 
     CancelButton.Caption := SetupMessage(msgButtonCancel); 
     CancelButton.Cancel := True; 
     CancelButton.OnClick := @SelectFileCancelButtonClick; 

     SelectFileForm.ClientHeight := CancelButton.Top + CancelButton.Height + ScaleY(8); 

     SelectFileDialogCanClose := False; 

     Result := (SelectFileForm.ShowModal() = mrOK); 
     if Result then 
     begin 
     Path := GetSelectFilePath; 
     end 
     else 
     begin 
     WizardCancelled := True; 
     WizardForm.Close; 
     end; 
    finally 
     SelectFileForm.Free; 
    end; 
    end; 
end; 

這樣使用它:

var 
    Data1Path: string; 
    Data2Path: string; 
    Data3Path: string; 

procedure CurStepChanged(CurStep: TSetupStep); 
begin 
    if CurStep = ssInstall then 
    begin 
     { Start looking in installer folder } 
    if ValidateFile('data1.bin', ExpandConstant('{src}'), Data1Path) and 
     { But if user selects a different folder, use that for the following files } 
     ValidateFile('data2.bin', ExtractFilePath(Data1Path), Data2Path) and 
     ValidateFile('data3.bin', ExtractFilePath(Data2Path), Data3Path) then 
    begin 
     { Process file here } 
    end; 
    end; 
end; 

然後使用Data1PathData2PathData3Path,當你需要參考相應的文件。


對於此解決方案中的對話框Z順序問題,請參閱Inno Setup - Opening directory browse dialog from another dialog without hiding it

+0

當引用要提取的文件時,您必須使用'Disk1Path'而不是'{src}'。並刪除所有'FileExists'調用。 'ValidateDisk'爲你做檢查。無論如何,你的測試吃錯了,因爲你沒有指定任何路徑,只有文件名。 –

+0

+我修復了我的代碼。請參閱編輯。 –

+0

使用'Disk1Path'像'ISArcExtract(0,0,AddBackslash(Disk1Path)+ 'data.bin',ExpandConstant( '{}應用程序'),...' –

相關問題