Ветеран
Сообщения: 1133
Благодарности: 581
Профиль
|
Отправить PM
| Цитировать
Цитата Dodakaedr :
Как добавить чекбокс в деинсталятор »
Пример для расширенной версии
Код:
[Setup]
AppName =My Program
AppVerName =My Program v 1.5
DefaultDirName ={pf} \My Program
OutputDir =.
Compression =lzma2/ultra
InternalCompressLevel =ultra
SolidCompression =yes
[Languages]
Name : ru; MessagesFile : compiler:Languages \Russian.isl
[CustomMessages]
ru.CheckBoxDel=Удалить все настройки
[Dirs]
Name : {userappdata} \MyTestDir
[UninstallDelete]
Name : {userappdata} \MyTestDir; Type : filesandordirs ; Check : DelUserSettings
[C ode]
procedure Delay(Milliseconds: Integer); forward ;
var
NextClick: Boolean;
DelOptions: Boolean;
function DelUserSettings: Boolean;
begin
Result := DelOptions;
end ;
procedure NextBtnClick(Sender: TObject);
begin
NextClick := True;
end ;
procedure chkDelClick(Sender: TObject);
begin
DelOptions := TCheckBox(Sender).Checked;
end ;
procedure CurUninstallStepChanged (CurUninstallStep: TUninstallStep);
var
msg: string ;
NextBtn: TButton;
chkDel: TCheckBox;
begin
if CurUninstallStep = usUninstall then
try
with UninstallProgressForm do
begin
ProgressBar.Hide;
msg := StatusLabel.Caption;
end ;
NextClick := False;
NextBtn := TButton.Create(UninstallProgressForm);
with NextBtn do
begin
Parent := UninstallProgressForm;
SetBounds(UninstallProgressForm.CancelButton.Left, UninstallProgressForm.CancelButton.Top,
UninstallProgressForm.CancelButton.Width, UninstallProgressForm.CancelButton.Height);
Caption := SetupMessage(msgButtonNext);
OnClick := @NextBtnClick;
end ;
chkDel := TCheckBox.Create(UninstallProgressForm);
with chkDel do
begin
Parent := UninstallProgressForm.InstallingPage;
SetBounds(UninstallProgressForm.StatusLabel.Left + ScaleX(20), UninstallProgressForm.StatusLabel.Top + ScaleY(50), ScaleX(250), ScaleY(14));
Caption := CustomMessage('CheckBoxDel');
Checked := False;
OnClick := @chkDelClick;
end ;
while not NextClick do
Delay(500);
finally
chkDel.Hide;
NextBtn.Free;
with UninstallProgressForm do
begin
ProgressBar.Show;
StatusLabel.Caption := msg;
end ;
end ;
end ;
const
PM_REMOVE = 1;
QS_ALLINPUT = $000000FF;
WAIT_TIMEOUT = $00000102;
function PeekMessage(var lpMsg: TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
function MsgWaitForMultipleObjects(nCount: DWORD; var pHandles: THandle; fWaitAll: BOOL; dwMilliseconds, dwWakeMask: DWORD): DWORD;
external 'MsgWaitForMultipleObjects@user32.dll stdcall';
function CreateEvent(lpEventAttributes: Longint; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; external 'CreateEventA@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
procedure Application_ProcessMessages;
var
Msg: TMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end ;
end ;
procedure Delay(Milliseconds: Integer);
var
dwTick: DWORD;
hEvent: THandle;
begin
hEvent := CreateEvent(0, False, False, '');
try
dwTick := GetTickCount + DWORD(Milliseconds);
while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, hEvent, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application_ProcessMessages;
Milliseconds := dwTick - GetTickCount;
end ;
finally
CloseHandle(hEvent);
end ;
end ;
-------
Книги нужны, чтобы напоминать человеку, что его оригинальные мысли не так уж новы... Авраам Линкольн.
Это сообщение посчитали полезным следующие участники:
Отправлено : 19:51, 29-03-2014
| #145