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

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

Shegorat

Lord of Madness
Администратор
Добрый день. Хотелось бы узнать, не найдется ли ни у кого исходников ботвы и iswin7.dll? Хотелось бы исследовать изнутри. Любопытство мучает Буду премного благодарен
Обращайся напрямую к авторам библиотек. Хотя вряд ли они дадут исходники, максимум помогут советами. Кстати VoLT тут редко появляется, а South временно пропал.
 

NUD96

Новичок
не подскажете в чем проблема? при попытке установить wizardimage и wizardsmallimage через ботву, отображается только wizardimage, а small'а нет
procedure WizIm();
var WizardIm, WizardSmallIm: Longint;
begin
ExtractTemporaryFile('big.jpg');
ExtractTemporaryFile('small.png');
WizardForm.WizardBitmapImage.Hide;
WizardForm.WizardSmallBitmapImage.Hide;
WizardIm:=ImgLoad(WizardForm.WelcomePage.Handle,ExpandConstant('{tmp}\big.jpg'),ScaleX(0), ScaleY(0),ScaleX(497),ScaleY(314),True,True);
ImgApplyChanges(WizardForm.WelcomePage.Handle);
WizardSmallIm:=ImgLoad(WizardForm.MainPanel.Handle,ExpandConstant('{tmp}\small.jpg'),ScaleX(0), ScaleY(0),ScaleX(497),ScaleY(58),True,True);
ImgApplyChanges(WizardForm.MainPanel.Handle);
end;

p.s. при инициализации инсталлятора процедуру указал, я новичок, но не до такой степени)
 

LexBell

Борода
Супер модератор
NUD96, строчку
ImgApplyChanges(WizardForm.MainPanel.Handle);
перенеси в CurPageChanged, чтоб на каждой странице обновляло, поскольку эта панель перерисовывается на каждой странице.
 

NUD96

Новичок
Gnom,
Спасибо, но как я только не пробовал, отдельно в CurPageChanged прописывал условие определенной страницы, например так:
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then ImgApplyChanges(WizardForm.MainPanel.Handle);
end;
И возник еще вопрос, при вставке ботвой изображения на страницу очень сильно искажаются чекбоксы и кнопки. Скриншот прилагается
 

aLLeXUs

Участник
Всем привет! Вот решил допилить свой заброшенный скрипт, и встретился с проблемой. У меня все кнопки сделаны через ботву, основные кнопки такие как далее, отмена и назад используют действие стандартных (WizardForm.NextButton.OnClick(WizardForm.NextButton либо WizardForm.NextButton.Click). Что-бы скрыть стандартные кнопки, т.к. они мне больше не нужны я назначил им ширину и высоту 0,0. Но теперь в инсталляторе управляя стрелочками или нажимая tab можно их нажимать. Если полностью скрыть кнопки (WizardForm.NextButton.Hide), то вроде-бы все нормально, но не выполняется действие кнопки Отмена и не нажимается на крестик. Подскажите, каким способом можно устранить эту проблему.
 

Mailchik

Старожил
Проверенный
aLLeXUs, чтобы убрать переключение по tab, пропиши компоненту TabStop := false;
чтобы при WizardForm.CancelButton.Hide; закрывался инсталл, можно на событие прописать Application.Terminate;
 

aLLeXUs

Участник
Mailchik, спасибо за помощь, но у меня не совсем получилось. Но я нашел решение проблемы по проще: при нажатии на кнопку отмены ботвы[SOURCE="inno"]WizardForm.CancelButton.Show;
WizardForm.CancelButton.Click;
WizardForm.CancelButton.Hide;[/SOURCE]
UPDATE:
Нет, все-таки не совсем получилось. Как назначить команду на крестик?
 
Последнее редактирование:

LexBell

Борода
Супер модератор
aLLeXUs, сделай проще. изначально, вместо WizardForm.CancelButton.Hide; сделай WizardForm.CancelButton.Width := 0; и никаких проблем.
 

aLLeXUs

Участник
Gnom, у меня так и есть
[SOURCE="inno"]
WizardForm.NextButton.SetBounds(0,0,0,0);
WizardForm.BackButton.SetBounds(0,0,0,0);
WizardForm.CancelButton.SetBounds(0,0,0,0);[/SOURCE] но
управляя стрелочками или нажимая tab можно их нажимать
У меня почти все получилось, только на крестику нету действия.

Как назначить команду на крестик?
 

Mailchik

Старожил
Проверенный
Как назначить команду на крестик?
Код:
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program

[B][[/B]Code]
#ifdef UNICODE
 #define A "W"
#else
 #define A "A"
#endif
const
  SC_CLOSE = 61536;
var
  OldProc: Longint;

function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
 external 'CallWindowProc{#A}@user32.dll stdcall delayload';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
 external 'SetWindowLong{#A}@user32.dll stdcall delayload';

function FProc(h: hwnd; Msg, wParam, lParam: Longint): Longint;
begin
  if (Msg = $0112) then begin
    if (wParam = SC_CLOSE) then begin {действие при нажатии на крестик}
      MsgBox('вы нажали на крестик', 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 DeinitializeSetup();
begin
  SetWindowLong(WizardForm.Handle, -4, OldProc);
end;
 

aLLeXUs

Участник
[STRIKE]С чем может быть связанно, что не пропускается страница?
Должно быть, что если игра не установлена (проверяется запись в реестре), то пропускается страница wpWelcome. В ShouldSkipPage прописано
[SOURCE="inno"]if not (RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppName}_is1','UninstallString', UninstallPath)) and (PageID = wpWelcome) then Result := true;[/SOURCE]
В отладке видно что строка Result := true; выполняется, но страница не пропускается. Пробовал даже без проверки реестра
[SOURCE="inno"]if PageID = wpWelcome then Result := true;[/SOURCE]
Строка выполняется, но то же самое. Почему? Либо я уже запарился с кодингом за сегодня и не вижу ошибки, которая перед носом, либо здесь что-то необъяснимое=).[/STRIKE]
Проблема была в скрытой кнопке далее.
 
Последнее редактирование:

NUD96

Новичок
возник вопрос, как вызвать процедуру, которая меняет цвет формы ввода папки в меню пуск, при изменении активности чекбокса "не создавать папку в меню пуск"? а то получается задал color, font.style, font.color строки папки в меню пуск, но стоит два раза кликнуть на чекбокс (т.е. по сути вернуться в исходное положение), то font.color сбрасывается на дефолтный.

к примеру если сделать процедуру стиля такой
Код:
procedure tratata();
begin
WizardForm.GroupEdit.Font.Color:=серобуромалиновый;
WizardForm.GroupEdit.Color:=серобуромалиновый с зеленоватым оттенком;
WizardForm.GroupEdit.Font.Style:=очень жирный;
end;
но необходимо сделать так, чтобы при деактивации чекбокса вызывалась опять процедура tratata, единственное на что у меня хватило фантазии: :unknown:
Код:
procedure ololoshka();
begin
"если тыкнули на чекбокс":=@tratata;
end;
собственно, как реализовать "если тыкнули на чекбокс"? заранее спасибо

p.s. и еще небольшой вопрос, как убрать следующий пункт? или изменить содержимое вызываемого окна (добавляется на всех .exe-шниках компилируемых в инно)

 
Последнее редактирование:

sergey3695

Ветеран
Модератор
возник вопрос, как вызвать процедуру, которая меняет цвет формы ввода папки в меню пуск, при изменении активности чекбокса "не создавать папку в меню пуск"? а то получается задал color, font.style, font.color строки папки в меню пуск, но стоит два раза кликнуть на чекбокс (т.е. по сути вернуться в исходное положение), то font.color сбрасывается на дефолтный.

к примеру если сделать процедуру стиля такой
Код:
procedure tratata();
begin
WizardForm.GroupEdit.Font.Color:=серобуромалиновый;
WizardForm.GroupEdit.Color:=серобуромалиновый с зеленоватым оттенком;
WizardForm.GroupEdit.Font.Style:=очень жирный;
end;
но необходимо сделать так, чтобы при деактивации чекбокса вызывалась опять процедура tratata, единственное на что у меня хватило фантазии: :unknown:
Код:
procedure ololoshka();
begin
"если тыкнули на чекбокс":=@tratata;
end;
собственно, как реализовать "если тыкнули на чекбокс"? заранее спасибо
Код:
WizardForm.NoIconsCheck.OnClick:= @tratata;
p.s. и еще небольшой вопрос, как убрать следующий пункт? или изменить содержимое вызываемого окна
Код:
// Убираем меню "О программе"
function AppendMenu(hMenu: HMENU; uFlags, uIDNewItem: UINT; lpNewItem: PansiChar): BOOL; external 'AppendMenuA@user32.dll stdcall'; 
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall'; 
 
const
  MF_DELETE = $200;
    
procedure Menu; 
begin 
if not AppendMenu(GetSystemMenu(Wizardform.Handle, True), MF_DELETE, 0, SetupMessage(msgAboutSetupMenuItem)) then
  WizardForm.Position:= poScreenCenter;
end;
впадлу думать, как-то так... :shot: (че-то голова болит, не к добру это..)
 

NUD96

Новичок
Добрый день форумчанам. Замучал вопрос. Возможно ли сделать стекло на инсталляторе не прибегая к сторонним библиотекам (iswin7)? Заранее спасибо
 

sergey3695

Ветеран
Модератор
Добрый день форумчанам. Замучал вопрос. Возможно ли сделать стекло на инсталляторе не прибегая к сторонним библиотекам (iswin7)? Заранее спасибо
Да, возможно.David.D.Rocco это реализовал на inno, без всяких библеотек. Я б дал ссыль, но у меня нет скрипта.
p.s. нужен скрипт попроси у автора. (если тебе нужно будет вставлять изображение поверх прозрачной области, то все равно придется использовать iswin7logo.dll)
 

NUD96

Новичок
Да, возможно.David.D.Rocco это реализовал на inno, без всяких библеотек. Я б дал ссыль, но у меня нет скрипта.
p.s. нужен скрипт попроси у автора. (если тебе нужно будет вставлять изображение поверх прозрачной области, то все равно придется использовать iswin7logo.dll)
в том то и дело, что изображений на панели у меня не планируется, буду знать)) постараюсь раздобыть скрипт
 

GVS276

Старожил
Проверенный
NUD96, Вот скрипт товарища David.D.Rocco - правда я его под себя переделал очень давно, там есть либа GLogo.dll, она добавляет лого на стекло.
ЗЫ: Архив во вложении.
 

Вложения

Последнее редактирование:

NUD96

Новичок
NUD96, Вот скрипт товарища David.D.Rocco - правда я его под себя переделал очень давно, там есть либа GLogo.dll, она добавляет лого на стекло.
ЗЫ: Архив во вложении.
Большое спасибо за ответ, но, к сожалению, при запуске происходит вот такое вот:
 

David.D.Rocco

Участник
Проверенный
Вот последняя версия win7aero. Кстати лого можно добавить стандартными средствами, с прозрачностью, а также текст нарисовать. Пример внутри есть. Хотя я на это уже давно забил, т.к. microsoft сами отказались от аеро.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху