2017-01-10 4 views
2

Я использую этот код, чтобы показать истекшее время, время процентов и оценивается прогресс времени:Inno Setup - Индикатор выполнения установки не достигнет 100%

[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; 

Этот код показать это с моим кодом:

enter image description here

Как обновить индикатор выполнения, чтобы соответствовать 100% с завершением индикатора выполнения?

Мне нужно добавить дополнительную информацию? (Извините за мой плохой английский)

+0

Ваш код не отображается, когда вы обновляете прогрессбар вообще. Он показывает, как вы обновляете метки под ним (на самом деле это не так, поскольку значения, которые вы присваиваете ярлыкам, вообще не совпадают с вашим изображением), но не сам прогресс. Где этот код? –

ответ

2

Не так много, вы можете сделать это.

В современных версиях Windows с темами Aero индикатор выполнения имеет эффект «анимации». Когда вы изменяете позицию позиции выполнения, она не переходит прямо в позицию, а вместо этого оживляет прыжок. Чтобы анимация работала, очередь сообщений Windows должна быть перекачана.

Во время последних шагов установки (после копирования файлов) Inno Setup ненадолго останавливается и не откачивает очередь. Таким образом, пока индикатор выполнения фактически установлен на 100% позицию, а CurInstallProgressChanged вызывается с CurProgress, равным MaxProgress, визуально индикатор выполнения еще не на 100%, поскольку анимация находится на рассмотрении. А анимация на самом деле никогда не завершается, потому что индикатор выполнения скрыт до того, как анимация будет завершена.


Если отключить визуальные темы в Windows, то, что возвращается индикатор прогресса в режиме унаследованной анимации не менее, вы увидите, что эта проблема уходит.

Следующие скриншоты оба из одной и той же установки Windows 7.

Windows Classic тема:

Progress bar on Windows Classic theme

Windows 7 Aero тема:

Progress bar on Windows 7 Aero Theme


Все, что вы, вероятно, можете сделать, это использовать хак показано здесь:
Disabling .NET progressbar animation when changing value?

procedure CurInstallProgressChanged(CurProgress, MaxProgress: Integer); 
begin 
    WizardForm.ProgressGauge.Position := WizardForm.ProgressGauge.Position - 1; 
    WizardForm.ProgressGauge.Update; 
    { ... } 
end; 

Хотя вы потеряете эффект анимации.

И вы, очевидно, до сих пор не может достичь 100%, но вы можете получить очень близко к нему:

Progress bar on Windows 7 Aero Theme with no animation

+0

Спасибо большое Мартину! –

+0

Привет! можно изменить размер индикатора выполнения до 100% (уменьшить размер индикатора выполнения)? –

+0

Вы хотите скрыть последнюю часть, которая не заполняется? Изменение размера не помогает.Вместо этого вы можете закрыть конец индикатора выполнения, но вы потеряете границу. Так что это будет не очень хорошо. Если вы не используете тему с границей линии simle, которую вы можете реплицировать, например. используя панель. –

Смежные вопросы