Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Написание скрипта для инсталлятора
Форум программистов > Системное программирование > Delphi и Pascal > Delphi - FAQ
Страницы: 1, 2, 3, 4, 5, 6
zubr
Цитата
Похоже, неправильно дал пояснение... Имеется в виду, что функция, которая должна выполнятся через 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_Юрий_*
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. Смотрим в папку с установленной программой, компонентов нет (ни заранее установленных, ни того, процесс установки которого прервали)
Kindly
zubr
Цитата
Создавайте свою группу, в которую помещайте устанавливаемые программы.

В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой huh.gif , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.
Guest_Юрий_*
To Kindly:

Цитата
В смысле? Так группа с ярлыками и создается, а после установки ярлыки могут быть в разнобой  , например: "Удалить" может быть в середине программной группы (особенно если ярлыков много). Хотелось бы знать, имеется ли возможность назначения последовательности размещения ярлыков в программной группе с ярлыками.


по-моему, размещение ярлыков определяется сортировкой, заданной Вами же для меню Пуск...
Guest_Юрий_*
Код был представлен с ошибкой... Конечно же в секции [InstallDelete]
должны быть следующие продолжения строк:
Components: group\file1;
Components: group\file2;
Components: group\file3;
Components: group\file4;


В данном случае, это не суть важно, т.к. проблема с удалением предустановленных файлов всё равно есть...
Kindly
zubr CheckBox
Спасибо! Все просто замечательно! Немного доработки - и у меня оказалось то, чего я давно хотел. Но вопросы "по-мелочи" у меня все же есть:
1. Можно ли как-нибудь отключить страницу Приветствия?
2. Существует ли вообще в Inno Setup функции отключения видимости или задействования кнопок (например, как на странице принятия лицензионного соглащения)?
Guest_Юрий_*
To Kindly:

Цитата
1. Можно ли как-нибудь отключить страницу Приветствия?
2. Существует ли вообще в Inno Setup функции отключения видимости или задействования кнопок (например, как на странице принятия лицензионного соглащения)?


1. страница приветствия отключается при помощи
[Setup]
DisableStartupPrompt=yes


2. на примере для кнопки "Назад" Мастера можно задисэйблить при помощи следующего кода в секции
:
[CODE]procedure InitializeWizard();
begin
   WizardForm.BackButton.Enabled := False;
end;


для кнопки "Далее" надо устанавливать конкретные страницы Мастера, где произойдёт изменение её состояния (т.к. принимая Лицензионное соглашение кнопа автоматом становится доступной)...
Kindly
Guest_Юрий_*,
Цитата
[Setup]
DisableStartupPrompt=yes

отключает только сообщение при инициализации, а не страницу приветствия.
Насчет кнопок, спасибо за намек laugh.gif - надо потренироваться.
zubr
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 напрямую способа я не нашел, но обмануть можно все что угодно... или почти все smile.gif
Вот код:
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;
Kindly
Интересно-то как biggrin.gif ! Thanks!
У меня вот на днях поинтересовались, но пока не особо силен в Inno, но самому тоже интересно. Вопросы следующего содержания:
Как сделать еще один progress-bar? То есть чтобы во время установки отображался не только общий прогресс, но и прогресс для каждого файла в отдельности. А в идеале - еще и отдельный прогресс для backup'a, если он был выбран?
Guest_Юрий_*
Появился такой вопрос:
На примере для Microsoft Office постараюсь пояснить его. После установки Office на компьютер в диалоге "Установка/Удаление программ" появляется запись об этом. После установки обновления добавляется дочерняя запись "Обновление".
Формулировка вопроса: как сделать так, чтобы после обновления появлялась дочерняя запись об обновлении, а старая никуда бы не исчезала и становилась родительской?
zubr
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_Юрий_*
To Zubr:
Цитата
Чтобы в диалоге "Установка/Удаление программ" появилась запись, достаточно в реестре создать ключ : HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameOurProgram, в котором надо создать 2 обязательных параметра: DisplayName значение которого отображается в диалоге, UninstallString в значении которого должен быть путь к программе удаления.


То, что Вы сказали, не вызывает никакого сомнения. Это действительно так. Но я спрашиваю о том, как сделать дочернюю запись, чтобы одновременно была запись об оригинале, а информация об обновлении была записана как дерево под оригиналом.
zubr
Guest_Юрий_*
Цитата
Но я спрашиваю о том, как сделать дочернюю запись, чтобы одновременно была запись об оригинале, а информация об обновлении была записана как дерево под оригиналом.

Так в чем проблема, посмотрите в реестре, как это реализовано для офиса (у меня офис стоит без обновлений) и реализуйте в своем инсталляторе для своей программы.
Guest
To Zubr:
Цитата
Так в чем проблема, посмотрите в реестре, как это реализовано для офиса (у меня офис стоит без обновлений) и реализуйте в своем инсталляторе для своей программы.

В реестре всё прописано стандартно. Есть какая-то хитрость, и её реализация не на поверхности, как могло показаться на первый взгляд. Так что вопрос отстаётся открытым, к сожалению...
Kindly
Что Вы можете сказать насчет этого (450 kb):
]]>http://offwn8mw.310.ru/combat/files/russif...e1_0_to_1_2.exe]]>
Это обновление русификатора для игры, но не он нужен, а чтобы посмотреть как инсталлятор Inno Setup забомбили - я не узнал вначале. Inno Setup Form Disainer и рядом не валялся. Авторы инсталлятора молчат. Знает кто-нибудь как так возможно?
zubr
Так а что здесь невозможного? Меняете в окне Image, ложите 2 TNewProgressBar, причем здесь движение ProgressBar явно не связано с процессом копирования файлов - чистая иммитация, меняете шрифты в Label и т. п.
Kindly
Цитата
Так а что здесь невозможного? Меняете в окне Image, ложите 2 TNewProgressBar, причем здесь движение ProgressBar явно не связано с процессом копирования файлов - чистая иммитация, меняете шрифты в Label и т. п.

Надо подумать unsure.gif .
Вопрос: возможно ли сделать резервирование или переименование уже существующих файлов, т.е. например, устанавливается 100 обновленных файлов, по умолчанию старые файлы переписываются новыми, так вот возможно ли вместо перезаписи существующих файлов сделать их резервирование или переименование, причем без указания каждого файла в отдельности?
zubr
Цитата
Вопрос: возможно ли сделать резервирование или переименование уже существующих файлов, т.е. например, устанавливается 100 обновленных файлов, по умолчанию старые файлы переписываются новыми, так вот возможно ли вместо перезаписи существующих файлов сделать их резервирование или переименование, причем без указания каждого файла в отдельности?

Резервирование или переименование сделать можно, это уже обсуждалось в этой теме ]]>здесь]]>. А вот без указания каждого файла в отдельности пожалуй в InnoSetup не получится.
Guest_Юрий_*
Задача: установить 2 разные программы в один каталог.

Проблема: размеры этих двух установленных программ, отображаемые в диалоге "Установка и удаление программ" одинаковы в случае, если открыть этот диалог уже после установки и первой и второй.

Попытки решения: DWORD-значение EstimatedSize, устанавливаемое в реестре по пути HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\NameMyProgram не даёт ожидаемого результата, а именно корректного отображения размеров.

Вопрос: как привязать заранее известные размеры устанавливаемых в один каталог программ к описанию в диалоге "Установка и удаление программ"?
zubr
Цитата
как привязать заранее известные размеры устанавливаемых в один каталог программ к описанию в диалоге "Установка и удаление программ"?

Windows данные о размере программы берет из размера каталога в котором размещена программа, а не из реестра, так что обмануть ее тут трудно, проще в вашей программе установки контролировать, чтобы программа устанавливалась в отдельный каталог.
Dim
У меня вроде маленький, не сложный вопрос, но найти ответ в хелпе не удалось. Собственно вопрос:
Я создал свою страничку с выбором директории и проверкой пути.
Возможно ли в дальнейшем использовать этот путь вместо константы {app} (при создании ярлыков к примеру).
т.е. как из раздела [code] переопределить {app}?
Guest
To Zubr:
Цитата
проще в вашей программе установки контролировать, чтобы программа устанавливалась в отдельный каталог.

Видимо, да...
Цитата
Windows данные о размере программы берет из размера каталога в котором размещена программа, а не из реестра, так что обмануть ее тут трудно

На самом деле данные о размере программы берутся виндой из каталога, который в конечном итоге мы сами и можем задать. Запихнув в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram в значение InstallLocation путь к директории, мы тем самым принуждаем Windows обсчитать на предмет размера именно тот каталог, размер которого мы хотим отобразить...
Dim
Цитата(Dim @ 4:08:2005, 11:32 )
У меня вроде маленький, не сложный вопрос, но найти ответ в хелпе не удалось. Собственно вопрос:
Я создал свою страничку с выбором директории и проверкой пути. 
Возможно ли в дальнейшем использовать этот путь вместо константы {app} (при создании ярлыков к примеру).
т.е. как из раздела [code] переопределить {app}?
*


Сам разобрался smile.gif строчка в справке была не по глазам...
В разеделе [code] была вставлена функция:
__________
function GetDir(tmp: string): String;
begin
Result := Page.Values[0];
end;
__________
А вместо {app} используем {code:GetDir} smile.gif
zubr
Цитата
На самом деле данные о размере программы берутся виндой из каталога, который в конечном итоге мы сами и можем задать. Запихнув в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyProgram в значение InstallLocation путь к директории, мы тем самым принуждаем Windows обсчитать на предмет размера именно тот каталог, размер которого мы хотим отобразить...

Ну так и я о том же rolleyes.gif
Guest_Юрий_*
Существует ли способ убрать слово "Setup" в пункте Описание в свойствах файла инсталлятора?
К примеру, для инсталлятора с таким кусочком кода
[Setup]
AppName=My Program
в свойствах написано "My Program Setup"...
zubr
Убрать можно подменив ресурс, как обсуждалось ]]>выше]]>
Kindly
Вопрос немного не по теме, но знать хочется: Почему минимальный размер инсталлятора NSIS 50 kb, а Inno Setup 300 kb и можно ли вообще его уменьшить?
zubr
Цитата
Вопрос немного не по теме, но знать хочется: Почему минимальный размер инсталлятора NSIS 50 kb, а Inno Setup 300 kb и можно ли вообще его уменьшить?

Аналогия минимальный размер exe-файла скомпилированный в Delphi 300 kB, а в VC 20 kB. Скорее всего Inno Setup создавался в среде типа Delphi. Уменьшить не получится, проще написать свой инсталлятор. Кстати, в VC Net очень неплохой Wizard на проект инсталлятора.
Kindly
Известно, что при нажатии кнопки "Отмена" при установке, создается откат действий. Вопрос следующий: возможно ли создать откат при деинсталляции?
zubr
Откат деинсталляции можно сделать до процесса удаления файлов, что в принципе деинсталлятор и предлагает. Если вам нужны еще какие то события деинсталлятора, то можете попробовать юзать функции:
function InitializeUninstall(): Boolean;
procedure DeinitializeUninstall();
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
Kindly
Zubr, спасибо - буду пробовать.
Вот какой инструмент я нашел для Inno Setup 5 (3.7М).
]]>http://www.hisoft2000.de/sm5/ScriptMaker5_full.exe]]>
Генератор скриптов в общем говоря (бесплатный). Включает дополнительный модуль для различных наворотов, а именно: сплеш-заставка, измение изображений для каждой страницы в отдельности, проигрывание wave и midi в фоновом режиме, продвинутая деинсталляция (с восстановлением и модификацией) и многое другое. Рекомендую всем.
Kindly
У меня появилась такая проблемка: при упаковке одной игрушки, которая занимает несколько CD, программа разбивает архивы на три диска, но даже при использовании максимального метода сжатия (lzma/ultra), она "отводит" оставшиеся 20 MB для четвертого CD. Это мне абсолютно не нужно. Но создав автономный самораспаковывающийся модуль 7Z, мне удалось уместить игру на 3 CD. Этот ехе-архив запускать при установке с последующим удалением не проблема, проблема в том, как запустить его так, чтобы началось сразу его выполнение, т.е. извлечение файлов. Насколько мне подсказывавает собственная интуиция, провернуть это можно с помощью параметров командной строки, вот только пока с ней не подружился, поэтому если возникала у кого-нибудь подобная ситуация, просьба помочь мне в ней разобраться.
Snаке
[QUOTE]
...проблема в том, как запустить его так, чтобы началось сразу его выполнение, т.е. извлечение файлов. Насколько мне подсказывавает собственная интуиция, провернуть это можно с помощью параметров командной строки, вот только пока с ней не подружился, поэтому если возникала у кого-нибудь подобная ситуация, просьба помочь мне в ней разобраться.

Извиняюсь, если что-то не так понял. Я делал инсталлятор, в котором сначала я копировал на жесткий sfx-архив, а затем запускал его с параметрами коммандной строки "-e -ao -y", где е-распаковка в текущую папку, ао-перезапись существующих файлов, чтобы не появилось окна с вопросом о перезаписи файла, y-пропуск начального диалога (появится сразу окно прогресса).
Snаке
Не подскажет ли кто, есть ли программка наподобии Inno Unpacker, но чтобы можно было востаноить секцию [Code], вообще реально восстановить код инсталлятора, хотя бы частично?
Kindly
Snаке, спасибо большое, буду пробовать.
Цитата
Не подскажет ли кто, есть ли программка наподобии Inno Unpacker, но чтобы можно было востаноить секцию Code, вообще реально восстановить код инсталлятора, хотя бы частично?

В смысле получается закриптованный файл CompiledCode.bin, да? Есть смысл написать распаковщик/конвертер в TXT (но это уже не по моей специальности cool.gif ). Есть какой-то распаковщик здесь:
]]>http://prdownloads.sourceforge.net/innounp/ifps3_disasm.rar]]>
Но он очень кривой и не дружит с пятой версией, да и к тому же извлекает в АСМе - жуть blink.gif .
Snаке
Подскажите, пожалуйста, кто-нибудь ответ по такому вопросу. На странице wpInstalling я создал второй progress-bar (просто так, для вида) и его движение ни от чего не должно зависить. Как заставить его двигаться и изменять скорость его движения? Также при отмене установки родной progress-bar скрывается и как сделать, чтобы мой тоже скрывался?
Snаке
Спасибо Kindly за программку, обязательно попробую. Может еще сам что-нибудь найду.
Snаке
Чтобы тебе, Kindly, самому не возиться, выкладываю скрипт для распаковки 7Z архиваwink.gif. Кстати, только увидел, что ошибся - вместо неправильной команды "ао" напиши "аоа" как показано ниже.

[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;
Kindly
Snаке, у меня все прекрасно работает с установленным параметром '-y'. Я архив в самом 7z архиваторе создавал, поэтому остальные команды не нужны. Запускаю вообще-то я архив из секции [Run], но предложенный способ тоже не хуже smile.gif.
Цитата
На странице wpInstalling я создал второй progress-bar (просто так, для вида) и его движение ни от чего не должно зависить. Как заставить его двигаться и изменять скорость его движения? Также при отмене установки родной progress-bar скрывается и как сделать, чтобы мой тоже скрывался?

Есть пример прогресс-бара (его выполнение и скорость выполнения) в одном из скриптов в папке с примерами.
fiot
ни кто не знает,
 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;

не коректно отображается битмап ?
Kindly
Цитата
Как заставить его двигаться и изменять скорость его движения?

Хм... Действительно - как задать выполнение нового прогресс-бара?
Один из скриптов в примерах описывает выполнение новой страницы прогресса, а не прогресс-бара в отдельности.
Делаем новую полосу прогресса (ну уж как смог).
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;
Snаke
Здраствуйте. Я хочу задать вам, Zubr, целых три вопроса:

1. Мне интересно, что это за процедура ShowAboutBox и как ее использовать. Сам я ответ в Help'е не нашел;
2. Можно ли аналогично инсталлатору как нибудь изменить окно деинсталляции. Конкретно меня интересует, как можно убрать в левом верхнем углу изображение иконки инсталлятора. В отличии от WizardForm(и прочее) компонент UninstProgressForm вроде не поддерживается, но хотелось бы узнать мнение знающего человека;
3. Самый гиморный вопрос. Может объясню немного путанно, но постараюсь. На второй странице форума вы написали скрипт создания фонового рисунка на MainForm, но у него есть один недостаток. Когда запускаешь инсталлятор, одновременно появляются MainForm и WizardForm, а через некоторое время на MainForm создается рисунок, но в этот промежуток времени виден отвратительный синий(или какой-либо другой) фоновый цвет MainForm. Я видел всего два инсталлятора(игра DOOM 3 и программа Quest3D 2.0b), в которых реализован какой-то другой принцип - MainForm и фоновый рисунок на ней появляются ОДНОВРЕМЕННО, а через какое-то мгновение появляется окно WizardForm, т.е. фоновый синий цвет не виден. Подскажите, пожалуйста как это сделано, а то я сам провозился наверное с середины лета, но так и не разобрался.

Буду очень благодарен если вы поможете мне с их решением!
Отдельное большое спасибо Kindly за помощь!
Snаke
Цитата(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;

не коректно отображается битмап ?
*


Немного непонятна эта часть скрипта. Напиши, на какой форме ты хочешь создать рисунок!
Snаke
Чуть не забыл. Если ты, fiot, хочешь создать рисунок на странице инсталлятора, также опиши где конкретно должен располагаться рисунок и его размеры. Возможно я знаю ответ на твой вопрос.
Snаke
Позволю себе, 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'а.
zubr
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). Полный код писать нет времени.
Snаke
Спасибо, zubr, за скрипт с рисунком. С progress-bar'ом еще предстоит разобраться. Но возникает другой маленький вопросик. Вкратце поясните, что означают эти размеры: width:=GetSystemMetrics(61) и height:=GetSystemMetrics(62).
При использовании размеров 61х62 была видна Панель задач, заменив их на 61х60, получил Fullscreen.
zubr
Функция API GetSystemMetrics возвращает информацию о рабочей среде Windows. С параметрами SM_CXMAXIMIZED = 61 и SM_CYMAXIMIZED = 62 функция возвращает размеры развернутого окна по умолчанию. 60 - это вы применили параметр SM_CYMAXTRACK - максимальный размер Y при ручном масштабировании. Если вы хотите, чтобы фоновое окно закрывало и панель задач, корректнее было бы применить параметры SM_CXSCREEN=0, SM_CYSCREEN=1.
Snаke
Спасибо, zubr, что объяснили!
У меня еще оди мелкий косметический вопрос. Есть ли возможность изменить компонент InnerPage(например, добавить на него какие-нибудь объекты), у меня получалось только изменить цвет.
Также мне интерестно(InnerPage есть на всех страницах кроме wpWelcome и wpFinished), в середине InnerPage находится какое-то поле, на котором и расположены различные объекты(выбор папки, компонентов и т.д.). Вот как раз название этого поля я и не знаю. Есть ли возможность изменить размеры этого поля, например как и на странице приветствия растянуть его во все окно инсталлятора?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2009 IPS, Inc.