Dodakaedr
08-04-2014, 19:21
Как в примере из шапки в "Отображение процентов при (де)инсталляции" сделать показ процентов при инсталляции? Проверял при инсталляции не отображается
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external
[code ]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
WM_USER = $0400;
PBM_SETPOS = WM_USER+2;
GWL_WNDPROC = -4;
type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
var
OldProgressBarProc: Longint;
function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;
procedure InitializeWizard();
begin
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;
procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;
/////////////////////////////// Uninstall //////////////////////////////////
function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with UninstallProgressForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (ProgressBar.Position*100)/ProgressBar.Max)]) );
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;
procedure UninstallFormOnHide(Sender: TObject);
begin
SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
end;
procedure InitializeUninstallProgressForm();
begin
OldProgressBarProc := SetWindowLong(UninstallProgressForm.ProgressBar.Handle, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
UninstallProgressForm.OnHide := @UninstallFormOnHide;
end;
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external
[code ]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
const
WM_USER = $0400;
PBM_SETPOS = WM_USER+2;
GWL_WNDPROC = -4;
type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
var
OldProgressBarProc: Longint;
function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;
procedure InitializeWizard();
begin
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;
procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;
/////////////////////////////// Uninstall //////////////////////////////////
function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with UninstallProgressForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (ProgressBar.Position*100)/ProgressBar.Max)]) );
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;
procedure UninstallFormOnHide(Sender: TObject);
begin
SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
end;
procedure InitializeUninstallProgressForm();
begin
OldProgressBarProc := SetWindowLong(UninstallProgressForm.ProgressBar.Handle, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
UninstallProgressForm.OnHide := @UninstallFormOnHide;
end;