Написание скрипта для инсталлятора

  • Автор темы Автор темы Kindly
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
ни кто не знает,
Код:
 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 за помощь!
 
<!--QuoteBegin-fiot+31:08:2005, 09:09 -->
<span class="vbquote">(fiot @ 31:08:2005, 09:09 )</span><!--QuoteEBegin-->ни кто не знает,
Код:
...
webInterface := TBitmapImage.Create(Page);
webInterface.AutoSize := True;
webInterface.Bitmap.LoadFromFile(webInterfaceName);
webInterface.Parent := MainForm;
webInterface.left := 42;
webInterface.top := 48;
не коректно отображается битмап ?
[snapback]24317" rel="nofollow" target="_blank[/snapback]​
[/quote]

Немного непонятна эта часть скрипта. Напиши, на какой форме ты хочешь создать рисунок!
 
Чуть не забыл. Если ты, 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 находится какое-то поле, на котором и расположены различные объекты(выбор папки, компонентов и т.д.). Вот как раз название этого поля я и не знаю. Есть ли возможность изменить размеры этого поля, например как и на странице приветствия растянуть его во все окно инсталлятора?
 
Судя по всему InnerPage не является владельцем других компонентов, по крайней мере свойство InnerPage.COMPONENTCOUNT=0. Могу посоветовать, чтобы получить доступ к определенному компоненту на WizardForm, выполняйте следующий код в отладке:
Код:
procedure CurPageChanged(CurPageID: Integer);
var
i:Integer;
s:string;
begin
For i:=0 to WizardForm.COMPONENTCOUNT-1 do
s:=WizardForm.COMPONENTS[i].Name;
end;
Смотрите в отладке переменную s.
Получая имена компонентов, экспериментируйте с ними, это можно так:
Код:
procedure CurPageChanged(CurPageID: Integer);
var
i:Integer;
s:string;
begin
If WizardForm.FindComponent('NextButton') is TButton then
TButton(WizardForm.FindComponent('NextButton')).CAPTION:='wwww';
end;
 
Спасибо всем! Zubr, конечно, не исключено, что у Вас нету времени написать действующий кусок кода для ProgressBar. Думаю, Вы предоставляете нам возможность пораскинуть собственными мозгами, поэкспериментировать, прийти к какому-либо результату. Но если вдруг окажется так, что мы (не программисты) не сможем добиться желаемого результата - Вы найдете все же для нас время? Для начала я не знаю как расписать это:
Код:
//Это правильно хоть?
function CreateThread(i:Integer):Integer;
external 'CreateThread@Kernel32.dll stdcall';

var
Progress: TNewProgressBar;
CurentFile: TNewStatictext;

procedure prgbar_emulate;
var
i:Integer;
begin
For i:=1 to 100 do
begin
Sleep(100);
Progress.Position:=i;
end;
end;

function NextButtonClick(CurPage: Integer): Boolean;
var
i: Integer;
begin
Result := True;
if CurPage = wpInstalling then
begin
//Ничо не получается
end;
end;
 
Вот прототип функции CreateThread:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

Мда... не программеру ее реализовать будет трудновато. Ну а чтобы вам написать код, мне надо отложить свои более срочные задачи и экспериментировать с InnoSetup. Дело в том, что практически ни одну фичу описанную в данной теме, я в своих инсталляторах не использую, мне как то хватает стандартных возможностей InnoSetup. Когда у меня появится возможность, попробую реализовать вам ProgressBar :)
 
Мдя.. Давненько не общались :blink:
Вопрос: в Doom 3 Resurrection Of Evil от 1C, когда пошёл процесс установки, мастер стал значительно меньше и расположился в нижнем левом углу так, что фоновое изображение видно сполна, т.е. уменьшилась и сместилась страница выполнения установки. Вообще такое легко реализовать?
 
Каким образом можно программно в секции
Код:
 определить размер конкретной директории?
 
Привет всем! Да уж... И я тут давненько не бывал. У себя я дополнение для ДУМА так с покупки и не ставил. Ты имеешь в виду, что внешний вид у него был сделан под InstallShield? У меня уже была идея сделать такой инсталлятор, только не совсем получилось. Может рано или поздно что-либо и выйдет. Чтобы изменить размер окна попробуй поизменять следующие компоненты: OuterNotebook(TNewNotebook) и InnerNotebook(TNewNotebook). Можно поменять их размеры, цвет, расположение... Вот набросал по быстрому скрипт:

Код:
[Setup]
AppName=MyProgram
AppVerName=1.0
DefaultDirName={pf}\MyProgram
LicenseFile=license.rtf

[Code]
procedure InitializeWizard();
var
Page: TWizardPage;
StaticText: TNewStaticText;
begin
WizardForm.WizardSmallBitmapImage.Visible:=False;
WizardForm.OuterNotebook.Height:=WizardForm.ClientHeight;{Здесь компонент OuterNotebook растягивается на всю высоту окна инсталлятора}
WizardForm.Bevel.BringToFront;
WizardForm.BackButton.BringToFront;
WizardForm.NextButton.BringToFront;
WizardForm.CancelButton.BringToFront;
WizardForm.WelcomeLabel1.Visible:=False;
WizardForm.WelcomeLabel2.Visible:=False;
WizardForm.WizardBitmapImage.Width:=WizardForm.ClientWidth;
WizardForm.WizardBitmapImage.Height:=WizardForm.ClientHeight;
WizardForm.WizardBitmapImage2.Width:=WizardForm.ClientWidth;
WizardForm.WizardBitmapImage2.Height:=WizardForm.ClientHeight;
WizardForm.FinishedHeadingLabel.Visible:=False;
WizardForm.FinishedLabel.Visible:=False;
Page:=PageFromID(wpLicense);
StaticText:=TNewStaticText.Create(Page);
StaticText.Top:=0;
StaticText.Caption:='Для перемещения по тексту используйте клавиши «PageUp/PageDown».';
StaticText.Parent:=Page.Surface;
WizardForm.LicenseMemo.Color:=clBtnFace;
WizardForm.LicenseLabel1.Align:=alBottom;
WizardForm.LicenseAcceptedRadio.Checked:=True;
WizardForm.LicenseAcceptedRadio.Visible:=False;
WizardForm.LicenseNotAcceptedRadio.Visible:=False;
WizardForm.LicenseMemo.Top:=18;
WizardForm.LicenseMemo.Height:=162;

end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpWelcome then
begin
 If WizardForm.FindComponent('OuterNotebook') is TNewNotebook then
 TNewNotebook(WizardForm.FindComponent('OuterNotebook')).Height:=WizardForm.ClientWidth;
end
if CurPageID=wpLicense then
begin
 If WizardForm.FindComponent('NextButton') is TButton then
 TButton(WizardForm.FindComponent('NextButton')).Caption:='Согласен';
 If WizardForm.FindComponent('CancelButton') is TButton then
 TButton(WizardForm.FindComponent('CancelButton')).Caption:='Нет';
 If WizardForm.FindComponent('OuterNotebook') is TNewNotebook then
 TNewNotebook(WizardForm.FindComponent('OuterNotebook')).Height:=ScaleY(313);
end
if CurPageID=wpSelectTasks then
begin
 If WizardForm.FindComponent('NextButton') is TButton then
 TButton(WizardForm.FindComponent('NextButton')).Caption:='Установить';
end
if CurPageID=wpFinished then
begin
 If WizardForm.FindComponent('OuterNotebook') is TNewNotebook then
 TNewNotebook(WizardForm.FindComponent('OuterNotebook')).Height:=WizardForm.ClientWidth;{То же самое, только на финишной странице}
end
end;

[Messages]
LicenseLabel3=Чтобы продолжить установку, вы должны принять условия этого соглашения. Если вы принимаете эти условия, нажмите «Согласен», чтобы продолжить. Если вы не согластны с условиями соглашения нажмите «Нет», чтобы выйти из программы установки.
 
Guest_Snake_*, спасибо. Даже кое чего нового в этом куске кода узнал:(. Но, видимо, эти компоненты не влияют на изменение самой страницы мастера, а только на находящиеся в ней объекты. Сама страница с индикатором выполнения уменьшается в размере и смещается в левый нижний угол экрана, никак не сами объекты, находящиеся внутри нее.
 
Вот составил скрипт. Все что получилось, но думаю, что существует какой-нибудь более рациональный способ.

Код:
[Code]
procedure InitializeWizard();
begin
//Переносим кнопку "Отмена" на передний план:
 WizardForm.CancelButton.BringToFront;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then
begin
 WizardForm.MainPanel.Visible:=False;
 WizardForm.Bevel1.Visible:=False;
 WizardForm.Width:=ScaleX(400);
 WizardForm.Height:=ScaleY(150);
 WizardForm.Left:=ScaleX(10);
 WizardForm.Top:=ScaleY(10);
 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(154);
 WizardForm.CancelButton.Top:=ScaleY(88);
end
if CurPageID=wpFinished then
begin
 WizardForm.Width:=502;{Размер окна по горизонтали}
 WizardForm.Height:=392;{Размер окна по вертикали}
 WizardForm.Position:=poScreenCenter;
end
end;
 
Guest_Snake_*, благодарю, в принципе то, что нужно :) . Но вот хотелось бы знать, существует ли способ "подогнать" выполнение установки под другие углы без изменения расположения при изменении разрешения экрана? И можно ли вставить и как внешнее изображение на панель любой страницы мастера?
 
А вот как расположить в других углах я сам пока не знаю. Может как-то используются классы TAlign или TPosition. А второй вопрос я не понял.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!