Цитата
Похоже, неправильно дал пояснение... Имеется в виду, что функция, которая должна выполнятся через CheckBox, должна выполняться непосредственно при установке - не сразу, на подобии выбора компонентов. Такое можно проделать?
Вот код:
var
b_cb:boolean;
function InitializeSetup(): Boolean;
begin
b_cb:=False;
Result:=True;
end;
procedure cdClick(Sender: TObject);
begin
b_cb:=cb.CHECKED;
end;
procedure CurPageChanged(CurPageID: Integer);
var
i:Integer;
begin
If CurPageID=wpSelectDir then
begin
If cb=nil then
begin
cb:=TCheckBox.Create(WizardForm);
cb.Parent:=WizardForm;
cb.Left:=WizardForm.SELECTDIRLABEL.Left;
cb.Top:=ScaleY(180);
cb.CAPTION:='MyCheckBox';
cb.ONCLICK:=@cdClick;
end;
end
else
begin
If cb<>nil then
begin
cb.Free;
cb:=nil;
end;
end;
If CurPageID=wpInstalling then
begin
If b_cb then
MsgBox('cb.CHECKED', mbInformation, MB_OK)
else
MsgBox('not cb.CHECKED', mbInformation, MB_OK)
end;
end;
Цитата
Из FAQ для Inno Setup:
Вопрос: Что именно происходит, если пользователь нажмет Cancel в процессе установки?
Ответ: При нажатии Cancel инсталятор отменяет изменения, сделанные им в ходе установки, почти как деинсталятор при удалении программы. Поэтому частично установленное приложение не останется в системе пользователя.
В этом-то мой вопрос и состоит, как избежать того, о чём говорится в ответе FAQ...
Пришлите код скрипта, у меня почему то при переустановке ничего не удаляется.
Цитата
Может, следующий вопрос из-за моей невнимательности, но тем не менее.
Ярлыки, создаваемые в меню "Пуск" зачастую (особенно если их много) могут быть расформированы как угодно. Вопрос: можно ли конкретно задать размещение ярлыков в панели "Пуск" в определенном порядке?
Создавайте свою группу, в которую помещайте устанавливаемые программы.
Цитата
очень захотелось "убить" MessageBox, предупреждающий об удалении файлов перед деинсталляцией, а именно "Are you sure you want to completely remove %1 and all of its components?"... Как сделать так, чтобы подтвержения на удаление не требовалось (соответственно и окно требования подтвержения не появлялось)?
Не получится, можно только текст изменить.
Guest_Юрий_*
19:07:2005, 05:01
To Zubr:
[Setup]
AppName=My Program
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.mycompany.com
AppSupportURL=http://www.mycompany.com
AppUpdatesURL=http://www.mycompany.com
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
[Types]
Name: custom; Description: Custom installation; Flags: iscustom
[Components]
Name: group; Description: Header; Types: custom; Flags: disablenouninstallwarning
Name: group\file1; Description: Sub-Header 1; Types: custom; Flags: disablenouninstallwarning;
Name: group\file2; Description: Sub-Header 2; Types: custom; Flags: disablenouninstallwarning;
Name: group\file3; Description: Sub-Header 3; Types: custom; Flags: disablenouninstallwarning;
Name: group\file4; Description: Sub-Header 4; Types: custom; Flags: disablenouninstallwarning;
[Files]
Source: C:\Works\CreateInstall\a.exe; Components: group\file1; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
Source: C:\Works\CreateInstall\b.exe; Components: group\file2; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
Source: C:\Works\CreateInstall\c.exe; Components: group\file3; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
Source: C:\Works\CreateInstall\d.exe; Components: group\file4; DestDir: {app}; Attribs: readonly; Flags: onlyifdoesntexist uninsremovereadonly
[InstallDelete]
Name: {app}\a.exe; Type: files; Components:
Name: {app}\b.exe; Type: files; Components:
Name: {app}\c.exe; Type: files; Components:
Name: {app}\d.exe; Type: files; Components:
примерно такой вот упрощённый код даёт удаление заранее установленных компонентов...
Последовательность:
1. Установить какой-то один компонент
2. Закончить работу с инсталлятором
3. Запустить инсталлятор вновь
4. Выбрать какой-то ещё не установленный компонент и начать процесс его установки
5. До того момента, как этот компонент установился, нажать Отмена
6. Пойдёт откат
7. Смотрим в папку с установленной программой, компонентов нет (ни заранее установленных, ни того, процесс установки которого прервали)
zubrЦитата
Создавайте свою группу, в которую помещайте устанавливаемые программы.
В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой

, например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.
Guest_Юрий_*
19:07:2005, 06:18
To Kindly:Цитата
В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.
по-моему, размещение ярлыков определяется сортировкой, заданной Вами же для меню Пуск...
Guest_Юрий_*
19:07:2005, 13:41
Код был представлен с ошибкой... Конечно же в секции [InstallDelete]
должны быть следующие продолжения строк:
Components: group\file1;
Components: group\file2;
Components: group\file3;
Components: group\file4;
В данном случае, это не суть важно, т.к. проблема с удалением предустановленных файлов всё равно есть...
zubr CheckBox
Спасибо! Все просто замечательно! Немного доработки - и у меня оказалось то, чего я давно хотел. Но вопросы "по-мелочи" у меня все же есть:
1. Можно ли как-нибудь отключить страницу Приветствия?
2. Существует ли вообще в Inno Setup функции отключения видимости или задействования кнопок (например, как на странице принятия лицензионного соглащения)?
Guest_Юрий_*
20:07:2005, 07:26
To Kindly:Цитата
1. Можно ли как-нибудь отключить страницу Приветствия?
2. Существует ли вообще в Inno Setup функции отключения видимости или задействования кнопок (например, как на странице принятия лицензионного соглащения)?
1. страница приветствия отключается при помощи
[Setup]
DisableStartupPrompt=yes
2. на примере для кнопки "Назад" Мастера можно задисэйблить при помощи следующего кода в секции
:
[CODE]procedure InitializeWizard();
begin
WizardForm.BackButton.Enabled := False;
end;
для кнопки "Далее" надо устанавливать конкретные страницы Мастера, где произойдёт изменение её состояния (т.к. принимая Лицензионное соглашение кнопа автоматом становится доступной)...
Guest_Юрий_*,
Цитата
[Setup]
DisableStartupPrompt=yes
отключает только сообщение при инициализации, а не страницу приветствия.
Насчет кнопок, спасибо за намек

- надо потренироваться.
Guest_Юрий_*Цитата
Из FAQ для Inno Setup:
Вопрос: Что именно происходит, если пользователь нажмет Cancel в процессе установки?
Ответ: При нажатии Cancel инсталятор отменяет изменения, сделанные им в ходе установки, почти как деинсталятор при удалении программы. Поэтому частично установленное приложение не останется в системе пользователя.
В этом-то мой вопрос и состоит, как избежать того, о чём говорится в ответе FAQ...
Удалите в своем коде секцию
[InstallDelete]
Name: {app}\a.exe; Type: files; Components:
Name: {app}\b.exe; Type: files; Components:
Name: {app}\c.exe; Type: files; Components:
Name: {app}\d.exe; Type: files; Components:
и все заработает как вы хотите.
KindlyЦитата
В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.
Ярлыки сортируются по алфавиту.
Цитата
Можно ли как-нибудь отключить страницу Приветствия?
В InnoSetup напрямую способа я не нашел, но обмануть можно все что угодно... или почти все
Вот код:
procedure CurPageChanged(CurPageID: Integer);
begin
If CurPageID=wpWelcome then
begin
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0);
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0);
end;
end;
Интересно-то как

! Thanks!
У меня вот на днях поинтересовались, но пока не особо силен в Inno, но самому тоже интересно. Вопросы следующего содержания:
Как сделать еще один progress-bar? То есть чтобы во время установки отображался не только общий прогресс, но и прогресс для каждого файла в отдельности. А в идеале - еще и отдельный прогресс для backup'a, если он был выбран?
Guest_Юрий_*
26:07:2005, 10:34
Появился такой вопрос:
На примере для Microsoft Office постараюсь пояснить его. После установки Office на компьютер в диалоге "Установка/Удаление программ" появляется запись об этом. После установки обновления добавляется дочерняя запись "Обновление".
Формулировка вопроса: как сделать так, чтобы после обновления появлялась дочерняя запись об обновлении, а старая никуда бы не исчезала и становилась родительской?
KindlyЦитата
Как сделать еще один progress-bar? То есть чтобы во время установки отображался не только общий прогресс, но и прогресс для каждого файла в отдельности. А в идеале - еще и отдельный прогресс для backup'a, если он был выбран?
Сделать еще один progress-bar не проблема, можно юзать функцию CreateOutputProgressPage, но чтобы этот progress-bar правильно работал надо иметь программный контроль над процессом копирования файлов, InnoSetup такую возможность не дает, тут надо использовать более профессиональные инсталляторы.
Guest_Юрий_*Цитата
На примере для Microsoft Office постараюсь пояснить его. После установки Office на компьютер в диалоге "Установка/Удаление программ" появляется запись об этом. После установки обновления добавляется дочерняя запись "Обновление".
Формулировка вопроса: как сделать так, чтобы после обновления появлялась дочерняя запись об обновлении, а старая никуда бы не исчезала и становилась родительской?
Чтобы в диалоге "Установка/Удаление программ" появилась запись, достаточно в реестре создать ключ : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameOurProgram, в котором надо создать 2 обязательных параметра: DisplayName значение которого отображается в диалоге, UninstallString в значении которого должен быть путь к программе удаления.
Guest_Юрий_*
27:07:2005, 04:47
To Zubr:Цитата
Чтобы в диалоге "Установка/Удаление программ" появилась запись, достаточно в реестре создать ключ : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameOurProgram, в котором надо создать 2 обязательных параметра: DisplayName значение которого отображается в диалоге, UninstallString в значении которого должен быть путь к программе удаления.
То, что Вы сказали, не вызывает никакого сомнения. Это действительно так. Но я спрашиваю о том, как сделать дочернюю запись, чтобы одновременно была запись об оригинале, а информация об обновлении была записана как дерево под оригиналом.
Guest_Юрий_*Цитата
Но я спрашиваю о том, как сделать дочернюю запись, чтобы одновременно была запись об оригинале, а информация об обновлении была записана как дерево под оригиналом.
Так в чем проблема, посмотрите в реестре, как это реализовано для офиса (у меня офис стоит без обновлений) и реализуйте в своем инсталляторе для своей программы.
To Zubr:Цитата
Так в чем проблема, посмотрите в реестре, как это реализовано для офиса (у меня офис стоит без обновлений) и реализуйте в своем инсталляторе для своей программы.
В реестре всё прописано стандартно. Есть какая-то хитрость, и её реализация не на поверхности, как могло показаться на первый взгляд. Так что вопрос отстаётся открытым, к сожалению...
Что Вы можете сказать насчет этого (450 kb):
]]>http://offwn8mw.310.ru/combat/files/russif...e1_0_to_1_2.exe]]>Это обновление русификатора для игры, но не он нужен, а чтобы посмотреть как инсталлятор Inno Setup забомбили - я не узнал вначале. Inno Setup Form Disainer и рядом не валялся. Авторы инсталлятора молчат. Знает кто-нибудь как так возможно?
Так а что здесь невозможного? Меняете в окне Image, ложите 2 TNewProgressBar, причем здесь движение ProgressBar явно не связано с процессом копирования файлов - чистая иммитация, меняете шрифты в Label и т. п.
Цитата
Так а что здесь невозможного? Меняете в окне Image, ложите 2 TNewProgressBar, причем здесь движение ProgressBar явно не связано с процессом копирования файлов - чистая иммитация, меняете шрифты в Label и т. п.
Надо подумать

.
Вопрос: возможно ли сделать резервирование или переименование уже существующих файлов, т.е. например, устанавливается 100 обновленных файлов, по умолчанию старые файлы переписываются новыми, так вот возможно ли вместо перезаписи существующих файлов сделать их резервирование или переименование, причем без указания каждого файла в отдельности?
Цитата
Вопрос: возможно ли сделать резервирование или переименование уже существующих файлов, т.е. например, устанавливается 100 обновленных файлов, по умолчанию старые файлы переписываются новыми, так вот возможно ли вместо перезаписи существующих файлов сделать их резервирование или переименование, причем без указания каждого файла в отдельности?
Резервирование или переименование сделать можно, это уже обсуждалось в этой теме
]]>здесь]]>. А вот без указания каждого файла в отдельности пожалуй в InnoSetup не получится.
Guest_Юрий_*
3:08:2005, 05:26
Задача: установить 2 разные программы в один каталог.
Проблема: размеры этих двух установленных программ, отображаемые в диалоге "Установка и удаление программ" одинаковы в случае, если открыть этот диалог уже после установки и первой и второй.
Попытки решения: DWORD-значение EstimatedSize, устанавливаемое в реестре по пути HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameMyProgram не даёт ожидаемого результата, а именно корректного отображения размеров.
Вопрос: как привязать заранее известные размеры устанавливаемых в один каталог программ к описанию в диалоге "Установка и удаление программ"?
Цитата
как привязать заранее известные размеры устанавливаемых в один каталог программ к описанию в диалоге "Установка и удаление программ"?
Windows данные о размере программы берет из размера каталога в котором размещена программа, а не из реестра, так что обмануть ее тут трудно, проще в вашей программе установки контролировать, чтобы программа устанавливалась в отдельный каталог.
У меня вроде маленький, не сложный вопрос, но найти ответ в хелпе не удалось. Собственно вопрос:
Я создал свою страничку с выбором директории и проверкой пути.
Возможно ли в дальнейшем использовать этот путь вместо константы {app} (при создании ярлыков к примеру).
т.е. как из раздела [code] переопределить {app}?
To Zubr:Цитата
проще в вашей программе установки контролировать, чтобы программа устанавливалась в отдельный каталог.
Видимо, да...
Цитата
Windows данные о размере программы берет из размера каталога в котором размещена программа, а не из реестра, так что обмануть ее тут трудно
На самом деле данные о размере программы берутся виндой из каталога, который в конечном итоге мы сами и можем задать. Запихнув в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram в значение InstallLocation путь к директории, мы тем самым принуждаем Windows обсчитать на предмет размера именно тот каталог, размер которого мы хотим отобразить...
Цитата(Dim @ 4:08:2005, 11:32 )
У меня вроде маленький, не сложный вопрос, но найти ответ в хелпе не удалось. Собственно вопрос:
Я создал свою страничку с выбором директории и проверкой пути.
Возможно ли в дальнейшем использовать этот путь вместо константы {app} (при создании ярлыков к примеру).
т.е. как из раздела [code] переопределить {app}?
Сам разобрался

строчка в справке была не по глазам...
В разеделе [code] была вставлена функция:
__________
function GetDir(tmp: string): String;
begin
Result := Page.Values[0];
end;
__________
А вместо {app} используем {code:GetDir}
Цитата
На самом деле данные о размере программы берутся виндой из каталога, который в конечном итоге мы сами и можем задать. Запихнув в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram в значение InstallLocation путь к директории, мы тем самым принуждаем Windows обсчитать на предмет размера именно тот каталог, размер которого мы хотим отобразить...
Ну так и я о том же
Guest_Юрий_*
5:08:2005, 07:53
Существует ли способ убрать слово "Setup" в пункте Описание в свойствах файла инсталлятора?
К примеру, для инсталлятора с таким кусочком кода
[Setup]
AppName=My Program
в свойствах написано "My Program Setup"...
Убрать можно подменив ресурс, как обсуждалось
]]>выше]]>
Вопрос немного не по теме, но знать хочется: Почему минимальный размер инсталлятора NSIS 50 kb, а Inno Setup 300 kb и можно ли вообще его уменьшить?
Цитата
Вопрос немного не по теме, но знать хочется: Почему минимальный размер инсталлятора NSIS 50 kb, а Inno Setup 300 kb и можно ли вообще его уменьшить?
Аналогия минимальный размер exe-файла скомпилированный в Delphi 300 kB, а в VC 20 kB. Скорее всего Inno Setup создавался в среде типа Delphi. Уменьшить не получится, проще написать свой инсталлятор. Кстати, в VC Net очень неплохой Wizard на проект инсталлятора.
Известно, что при нажатии кнопки "Отмена" при установке, создается откат действий. Вопрос следующий: возможно ли создать откат при деинсталляции?
Откат деинсталляции можно сделать до процесса удаления файлов, что в принципе деинсталлятор и предлагает. Если вам нужны еще какие то события деинсталлятора, то можете попробовать юзать функции:
function InitializeUninstall(): Boolean;
procedure DeinitializeUninstall();
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
Zubr, спасибо - буду пробовать.
Вот какой инструмент я нашел для Inno Setup 5 (3.7М).
]]>http://www.hisoft2000.de/sm5/ScriptMaker5_full.exe]]>Генератор скриптов в общем говоря (бесплатный). Включает дополнительный модуль для различных наворотов, а именно: сплеш-заставка, измение изображений для каждой страницы в отдельности, проигрывание wave и midi в фоновом режиме, продвинутая деинсталляция (с восстановлением и модификацией) и многое другое. Рекомендую всем.
У меня появилась такая проблемка: при упаковке одной игрушки, которая занимает несколько CD, программа разбивает архивы на три диска, но даже при использовании максимального метода сжатия (lzma/ultra), она "отводит" оставшиеся 20 MB для четвертого CD. Это мне абсолютно не нужно. Но создав автономный самораспаковывающийся модуль 7Z, мне удалось уместить игру на 3 CD. Этот ехе-архив запускать при установке с последующим удалением не проблема, проблема в том, как запустить его так, чтобы началось сразу его выполнение, т.е. извлечение файлов. Насколько мне подсказывавает собственная интуиция, провернуть это можно с помощью параметров командной строки, вот только пока с ней не подружился, поэтому если возникала у кого-нибудь подобная ситуация, просьба помочь мне в ней разобраться.
[QUOTE]
...проблема в том, как запустить его так, чтобы началось сразу его выполнение, т.е. извлечение файлов. Насколько мне подсказывавает собственная интуиция, провернуть это можно с помощью параметров командной строки, вот только пока с ней не подружился, поэтому если возникала у кого-нибудь подобная ситуация, просьба помочь мне в ней разобраться.
Извиняюсь, если что-то не так понял. Я делал инсталлятор, в котором сначала я копировал на жесткий sfx-архив, а затем запускал его с параметрами коммандной строки "-e -ao -y", где е-распаковка в текущую папку, ао-перезапись существующих файлов, чтобы не появилось окна с вопросом о перезаписи файла, y-пропуск начального диалога (появится сразу окно прогресса).
Не подскажет ли кто, есть ли программка наподобии Inno Unpacker, но чтобы можно было востаноить секцию [Code], вообще реально восстановить код инсталлятора, хотя бы частично?
Snаке, спасибо большое, буду пробовать.
Цитата
Не подскажет ли кто, есть ли программка наподобии Inno Unpacker, но чтобы можно было востаноить секцию Code, вообще реально восстановить код инсталлятора, хотя бы частично?
В смысле получается закриптованный файл CompiledCode.bin, да? Есть смысл написать распаковщик/конвертер в TXT (но это уже не по моей специальности

). Есть какой-то распаковщик здесь:
]]>http://prdownloads.sourceforge.net/innounp/ifps3_disasm.rar]]>Но он очень кривой и не дружит с пятой версией, да и к тому же извлекает в АСМе - жуть

.
Подскажите, пожалуйста, кто-нибудь ответ по такому вопросу. На странице wpInstalling я создал второй progress-bar (просто так, для вида) и его движение ни от чего не должно зависить. Как заставить его двигаться и изменять скорость его движения? Также при отмене установки родной progress-bar скрывается и как сделать, чтобы мой тоже скрывался?
Спасибо Kindly за программку, обязательно попробую. Может еще сам что-нибудь найду.
Чтобы тебе, Kindly, самому не возиться, выкладываю скрипт для распаковки 7Z архива

. Кстати, только увидел, что ошибся - вместо неправильной команды "ао" напиши "аоа" как показано ниже.
[Files]
Source: "sfx.exe"; DestDir: "{app}"; AfterInstall: MyAfterInstall; Flags: ignoreversion deleteafterinstall
[Code]
procedure MyAfterInstall();
var
ResultCode: Integer;
begin
begin
Exec(ExpandConstant('{app}\sfx.exe'), '-e -aoa -y', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end
end;
Snаке, у меня все прекрасно работает с установленным параметром '-y'. Я архив в самом 7z архиваторе создавал, поэтому остальные команды не нужны. Запускаю вообще-то я архив из секции
[Run], но предложенный способ тоже не хуже

.
Цитата
На странице wpInstalling я создал второй progress-bar (просто так, для вида) и его движение ни от чего не должно зависить. Как заставить его двигаться и изменять скорость его движения? Также при отмене установки родной progress-bar скрывается и как сделать, чтобы мой тоже скрывался?
Есть пример прогресс-бара (его выполнение и скорость выполнения) в одном из скриптов в папке с примерами.
ни кто не знает,
CheckListBox := TNewCheckListBox.Create(Page);
CheckListBox.Width := Page.SurfaceWidth;
CheckListBox.Height := Page.SurfaceHeight;
CheckListBox.Flat := True;
CheckListBox.Parent := Page.Surface;
CheckListBox.AddCheckBox('GUI', '', 0, True, True, False, True, nil);
CheckListBox.AddCheckBox(' Windows Explorer', '', 1, False, True, False, True, nil);
CheckListBox.AddCheckBox(' Outlook', '', 1, True, True, False, True, nil);
CheckListBox.AddCheckBox(' Web Interface', '', 1, True, True, False, True, nil);
CheckListBox.AddCheckBox('Server', '', 0, True, True, False, True, nil);
CheckListBox.AddCheckBox('cFolders', '', 1, False, True, False, True, nil);
CheckListBox.AddCheckBox('DMS', '', 1, True, True, False, True, nil);
CheckListBox.AddCheckBox('CRM', '', 1, True, True, False, True, nil);
webInterfaceName := ExpandConstant('{tmp}\web.interface.bmp');
ExtractTemporaryFile(ExtractFileName(webInterfaceName));
webInterface := TBitmapImage.Create(Page);
webInterface.AutoSize := True;
webInterface.Bitmap.LoadFromFile(webInterfaceName);
webInterface.Parent := MainForm;
webInterface.left := 42;
webInterface.top := 48;
не коректно отображается битмап ?
Цитата
Как заставить его двигаться и изменять скорость его движения?
Хм... Действительно - как задать выполнение нового прогресс-бара?
Один из скриптов в примерах описывает выполнение новой страницы прогресса, а не прогресс-бара в отдельности.
Делаем новую полосу прогресса (ну уж как смог).
var
ProgressBar: TNewProgressBar;
procedure CurPageChanged(CurPageID: Integer);
var
i:Integer;
begin
If CurPageID=wpInstalling
then
begin
ProgressBar := TNewProgressBar.Create(WizardForm);
ProgressBar.Left := ScaleY(40);
ProgressBar.Top := ScaleX(180);
ProgressBar.Width := ScaleY(415);
ProgressBar.Height := ScaleX(18);
ProgressBar.Parent := WizardForm;
ProgressBar.Position := 0; //указывает количество заполняемых секторов
end;
begin
If CurPageID=wpFinished
then
ProgressBar.Hide
end;
end;
Мне кажется, что выполнение прогресс-бара должно осуществляться как-то по-другому, наверное, должна быть какая-то функция, которая бы заполняла полосу прогресса, например, от 0 до 100 (от начала до конца) в определенный промежуток времени, но вот теперешние способности у меня позволяют только предполагать.
Способ скрытия второго прогресс-бара при нажатии на кнопку Отмена в процессе установки.
В этом примере один недостаток - при нажатии на кнопку Отмена, не будет выведено уведомление о подтверждении Отмены. Может будут у кого варианты, как все проделать без отключения сообщения?
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=True;
If CurPage=wpInstalling
then
begin
Confirm:=False;
ProgressBar.Hide
end;
end;
Здраствуйте. Я хочу задать вам, Zubr, целых три вопроса:
1. Мне интересно, что это за процедура ShowAboutBox и как ее использовать. Сам я ответ в Help'е не нашел;
2. Можно ли аналогично инсталлатору как нибудь изменить окно деинсталляции. Конкретно меня интересует, как можно убрать в левом верхнем углу изображение иконки инсталлятора. В отличии от WizardForm(и прочее) компонент UninstProgressForm вроде не поддерживается, но хотелось бы узнать мнение знающего человека;
3. Самый гиморный вопрос. Может объясню немного путанно, но постараюсь. На второй странице форума вы написали скрипт создания фонового рисунка на MainForm, но у него есть один недостаток. Когда запускаешь инсталлятор, одновременно появляются MainForm и WizardForm, а через некоторое время на MainForm создается рисунок, но в этот промежуток времени виден отвратительный синий(или какой-либо другой) фоновый цвет MainForm. Я видел всего два инсталлятора(игра DOOM 3 и программа Quest3D 2.0b), в которых реализован какой-то другой принцип - MainForm и фоновый рисунок на ней появляются ОДНОВРЕМЕННО, а через какое-то мгновение появляется окно WizardForm, т.е. фоновый синий цвет не виден. Подскажите, пожалуйста как это сделано, а то я сам провозился наверное с середины лета, но так и не разобрался.
Буду очень благодарен если вы поможете мне с их решением!
Отдельное большое спасибо Kindly за помощь!
Цитата(fiot @ 31:08:2005, 09:09 )
ни кто не знает,
...
webInterface := TBitmapImage.Create(Page);
webInterface.AutoSize := True;
webInterface.Bitmap.LoadFromFile(webInterfaceName);
webInterface.Parent := MainForm;
webInterface.left := 42;
webInterface.top := 48;
не коректно отображается битмап ?
Немного непонятна эта часть скрипта. Напиши, на какой форме ты хочешь создать рисунок!
Чуть не забыл. Если ты, fiot, хочешь создать рисунок на странице инсталлятора, также опиши где конкретно должен располагаться рисунок и его размеры. Возможно я знаю ответ на твой вопрос.
Позволю себе, Kindly, чуть подправить твой скрипт с progress-bar'ом. Попробуй мой скрипт(небольшая переделка под Wise Installation Wizard), думаю понравится. Также я решил проблему со скрытием progress-bar'а. Сначала у меня получалось, что progress-bar скрывался при нажатии "Отмена", но при нажатии в месаге(Выход из программы установки) на "Нет" скрытый progress-bar уже появлялся. Как изменить стандартную месагу я не понял и скрыл ее, и затем просто сделал свою.
[Code]
var
Progress: TNewProgressBar;
CurentFile: TNewStatictext;
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
If MsgBox('Установка не завершена. Если вы выйдете, программа не будет установлена.' #13#10#13#10 'Вы сможете завершить установку, запустив программу установки позже.' #13#10#13#10 'Выйти из программы установки?', mbConfirmation, mb_YesNo)=IdYes then
begin
Cancel:=True;
Progress.Hide;
CurentFile.Hide
end else begin
Cancel:=False;
end
end;
procedure InitializeWizard();
var
Cancel: Boolean;
Confirm: Boolean;
Page: TWizardPage;
InfoText: TNewStatictext;
AllFiles: TNewStatictext;
begin
Page:=PageFromID(wpInstalling);
AllFiles:=TNewStaticText.Create(Page);
AllFiles.Caption:='Состояние:';
AllFiles.Parent:=Page.Surface;
WizardForm.StatusLabel.Top:=ScaleY(20);
WizardForm.ProgressGauge.Top:=ScaleY(40);
CurentFile:=TNewStaticText.Create(Page);
CurentFile.Caption:='Копируется файл:';
CurentFile.Top:=ScaleY(90);
CurentFile.Parent:=Page.Surface;
WizardForm.FileNameLabel.Top:=ScaleY(110);
Progress:=TNewProgressBar.Create(Page);
Progress.Top:=ScaleY(130);
Progress.Width:=Page.SurfaceWidth;
Progress.Height:=WizardForm.ProgressGauge.Height;
Progress.Min:=0;
Progress.Max:=100;
Progress.Show;
Progress.Parent:=Page.Surface;
end;
К слову, стало гораздо проще заменить тип сообщения(mbInformation, mbConfirmation и т.д.), если конечно захочешь.
Теперь осталось только решить проблему с движением progress-bar'а.
SnаkeЦитата
1. Мне интересно, что это за процедура ShowAboutBox и как ее использовать. Сам я ответ в Help'е не нашел;
Эта процедура вызывает информационное окно об авторстве и версии Inno Setup.
procedure InitializeWizard();
begin
MainForm.ShowAboutBox;
end;
Вам это надо?
Цитата
2. Можно ли аналогично инсталлатору как нибудь изменить окно деинсталляции. Конкретно меня интересует, как можно убрать в левом верхнем углу изображение иконки инсталлятора. В отличии от WizardForm(и прочее) компонент UninstProgressForm вроде не поддерживается, но хотелось бы узнать мнение знающего человека;
Похоже, что такой возможности нет.
Цитата
3. Самый гиморный вопрос. Может объясню немного путанно, но постараюсь. На второй странице форума вы написали скрипт создания фонового рисунка на MainForm, но у него есть один недостаток. Когда запускаешь инсталлятор, одновременно появляются MainForm и WizardForm, а через некоторое время на MainForm создается рисунок, но в этот промежуток времени виден отвратительный синий(или какой-либо другой) фоновый цвет MainForm. Я видел всего два инсталлятора(игра DOOM 3 и программа Quest3D 2.0b), в которых реализован какой-то другой принцип - MainForm и фоновый рисунок на ней появляются ОДНОВРЕМЕННО, а через какое-то мгновение появляется окно WizardForm, т.е. фоновый синий цвет не виден. Подскажите, пожалуйста как это сделано, а то я сам провозился наверное с середины лета, но так и не разобрался.
[Setup]
WindowVisible=no
[code]
function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';
procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
width, height:Integer;
begin
MainForm.BORDERSTYLE:=bsNone;
width:=GetSystemMetrics(61);
height:=GetSystemMetrics(62);
MainForm.Width:=width;
MainForm.Height:=height;
width:=MainForm.ClientWidth;
height:=MainForm.ClientHeight;
ExtractTemporaryFile('mostkorol2_1024.bmp');
s:=ExpandConstant('{tmp}')+'\mostkorol2_1024.bmp';
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Left := 0;
BackgroundBitmapImage.Top := 0;
BackgroundBitmapImage.Width:=width;
BackgroundBitmapImage.Height:=height;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
MainForm.Visible:=True;
end;
Цитата
Подскажите, пожалуйста, кто-нибудь ответ по такому вопросу. На странице wpInstalling я создал второй progress-bar (просто так, для вида) и его движение ни от чего не должно зависить. Как заставить его двигаться и изменять скорость его движения?
Чтобы ваш progress-bar корректно двигался, надо двигать его в отдельном потоке, то есть создать процедуру потока:
procedure prgbar_emulate;
var
i:Integer;
begin
For i:=1 to 100 do
begin
Sleep(100);
prbar.Position:=i;
end;
end;
Запускается поток с помощью функции API CreateThread, которая находится в Kernel32.dll. Как выдрать функцию из dll смотрите пример выше (с функцией GetSystemMetrics), а также в примерах к Inno Setup (CodeDll.iss). Полный код писать нет времени.
Спасибо, zubr, за скрипт с рисунком. С progress-bar'ом еще предстоит разобраться. Но возникает другой маленький вопросик. Вкратце поясните, что означают эти размеры: width:=GetSystemMetrics(61) и height:=GetSystemMetrics(62).
При использовании размеров 61х62 была видна Панель задач, заменив их на 61х60, получил Fullscreen.
Функция API GetSystemMetrics возвращает информацию о рабочей среде Windows. С параметрами SM_CXMAXIMIZED = 61 и SM_CYMAXIMIZED = 62 функция возвращает размеры развернутого окна по умолчанию. 60 - это вы применили параметр SM_CYMAXTRACK - максимальный размер Y при ручном масштабировании. Если вы хотите, чтобы фоновое окно закрывало и панель задач, корректнее было бы применить параметры SM_CXSCREEN=0, SM_CYSCREEN=1.
Спасибо, zubr, что объяснили!
У меня еще оди мелкий косметический вопрос. Есть ли возможность изменить компонент InnerPage(например, добавить на него какие-нибудь объекты), у меня получалось только изменить цвет.
Также мне интерестно(InnerPage есть на всех страницах кроме wpWelcome и wpFinished), в середине InnerPage находится какое-то поле, на котором и расположены различные объекты(выбор папки, компонентов и т.д.). Вот как раз название этого поля я и не знаю. Есть ли возможность изменить размеры этого поля, например как и на странице приветствия растянуть его во все окно инсталлятора?
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.