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

  • Автор темы Kindly
  • Дата начала
Статус
Закрыто для дальнейших ответов.
F

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;
не коректно отображается битмап ?
 
K

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;
 
S

Sn

Здраствуйте. Я хочу задать вам, Zubr, целых три вопроса:

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

Буду очень благодарен если вы поможете мне с их решением!
Отдельное большое спасибо Kindly за помощь!
 
S

Sn

<!--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]

Немного непонятна эта часть скрипта. Напиши, на какой форме ты хочешь создать рисунок!
 
S

Sn

Чуть не забыл. Если ты, fiot, хочешь создать рисунок на странице инсталлятора, также опиши где конкретно должен располагаться рисунок и его размеры. Возможно я знаю ответ на твой вопрос.
 
S

Sn

Позволю себе, 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'а.
 
Z

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). Полный код писать нет времени.
 
S

Sn

Спасибо, zubr, за скрипт с рисунком. С progress-bar'ом еще предстоит разобраться. Но возникает другой маленький вопросик. Вкратце поясните, что означают эти размеры: width:=GetSystemMetrics(61) и height:=GetSystemMetrics(62).
При использовании размеров 61х62 была видна Панель задач, заменив их на 61х60, получил Fullscreen.
 
Z

zubr

Функция API GetSystemMetrics возвращает информацию о рабочей среде Windows. С параметрами SM_CXMAXIMIZED = 61 и SM_CYMAXIMIZED = 62 функция возвращает размеры развернутого окна по умолчанию. 60 - это вы применили параметр SM_CYMAXTRACK - максимальный размер Y при ручном масштабировании. Если вы хотите, чтобы фоновое окно закрывало и панель задач, корректнее было бы применить параметры SM_CXSCREEN=0, SM_CYSCREEN=1.
 
S

Sn

Спасибо, zubr, что объяснили!
У меня еще оди мелкий косметический вопрос. Есть ли возможность изменить компонент InnerPage(например, добавить на него какие-нибудь объекты), у меня получалось только изменить цвет.
Также мне интерестно(InnerPage есть на всех страницах кроме wpWelcome и wpFinished), в середине InnerPage находится какое-то поле, на котором и расположены различные объекты(выбор папки, компонентов и т.д.). Вот как раз название этого поля я и не знаю. Есть ли возможность изменить размеры этого поля, например как и на странице приветствия растянуть его во все окно инсталлятора?
 
Z

zubr

Судя по всему 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;
 
K

Kindly

Спасибо всем! 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;
 
Z

zubr

Вот прототип функции CreateThread:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

Мда... не программеру ее реализовать будет трудновато. Ну а чтобы вам написать код, мне надо отложить свои более срочные задачи и экспериментировать с InnoSetup. Дело в том, что практически ни одну фичу описанную в данной теме, я в своих инсталляторах не использую, мне как то хватает стандартных возможностей InnoSetup. Когда у меня появится возможность, попробую реализовать вам ProgressBar :)
 
K

Kindly

Мдя.. Давненько не общались :blink:
Вопрос: в Doom 3 Resurrection Of Evil от 1C, когда пошёл процесс установки, мастер стал значительно меньше и расположился в нижнем левом углу так, что фоновое изображение видно сполна, т.е. уменьшилась и сместилась страница выполнения установки. Вообще такое легко реализовать?
 
G

Guest_

Каким образом можно программно в секции
Код:
 определить размер конкретной директории?
 
G

Guest_Snake_*

Привет всем! Да уж... И я тут давненько не бывал. У себя я дополнение для ДУМА так с покупки и не ставил. Ты имеешь в виду, что внешний вид у него был сделан под 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=Чтобы продолжить установку, вы должны принять условия этого соглашения. Если вы принимаете эти условия, нажмите «Согласен», чтобы продолжить. Если вы не согластны с условиями соглашения нажмите «Нет», чтобы выйти из программы установки.
 
K

Kindly

Guest_Snake_*, спасибо. Даже кое чего нового в этом куске кода узнал:(. Но, видимо, эти компоненты не влияют на изменение самой страницы мастера, а только на находящиеся в ней объекты. Сама страница с индикатором выполнения уменьшается в размере и смещается в левый нижний угол экрана, никак не сами объекты, находящиеся внутри нее.
 
G

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;
 
K

Kindly

Guest_Snake_*, благодарю, в принципе то, что нужно :) . Но вот хотелось бы знать, существует ли способ "подогнать" выполнение установки под другие углы без изменения расположения при изменении разрешения экрана? И можно ли вставить и как внешнее изображение на панель любой страницы мастера?
 
G

Guest_Snake_*

А вот как расположить в других углах я сам пока не знаю. Может как-то используются классы TAlign или TPosition. А второй вопрос я не понял.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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