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

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

andrey_167

Новичок
еше один вопрос как зделать прибить данный код к отельной кнопке

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;

точнее нужно чтобы вместо поместить на отдельную кнопку который также будет работать на странице установки
 
Последнее редактирование:

sergey3695

Ветеран
Модератор
andrey_167,
точнее нужно чтобы вместо поместить на отдельную кнопку который также будет работать на странице установки
< это промт на русский перевел или такое предложение?
если честно не понятно...
 

andrey_167

Новичок
andrey_167,
точнее нужно чтобы вместо поместить на отдельную кнопку который также будет работать на странице установки
< это промт на русский перевел или такое предложение?
если честно не понятно...
одним словом нужно создать кнопку минимизации установки
 

Shift85

Старожил
andrey_167, Так

Код:
var
ResizeButton: TButton;
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.InnerNote book.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNo tebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNo tebook.Width;
WizardForm.CancelButton.Left:=ScaleX(220);
WizardForm.CancelButton.Top:=ScaleY(80);
WizardForm.CancelButton.BringToFront;
ResizeButton.Left:= ScaleX(60);
ResizeButton.Top:= ScaleY(80)
ResizeButton.Caption:= 'Normalize';
PageResized:= True
end;

procedure ResumeInstallPage();
begin
WizardForm.Width:= ScaleX(503);
WizardForm.Height:= ScaleY(388);
WizardForm.Position:= poScreenCenter;
WizardForm.MainPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(497), ScaleY(58));
WizardForm.MainPanel.Show;
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));
ResizeButton.SetBounds(ScaleX(20), ScaleY(327),ScaleX(75), ScaleY(23));
ResizeButton.Caption:= 'Minimize';
PageResized:= False;
end;

procedure ResizeButtonOnClick(Sender: TObject);
begin
If PageResized then
ResumeInstallPage
else
MinimizeInstallPage;
end;

procedure InitializeWizard();
begin
ResizeButton:= TButton.Create(WizardForm);
ResizeButton.SetBounds(ScaleX(20), ScaleY(327),ScaleX(75), ScaleY(23));
ResizeButton.OnClick:= @ResizeButtonOnClick
ResizeButton.Caption:= 'Minimize';
ResizeButton.Hide;
ResizeButton.Parent:= WizardForm;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInstalling then ResizeButton.Show;
end;[/SPOILER]
 

Silentman

Новичок
Всем доброго времени суток! Может кто-нибудь подсказать, как сделать такой инсталлятор: http://radikall.com/images/2014/01/21/5mIY.jpg. Интересует, как сделать "нестандартную" форму с "выемками".
 
Последнее редактирование:

LexBell

Борода
Супер модератор
Shift85, с тем, что скорей всего это делается внутри блока with WizardForm do, там уже есть свой WelkomeLabel1, и его нельзя создавать заново, даже другого типа, это имя скажем так, забронировано инсталлом за собой. сделай другое название.
 

ATTACUE

Новичок
Приветствую)
Столкнулся с такой проблемой:
На LanguageDialog при выборе языка нужно активировать одну из следующих опций:
Код:
procedure InstallButtonClick(Sender: TObject);
begin

  case SelectLanguageForm.LangCombo.ItemIndex of

  0:
    begin
      Exec(EC('{src}\setup.exe'), '/LANG=eng', '', SW_SHOW, ewNoWait, ResultCode);
      MyAppForm.Close;
      PostMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
    end;

  1:
    begin
      Exec(EC('{src}\setup.exe'), '/LANG=rus', '', SW_SHOW, ewNoWait, ResultCode);
      MyAppForm.Close;
      PostMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
    end;
  end;
end;
При использовании GetUILanguage результат не совсем тот, который я хотел, но нужно что-то наподобие.

Добавлено через 7 минут
С чем связана данная ошибка подскажите пожалуйста
@Shift85,
Мне кажется, что WelcomeLabel1 уже существует, поэтому заново его создавать не имеет смысла,
попробуй полностью убрать 1 строчку (где Create).
Если возникнет ошибка в строчке с with, тогда выглядеть будет так: with WizardForm.WelcomeLabel1, а все что ниже - оставь как есть)
 
Последнее редактирование:

Shift85

Старожил
Как в исдоне отменить распаковку архивов стандартной кнопкой отмены. Чтобы на ssInstall и ssPostInstall отрубаласъ распаковка. Покажите пример зарание спасибо.
 

urban

Старожил
Shift85, удали MyCancelButton.Hide; и
MyCancelButton:=TButton.Create(WizardForm);
with MyCancelButton do begin
Parent:=WizardForm;
Width:=ScaleX(135);
Caption:=ExpandConstant('{cm:CancelButton}');
Left:=ScaleX(360);
Top:=WizardForm.cancelbutton.top;
OnClick:=@CancelButtonOnClick;
end;
затем в procedure CurStepChanged(CurStep: TSetupStep);
замени WizardForm.CancelButton.Hide; на
WizardForm.CancelButton.OnClick:=@CancelButtonOnClick;
 

Shift85

Старожил
urban, Так и сделал дело в том что она после ssPostInstall становится неактивной тоесть отменить распаковку невозможно...:(
 
Последнее редактирование:

urban

Старожил
Shift85, добавь туда же
if CurStep = sspostInstall then begin
WizardForm.CancelButton.OnClick:=@CancelButtonOnClick;
и не забудь в конце кода исдона end; добавить,я только что попробовал вроде пашет
 

Shift85

Старожил
urban, Неа неработает. Вроде где то есть решение никак немогу найти...
 

vint56

Ветеран
Проверенный
Shift85 CancelButton будет отменять установку
procedure HideControls;
begin
// MyCancelButton.Hide;

procedure CreateControls;
// MyCancelButton:=TButton.Create(WizardForm);
// with MyCancelButton do begin
// Parent:=WizardForm;
// Width:=ScaleX(135);
// Caption:=ExpandConstant('{cm:CancelButton}');
// Left:=ScaleX(360);
// Top:=WizardForm.cancelbutton.top;
// OnClick:=@CancelButtonOnClick;
// end;

procedure CurStepChanged(CurStep: TSetupStep);
if CurStep = ssPostInstallthen begin //Если необходимо, можно поменять на ssPostInstall
WizardForm.CancelButton.OnClick:=@CancelButtonOnClick;
// WizardForm.CancelButton.Hide;
WizardForm.CancelButton.Enabled:= True; // если ssPostInstall потому как кнопка не активна

при копирований CancelButtonOnCl ick; должно быть слитно
 
Последнее редактирование:

LexBell

Борода
Супер модератор
vint56, тогда уж лучше использовать стандартную функцию CancelButtonClick, там очень удобно - для определенной страницы можно задать сокрытие окна запроса отмены и замену действия на отмену на свое. как-то так:
[SOURCE="iss"]procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
SuspendProc; // ставим распаковку, или чего там сейчас IsDone делает, на паузу
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then
ISDoneCancel:=1; // настоящая отмена происходит тут
Confirm := False; // убираем запрос подтверждения выхода
Cancel := False; // да и саму отмену тоже запрещаем, что-бы библиотека IsDone могла корректно отработать
ResumeProc; // продолжаем работу IsDone с учетом изменивхшихся или не изменившихся условий
end;
end;[/SOURCE]

Кстати, вместо
Код:
MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES
вполне можно вызвать встроенный меседж выхода, текст которого так-же будет зависеть от выбранного языка инсталлятора.
Код:
function ExitSetupMsgBox: Boolean;
 
Последнее редактирование:

Mailchik

Старожил
Проверенный

Shift85

Старожил
Как в этом коде задать ширину и толщину прогресс бара. Зарание спасибо...

Код:
procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
    CurrWidth : single;
begin
    
    with WizardForm.ProgressGauge do
    begin
        CurrWidth := ( Position * Width ) / Max;            
        if intOldCurrWidth <> Round( CurrWidth ) then      
        begin
            intOldCurrWidth := Round( CurrWidth );
            
            ProgressBar_BitmapImage.SetBounds( 0, 0, intOldCurrWidth, ProgressBar_ImageHeight );
            ProgressBar_BitmapImage.Show();                     
        end;
    end;
end;
 

vint56

Ветеран
Проверенный
LexBell
procedure CancelButtonOnClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID = wpInstalling then
begin
Cancel:=False;
Confirm:=False;
SuspendProc;
if ExitSetupMsgBox then ISDoneCancel:=1;
ResumeProc;
end;
end;

// MyCancelButton:=TButton.Create(WizardForm);
// with MyCancelButton do begin
// Parent:=WizardForm;
// Width:=ScaleX(135);
// Caption:=ExpandConstant('{cm:CancelButton}');
// Left:=ScaleX(360);
// Top:=WizardForm.cancelbutton.top;
// OnClick:=@CancelButtonOnClick;
// end;

if CurStep = ssPostInstall then begin
WizardForm.CancelButton.OnClick:=@CancelButtonOnClick;

Выходит ошибка
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху