2013-11-20 6 views

Antwort

18

Es war nicht so einfach, diese Funktion zu implementieren, bevor die CurInstallProgressChanged Ereignismethode in Inno Setup 5.5.4 eingeführt wurde. Aber jetzt, mit diesem Ereignis, können Sie ein Skript wie folgt schreiben:

Besonderer Dank an user1662035 für die vorgeschlagene Idee für die Behebung von Etiketten beim Rollback-Prozess zu verbergen.

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

[Files] 
Source: "MyProg.exe"; DestDir: "{app}" 
Source: "MyProg.chm"; DestDir: "{app}" 
Source: "Readme.txt"; DestDir: "{app}" 

[Code] 
function GetTickCount: DWORD; 
    external '[email protected] stdcall'; 

var 
    StartTick: DWORD; 
    PercentLabel: TNewStaticText; 
    ElapsedLabel: TNewStaticText; 
    RemainingLabel: TNewStaticText; 

function TicksToStr(Value: DWORD): string; 
var 
    I: DWORD; 
    Hours, Minutes, Seconds: Integer; 
begin 
    I := Value div 1000; 
    Seconds := I mod 60; 
    I := I div 60; 
    Minutes := I mod 60; 
    I := I div 60; 
    Hours := I mod 24; 
    Result := Format('%.2d:%.2d:%.2d', [Hours, Minutes, Seconds]); 
end; 

procedure InitializeWizard; 
begin 
    PercentLabel := TNewStaticText.Create(WizardForm); 
    PercentLabel.Parent := WizardForm.ProgressGauge.Parent; 
    PercentLabel.Left := 0; 
    PercentLabel.Top := WizardForm.ProgressGauge.Top + 
    WizardForm.ProgressGauge.Height + 12; 

    ElapsedLabel := TNewStaticText.Create(WizardForm); 
    ElapsedLabel.Parent := WizardForm.ProgressGauge.Parent; 
    ElapsedLabel.Left := 0; 
    ElapsedLabel.Top := PercentLabel.Top + PercentLabel.Height + 4; 

    RemainingLabel := TNewStaticText.Create(WizardForm); 
    RemainingLabel.Parent := WizardForm.ProgressGauge.Parent; 
    RemainingLabel.Left := 0; 
    RemainingLabel.Top := ElapsedLabel.Top + ElapsedLabel.Height + 4; 
end; 

procedure CurPageChanged(CurPageID: Integer); 
begin 
    if CurPageID = wpInstalling then 
    StartTick := GetTickCount; 
end; 

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean); 
begin 
    if CurPageID = wpInstalling then 
    begin 
    Cancel := False; 
    if ExitSetupMsgBox then 
    begin 
     Cancel := True; 
     Confirm := False; 
     PercentLabel.Visible := False; 
     ElapsedLabel.Visible := False; 
     RemainingLabel.Visible := False; 
    end; 
    end; 
end; 

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer); 
var 
    CurTick: DWORD; 
begin 
    CurTick := GetTickCount; 
    PercentLabel.Caption := 
    Format('Done: %.2f %%', [(CurProgress * 100.0)/MaxProgress]); 
    ElapsedLabel.Caption := 
    Format('Elapsed: %s', [TicksToStr(CurTick - StartTick)]); 
    if CurProgress > 0 then 
    begin 
    RemainingLabel.Caption := 
     Format('Remaining: %s', [TicksToStr(
     ((CurTick - StartTick)/CurProgress) * (MaxProgress - CurProgress))]); 
    end; 
end; 
+1

Tolle Arbeit, TLama, danke! Ich denke, die einzige Lösung, um die Etiketten zu verbergen, wäre ein benutzerdefiniertes Nachrichtenfeld und die Stornierung manuell aufzurufen. Vielleicht macht das den Trick: [link] (http://pastebin.com/SJwjVGvs) Aber ich habe es nicht getestet. – user1662035

+0

@ user1662035, ja, das war der unmittelbare Gedanke, den ich hatte. Aber ich werde versuchen, noch etwas genauer zu betrachten. Wie auch immer, du kannst die fertige ['ExitSetupMsgBox'] (http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_exitsetupmsgbox) Funktion verwenden, um den Exit-Bestätigungsdialog anzuzeigen. Ist diese Nachricht jedoch nicht anders als "* Möchten Sie das Setup beenden? *". Ich habe Inno Setup zu diesem Zeitpunkt noch nicht manuell überprüft ... – TLama

+0

Ich habe diese Funktion total vergessen ... Ich habe beide Versionen getestet und beide zeigen den üblichen Exit-Dialog. Darf ich fragen, was Sie mit "genauer" meinen? – user1662035

Verwandte Themen