Inno Setup (создание инсталяционных пакетов)

Статус
В этой теме нельзя размещать новые ответы.

Shift85

Старожил
Возможно ли наложить прогресс бар через bmp без ботвы если возможно то как...Зарание спасибо
 

sergey3695

Ветеран
Модератор
Shift85,
1. пример. (with WizardForm.ProgressGauge do -> with UninstallProgressForm.ProgressBar do ; вместо wizardform -> UninstallProgressForm)
координаты сам поставишь
Код:
// примерно
    Left:= ScaleX(10);
    Top:= ScaleY(40);
    Width:= ScaleX(300);
    Height:= ScaleY(13);
2. пример.
3. Зачем создавать новое сообщение если есть кнопка редактировать (изменить)?
 

sergey3695

Ветеран
Модератор
Shift85, скачай IsDone и посмотри что там есть проценты. (на форуме есть соответствующая ветка)
Посмотри в справке что да как. Там все просто. Этот пример для переделки для деинсталлятора.
 

ATTACUE

Новичок
Возник еще один вопрос.
В стандартном примере ISDone_Example.iss реализована кнопка "MyCancelButton", которая отменяет установку,
но при нажатии на кнопку закрыть (которая красная в верхнем правом углу инсталлятора) ничего не происходит.
Как сделать, чтобы при нажатии кнопки закрыть выполнялись точно такие же действия, как если бы я нажал на MyCancelButton?

@vint56,
Не совсем то, конечно, ну то есть то - вроде работает как надо, но хотелось бы точно так же, но через кнопку максимизации
(которая между кнопкой свернуть и красной кнопкой закрыть в верхнем правом углу инсталлятора)
 

urban

Старожил
ATTACUE, там нужно менять MyCancelButton на MyCancelButtonOnClick вроде как я помню(могу не много ошибаться,так как делал это давно)
 

Shift85

Старожил
Есть у кого пример создания формы для деинсталлятора. Буду очень благодарен.:bravo:
 

ATTACUE

Новичок
@urban,
Даже если сменить на "CancelButtonClick", предварительно указав строчки из MyCancelButtonClick, то заветная красная кнопка закрытия все равно по прежнему не реагирует. Подозреваю, что нужно делать как-то через хендл окна, причем указать все тоже, что и в MyCancelButtonClick, но как?
 

altEF_4

Новичок
@urban,
Даже если сменить на "CancelButtonClick", предварительно указав строчки из MyCancelButtonClick, то заветная красная кнопка закрытия все равно по прежнему не реагирует. Подозреваю, что нужно делать как-то через хендл окна, причем указать все тоже, что и в MyCancelButtonClick, но как?
попробуй заменить
Код:
procedure CancelButtonOnClick(Sender: TObject);
begin
  SuspendProc;
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
  ResumeProc;
end;
на
Код:
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then begin
    Confirm := False;
    SuspendProc;
    if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then begin
      ISDoneCancel:=1;
      Cancel:= True;
    end else
      Cancel:= False;
    ResumeProc;
  end;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
  WizardForm.CancelButton.OnClick(nil);
end;
 

nik1967

Old Men
Проверенный
ATTACUE,
[SOURCE="inno"]procedure CancelButtonOnClick(Sender: TObject);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:= 1;
ResumeProc;
end;

procedure MyClose(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= false;
CancelButtonOnClick(Sender);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.OnCloseQuery:= @MyClose;
WizardForm.CancelButton.SetBounds(0,0,0,0); // вместо WizardForm.CancelButton.Hide; -
// иначе будет нерабочей "заветная красная кнопка закрытия"
end;
end;[/SOURCE]
 

sergey3695

Ветеран
Модератор
Не совсем то, конечно, ну то есть то - вроде работает как надо, но хотелось бы точно так же, но через кнопку максимизации
(которая между кнопкой свернуть и красной кнопкой закрыть в верхнем правом углу инсталлятора)
Код:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[ code]
var
  _oldproc: Longint;

function _CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall delayload';
function _SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongW@user32.dll stdcall delayload';
function _GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

const
  GWL_STYLE = -16;
  WS_MAXIMIZEBOX = $10000;

var
  PageResized: Boolean;

function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';

procedure MinimizeInstallPage();
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=GetSystemMetrics(16)-ScaleX(420);
WizardForm.Top:=GetSystemMetrics(17)-ScaleX(150);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(220);
WizardForm.CancelButton.Top:=ScaleY(80);
WizardForm.CancelButton.BringToFront;
PageResized:= True
end;

procedure ResumeInstallPage();
begin
WizardForm.Width:= ScaleX(503);
WizardForm.Height:= ScaleY(388);
WizardForm.Position:= poScreenCenter;
   _SetWindowLong(WizardForm.handle, GWL_STYLE, _GetWindowLong(WizardForm.handle, GWL_STYLE)or(WS_MAXIMIZEBOX));
  _oldproc:=_SetWindowLong(WizardForm.Handle, -4, CallbackAddr('_FProc'));
WizardForm.MainPanel.Visible:=True;
WizardForm.Bevel1.Show;
WizardForm.InnerNotebook.SetBounds(ScaleX(40), ScaleY(72), ScaleX(417), ScaleY(237));
WizardForm.StatusLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(16));
WizardForm.FilenameLabel.SetBounds(ScaleX(0), ScaleY(16), ScaleX(417), ScaleY(16));
WizardForm.ProgressGauge.SetBounds(ScaleX(0), ScaleY(42), ScaleX(417), ScaleY(21));
WizardForm.CancelButton.SetBounds(ScaleX(412), ScaleY(327), ScaleX(75), ScaleY(23));
PageResized:= False;
end;

function _FProc(h: hwnd; Msg, wParam, lParam: Longint): Longint;
begin
  if (Msg = $0112{WM_SYSCOMMAND}) then begin
    if(wParam = 61472{SC_MINIMIZE}) then begin // Свернуть
      MsgBox('SC_MINIMIZE', mbInformation, MB_OK);
      wParam := 0;
     end;
    if(wParam = 61488{SC_MAXIMIZE}) then begin // Развернуть
    If PageResized then
      ResumeInstallPage
    else
      MinimizeInstallPage;
//      MsgBox('SC_MAXIMIZE', mbInformation, MB_OK);
      wParam := 0;
     end;
    if (wParam = 61536{SC_CLOSE}) then begin // Закрыть
        MsgBox('SC_CLOSE', mbInformation, MB_OK);
        wParam := 0;
    end;
  end;
  Result:=_CallWindowProc(_oldproc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  _oldproc:=_SetWindowLong(WizardForm.Handle, -4, CallbackAddr('_FProc'));
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then _SetWindowLong(WizardForm.handle, GWL_STYLE, _GetWindowLong(WizardForm.handle, GWL_STYLE)or(WS_MAXIMIZEBOX))
else _SetWindowLong(WizardForm.handle, GWL_STYLE, _GetWindowLong(WizardForm.handle, GWL_STYLE)and not(WS_MAXIMIZEBOX));
end;

procedure DeinitializeSetup();
begin
  _SetWindowLong(WizardForm.Handle, -4, _oldproc);
end;
Только как узнает пользователь что кнопка максимизации во время установки сворачивает и разворачивает установщик, вот это для меня вопрос...
// Кнопки свернуть и закрыть добавил для общего развития :)
 

ATTACUE

Новичок
@sergey3695,
Замечательный пример, но появилась маленькая проблема, которую не ждал:
при двойном щелчке по форме, сама форма разворачивается на весь экран,
а нужно такое же действие, как при (wParam = 61488{SC_MAXIMIZE})
 

Carlos

Участник
Модератор
Всем привет.
Возник такой вопрос: Как реализовать кнопку "Готово" при деинсталляции.
Чтобы после удаления окно не сразу исчезало, а после нажатия на эту кнопку.
Как у ревенантов
 

sergey3695

Ветеран
Модератор
ATTACUE, забыл про это.
Код:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[ code]
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
var
  _oldproc: Longint;

function _CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall delayload';
function _SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongW@user32.dll stdcall delayload';
function _GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

const
  GWL_STYLE = -16;
  WM_SYSCOMMAND = $0112;
  SC_MAXIMIZE = 61488;
  WS_MAXIMIZEBOX = $10000;
  WM_NCLBUTTONDBLCLK = $00A3;
var
  PageResized: Boolean;

function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';

procedure MinimizeInstallPage();
begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=GetSystemMetrics(16)-ScaleX(420);
WizardForm.Top:=GetSystemMetrics(17)-ScaleX(150);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(220);
WizardForm.CancelButton.Top:=ScaleY(80);
WizardForm.CancelButton.BringToFront;
PageResized:= True
end;

procedure ResumeInstallPage();
begin
WizardForm.Width:= ScaleX(503);
WizardForm.Height:= ScaleY(388);
WizardForm.Position:= poScreenCenter;
   _SetWindowLong(WizardForm.handle, GWL_STYLE, _GetWindowLong(WizardForm.handle, GWL_STYLE)or(WS_MAXIMIZEBOX));
  _oldproc:=_SetWindowLong(WizardForm.Handle, -4, CallbackAddr('_FProc'));
WizardForm.MainPanel.Visible:=True;
WizardForm.Bevel1.Show;
WizardForm.InnerNotebook.SetBounds(ScaleX(40), ScaleY(72), ScaleX(417), ScaleY(237));
WizardForm.StatusLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(417), ScaleY(16));
WizardForm.FilenameLabel.SetBounds(ScaleX(0), ScaleY(16), ScaleX(417), ScaleY(16));
WizardForm.ProgressGauge.SetBounds(ScaleX(0), ScaleY(42), ScaleX(417), ScaleY(21));
WizardForm.CancelButton.SetBounds(ScaleX(412), ScaleY(327), ScaleX(75), ScaleY(23));
PageResized:= False;
end;

function _FProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  case Msg of WM_SYSCOMMAND:
  case wParam of SC_MAXIMIZE:
begin
If PageResized then
  ResumeInstallPage
else
  MinimizeInstallPage;
  wParam := 0;
end;
end;
end;
  case Msg of WM_NCLBUTTONDBLCLK:
begin
  Msg := 0;
end;
end;
  Result := _CallWindowProc(_oldproc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  _oldproc:=_SetWindowLong(WizardForm.Handle, -4, CallbackAddr('_FProc'));
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then _SetWindowLong(WizardForm.handle, GWL_STYLE, _GetWindowLong(WizardForm.handle, GWL_STYLE)or(WS_MAXIMIZEBOX))
else _SetWindowLong(WizardForm.handle, GWL_STYLE, _GetWindowLong(WizardForm.handle, GWL_STYLE)and not(WS_MAXIMIZEBOX));
end;

procedure DeinitializeSetup();
begin
  _SetWindowLong(WizardForm.Handle, -4, _oldproc);
end;
Carlos, смысл в кнопке какой? (и да я не знаю как там у ревенантов....хоть бы скрин какой-нибудь. у них же не один скрипт. да и я не пользуюсь их ними репаками, мне проще лицуху качнуть, повырезать все и налепить таблетку. благо скорость хорошая)
 
Последнее редактирование:

andrey_167

Новичок
Здравствуйте может кто нибуть знает код на изменение формы инстала тоесть растянуть его
 

urban

Старожил
andrey_167, как-то так
procedure InitializeWizard();
with WizardForm do begin
Width:=ScaleX(559);
Height:=ScaleY(404);
Position:=poScreenCenter;
end;

но придется все переделывать
 

ATTACUE

Новичок
Здравствуйте может кто нибуть знает код на изменение формы инстала тоесть растянуть его
Код:
[Cod e]
procedure InitializeWizard();
begin
WizardForm.Width:= свои значения нужной ширины
WizardForm.Height:= свои значения нужной высоты
end;
Добавлено через 1 час 52 минуты
@sergey3695,
Теперь работает, только есть еще одна маленькая проблема на которую я так же сразу и не обратил внимание:
изображение кнопки
не меняется на
.

То есть хотелось:
на MinimizeInstallPage -
,
а на ResumeInstallPage -
.

Понимаю, что надоел, а так же понимаю, что и без этого прожить можно, но все же)
 

sergey3695

Ветеран
Модератор
ATTACUE, а ты думаешь к чему я написал как пользователь узнает что делает кнопка?
Эта кнопка появляется только когда форма развернута на весь экран. Так что я незнаю. Могу еще убрать Hint'ы у кнопок в заголовке и все. А вот как заменить эти всплывающие подсказки я не знаю.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху