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

  • Автор темы Автор темы Shegorat
  • Дата начала Дата начала
Статус
В этой теме нельзя размещать новые ответы.
Возможно ли наложить прогресс бар через bmp без ботвы если возможно то как...Зарание спасибо
 
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. Зачем создавать новое сообщение если есть кнопка редактировать (изменить)?
 
Shift85, скачай IsDone и посмотри что там есть проценты. (на форуме есть соответствующая ветка)
Посмотри в справке что да как. Там все просто. Этот пример для переделки для деинсталлятора.
 
Возник еще один вопрос.
В стандартном примере ISDone_Example.iss реализована кнопка "MyCancelButton", которая отменяет установку,
но при нажатии на кнопку закрыть (которая красная в верхнем правом углу инсталлятора) ничего не происходит.
Как сделать, чтобы при нажатии кнопки закрыть выполнялись точно такие же действия, как если бы я нажал на MyCancelButton?

@vint56,
Не совсем то, конечно, ну то есть то - вроде работает как надо, но хотелось бы точно так же, но через кнопку максимизации
(которая между кнопкой свернуть и красной кнопкой закрыть в верхнем правом углу инсталлятора)
 
ATTACUE, там нужно менять MyCancelButton на MyCancelButtonOnClick вроде как я помню(могу не много ошибаться,так как делал это давно)
 
Есть у кого пример создания формы для деинсталлятора. Буду очень благодарен.:bravo:
 
@urban,
Даже если сменить на "CancelButtonClick", предварительно указав строчки из MyCancelButtonClick, то заветная красная кнопка закрытия все равно по прежнему не реагирует. Подозреваю, что нужно делать как-то через хендл окна, причем указать все тоже, что и в MyCancelButtonClick, но как?
 
@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;
 
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]
 
Не совсем то, конечно, ну то есть то - вроде работает как надо, но хотелось бы точно так же, но через кнопку максимизации
(которая между кнопкой свернуть и красной кнопкой закрыть в верхнем правом углу инсталлятора)
Код:
[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;
Только как узнает пользователь что кнопка максимизации во время установки сворачивает и разворачивает установщик, вот это для меня вопрос...
// Кнопки свернуть и закрыть добавил для общего развития :)
 
@sergey3695,
Замечательный пример, но появилась маленькая проблема, которую не ждал:
при двойном щелчке по форме, сама форма разворачивается на весь экран,
а нужно такое же действие, как при (wParam = 61488{SC_MAXIMIZE})
 
Всем привет.
Возник такой вопрос: Как реализовать кнопку "Готово" при деинсталляции.
Чтобы после удаления окно не сразу исчезало, а после нажатия на эту кнопку.
Как у ревенантов
 
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, как-то так
procedure InitializeWizard();
with WizardForm do begin
Width:=ScaleX(559);
Height:=ScaleY(404);
Position:=poScreenCenter;
end;

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

Код:
[Cod e]
procedure InitializeWizard();
begin
WizardForm.Width:= свои значения нужной ширины
WizardForm.Height:= свои значения нужной высоты
end;

Добавлено через 1 час 52 минуты
@sergey3695,
Теперь работает, только есть еще одна маленькая проблема на которую я так же сразу и не обратил внимание:
изображение кнопки
f1896dc72a1c.jpg
не меняется на
a6908931f1e9.jpg
.

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

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