Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Ветеран


Сообщения: 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

[Code]
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