PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 [93] 94 95 96 97 98 99 100 101 102 103 104 105

R.i.m.s.k.y.
05-05-2012, 16:45
Johny777,
1. либо ставь Тру либо удали блок
function InitializeSetup(): Boolean;
begin
Result:=True;
end;

Если InitializeSetup возвращает Фолсе инсталлер закрывается и не пискнет, а булевая функция возвращает Фолсе по-умолчанию если не задано иное.

2. Никак, в твоем архиве много мелких файлов, пока все переберет...
Но вот почему тупит когда файлов нет так это потому что у тебя цикл for i:= 0 to GetArrayLength(ArrayOfMask)-1 гоняется вхолостую
добавь перед ним условие "если есть твои папки тогда уже искать"
Он вообще у тебя коряво сделан, зачем ты в цикле перебираешь когда достаточно и без цикла просто
StartFolder:= ExpandConstant('{src}\..\common\half-life 2\hl2\SAVE'); // задаём папку откуда начинать поиск
StartFolder2:= ExpandConstant('{src}\..\common\half-life 2 episode one\episodic\SAVE'); // задаём папку откуда начинать поиск
StartFolder3:= ExpandConstant('{src}\..\common\half-life 2 episode two\ep2\SAVE'); // задаём папку откуда начинать поиск
StartFolder4:= ExpandConstant('{src}\..\common\portal\portal\SAVE'); // задаём папку откуда начинать поиск
Mask:= '*.sav'; if FindFile(StartFolder) then hl2_SAVE_Checkbox.Enabled := true;
Mask:= '*.sav'; if FindFile(StartFolder2) then ep1_SAVE_CheckBox.Enabled := true;
Mask:= '*.sav'; if FindFile(StartFolder3) then ep2_SAVE_CheckBox.Enabled := true;
Mask:= '*.sav'; if FindFile(StartFolder4) then portal_SAVE_CheckBox.Enabled := true;


кстати я смотрю ты халфу собираешь? у тебя нет случаем HD текстур пака? раньше видел но не удосужился скачать, теперь хочу но не могу найти

Johny777
05-05-2012, 18:21
у тебя нет случаем HD текстур пака? »

если ты о cinematicmod, то нету и не юзаю, тк считаю жуткой отсебятиной и надругательством над халфой
зеркал полно на http://cinematicmod.com/cm_11.php
других не знаю. Раньше они просто текстуры правили мелкими паками (если ты это имеешь в виду), а потом пошло поехало.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Моя версия
Protocol version 15
Exe version 1.0.0.0 (hl2)
Exe build: 13:30:53 May 24 2010 (4216) (420)
вспомни они перенесли весь орандж бокс на сурс 15 протокола в свяpи с портом стима на Мак,
эти версии мы сейчас имеем
У меня чуть старее чем сейчас (ничего существенного после не обновляли зато вернули ави вместо бик видео в интро, а это плохо),
+ добавил это (правит баги после порта валве на обновлённый двиг и добавляем модели из эпизода 2 + HDR) (на что тебе и советую обратить внимание).
http://forums.steampowered.com/forums/showthread.php?t=1093025
вот скринов шлёпнул

http://img844.imageshack.us/img844/6064/d1canals020002.jpg (http://imageshack.us/photo/my-images/844/d1canals020002.jpg/)
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://img513.imageshack.us/img513/2648/d1canals060003.jpg (http://imageshack.us/photo/my-images/513/d1canals060003.jpg/)

ну и мелкие фиксы меню игр, воронки эпизода 1 (этот фикс там же по ссылке на форумы стима).
После этого все 3 игры выглядят одинаково и на данный момент на уровень выше релизного эпизода 2

R.i.m.s.k.y.
05-05-2012, 18:54
Johny777, ну тогда сжимай получше, у меня канал тонкий :)

Johny777
05-05-2012, 19:00
R.i.m.s.k.y.,
будет прохладным летним вечером! :)

insombia
06-05-2012, 14:28
Всем привет,меня долго здесь не было по этому не знаю,выходили ли какие то новые версии iswin7 и isdone?

alert30
06-05-2012, 14:30
insombia, нет.

Johny777
07-05-2012, 03:36
намутил пример (под свои нужды, но думаю кому-то пригодится :))
имеем чекбокс отвечающий за установку например директа.
Если во внешней папке директ есть, то он (чекбокс) активен.
В противном случае не активен
Но тут проблема.
Что если инсталл на диске, а директа рядом нет?
тогда добавляется кнопка "показать"
Указываем и если по указанному пути директ есть, то пути передаются директории "откуда ставить" и "рабочей папке"


[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DirExistsWarning=no
DisableWelcomePage=yes

[ Code]
var
NewButton1: TNewButton;
QuickLaunchIcon: TCheckBox;
Res: Integer;
S: string;

function MakeQuickLaunchIcon: Boolean;
begin
Result:=QuickLaunchIcon.Checked;
end;

procedure DirOnClick(Sender: TObject);
var
DirEditString: String;

begin
DirEditString := WizardForm.DirEdit.Text;
if BrowseForFolder('Выберите папку из списка и нажмите «ОК»', S, True) then
begin
If FileExists(S+'\DXSETUP.exe') then QuickLaunchIcon.Enabled := true;
end;
end;

procedure InitializeWizard();
begin

WizardForm.OuterNotebook.Visible := false;
WizardForm.Color := clWhite;
WizardForm.Bevel.Visible := false;
WizardForm.Caption:= 'DirectX Search Test';

QuickLaunchIcon := TCheckBox.Create(WizardForm);
with QuickLaunchIcon do
begin
Parent := WizardForm;
Caption := 'Установить директ';
Left := ScaleX(100);
Top := ScaleY(160);
Width := ScaleX(130);
Height := ScaleY(25);
TabOrder := 0;
Checked := False;
Enabled := False;
end;

NewButton1 := TNewButton.Create(WizardForm);
with NewButton1 do
begin
Name := 'NewButton1';
Parent := WizardForm;
Left := QuickLaunchIcon.Left + QuickLaunchIcon.Width + ScaleX(10);
Top := QuickLaunchIcon.Top;
Width := ScaleX(160);
Height := ScaleY(20);
Caption := 'указать путь к DXSETUP.exe';
OnClick := @DirOnClick;
end;

If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then QuickLaunchIcon.Enabled := true;

end;


procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpReady then
begin
If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) and (QuickLaunchIcon.Checked = true) then ///// эти две строки имеют приоритет выше, тк идут первыми.
Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res); /// Если пользователь считает, что лучше взять не тот что в комплекте то нижние 2 поменять с этими двумя,
end
else /// добавил, тк если снаружи видит и в пути есть устанавливал бы 2 раза
begin
If FileExists(S+'\DXSETUP.exe') and (QuickLaunchIcon.Checked = true) then
Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
end;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm := False;
end;

El Sanchez
07-05-2012, 15:38
намутил пример (под свои нужды, но думаю кому-то пригодится »
Johny777, пара замечаний. Начнем сверху вниз:

Процедура DirOnClick. Кликаем кнопку, выбираем папку с директом, видим, что чекбокс стал активным, радуемся, кликаем еще раз, выбираем папку, где нет директа, видим, что чекбокс все равно активен, печалимся и меняем:

If FileExists(S+'\DXSETUP.exe') then QuickLaunchIcon.Enabled := true;
на
QuickLaunchIcon.Enabled := FileExists(S+'\DXSETUP.exe');

Процедура InitializeWizard. При создании чекбокса свойство Enabled напиши как

Enabled := FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe'));
...
, а строку If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then QuickLaunchIcon.Enabled := true удалить

У тебя это не ошибка, но строчкой кода меньше.
Процедура CurPageChanged. Удалить полностью. На wpReady {src}-овый директ будет запущен, хотя на wpReady ничего не должно запускаться. Вернись на страницу назад и снова на wpReady, снова пойдет установка. На остальных страницах при наличии директа в S тоже начнется установка. Сколько там страниц у Inno? И на каждой пойдет установка директа, поэтому CurPageChanged не годится. Запуск директа должен быть не раньше, чем пользователь нажмет кнопку Установить. Это либо использовать NextButtonClick (CurPageID = wpReady), либо CurStepChanged (CurStep=ssInstall).


function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpReady: begin
if QuickLaunchIcon.Checked then
begin
if FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then
Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res)
else if FileExists(S+'\DXSETUP.exe') then
Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
end;
end;
end;
end;

//либо
procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: begin
if QuickLaunchIcon.Checked then
begin
if FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then
Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res)
else if FileExists(S+'\DXSETUP.exe') then
Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
end;
end;
end;
end;

Johny777
07-05-2012, 15:48
El Sanchez,
Спасибо за исправления!
Стало ещё проще и удобнее.
поэтому CurPageChanged не годится »
И не думал использовать. Только для демонстрации, чтоб инсталл не перезапускать
В скрипте халфы всё это выполняется на шаге ssPostInstall

вот так (пока ещё поиск директа и прочего не добавлял)

procedure CurStepChanged(CurStep: TSetupStep);
var
res: integer;
begin
/// проценты установки /// часть 2 из 4 /// начало
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
/// конец
if CurStep = ssPostInstall then
begin
s2_hl2:= hl2_Launch_Edit.Text;
s1_hl2:= ExpandConstant('-steam -game hl2 -appid 220');
if CurStep = ssPostInstall then
begin
if hl2_icon_Checkbox.Checked then
CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2.lnk'), '',
ExpandConstant('{app}\common\half-life 2\hl2.exe'),s1_hl2 + s2_hl2, ExpandConstant('{app}\common\half-life 2'), ExpandConstant('{app}\common\half-life 2\hl2.ico'), 0, SW_SHOWNORMAL);
end;
s2_ep1:= ep1_Launch_Edit.Text;
s1_ep1:= ExpandConstant('-steam -game episodic -appid 380');
begin
if hl2_ep1_icon_Checkbox.Checked then
CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2 Episode One.lnk'), '',
ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'),s1_ep1 + s2_ep1, ExpandConstant('{app}\common\half-life 2 episode one'), ExpandConstant('{app}\common\half-life 2 episode one\hl2.ico'), 0, SW_SHOWNORMAL);
end;
s2_ep2:= ep2_Launch_Edit.Text;
s1_ep2:= ExpandConstant('-steam -game ep2 -appid 420');
begin
if hl2_ep2_Icon_CheckBox.Checked then
CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2 Episode Two.lnk'), '',
ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'),s1_ep2 + s2_ep2, ExpandConstant('{app}\common\half-life 2 episode two'), ExpandConstant('{app}\common\half-life 2 episode two\hl2.ico'), 0, SW_SHOWNORMAL);
end;
s2_portal:= portal_Launch_Edit.Text;
s1_portal:= ExpandConstant('-steam -game portal -appid 400');
begin
if portal_Icon_CheckBox.Checked then
CreateShellLink(ExpandConstant('{commondesktop}\Portal.lnk'), '',
ExpandConstant('{app}\common\portal\hl2.exe'),s1_portal + s2_portal, ExpandConstant('{app}\common\portal'), ExpandConstant('{app}\common\portal\portal.ico'), 0, SW_SHOWNORMAL);
end;
/// задачи
If hl2_borealis_CheckBox.Checked then /// Aurora Borealis
begin
ExtractTemporaryFile('Aurora_Borealis.exe');
Exec(ExpandConstant('{tmp}\Aurora_Borealis.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
/// обновления
If hl2_update_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Half-Life 2 ///');
Exec(ExpandConstant('{src}\outer\update\hl2_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
If ep1_update_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Half-Life 2 Episode One ///');
Exec(ExpandConstant('{src}\outer\update\hl2_ep1_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
If ep2_update_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Half-Life 2 Episode Two ///');
Exec(ExpandConstant('{src}\outer\update\hl2_ep2_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
If portal_update_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Portal ///');
Exec(ExpandConstant('{src}\outer\update\portal_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
/// директ и прочее
If DirectX_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Устанавливается DirectX ///');
Exec(ExpandConstant('{src}\outer\DirectX\DXSETUP.exe'), '/silent', ExpandConstant('{src}\outer\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
If VisualC_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Устанавливается VisualC++ ///');
Exec(ExpandConstant('{src}\outer\VCRedist\vcredist_x86.exe'), '/q', ExpandConstant('{src}\outer\VCRedist'), SW_SHOW, ewWaitUntilTerminated, Res);
end;

If Font_Checkbox.Checked then
begin
FilesMemo.Lines.Add('/// Извлекаются шрифты ///');

ExtractTemporaryFile('BOXROCKET.ttf');
ExtractTemporaryFile('fontinst.exe');
ExtractTemporaryFile('fontinst.inf');
ExtractTemporaryFile('HALFLIFE2.ttf');
ExtractTemporaryFile('HL2crosshairs.ttf');
ExtractTemporaryFile('HL2EP2.ttf');
ExtractTemporaryFile('marlett.ttf');

FilesMemo.Lines.Add('/// Устанавливаются шрифты ///');
Exec(ExpandConstant('{tmp}\fontinst.exe'), '/q', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
end;
end;
end;


где FilesMemo это мемо со списоком извлекаемых файлов на странице установки

wertulll
07-05-2012, 18:15
ребятушки подскажите пожалуйста как правильно текстурировать кнопку отмена на деинсталяторе

[Setup]
SetupIconFile=1.ico
Diskspanning=yes
AppName=S.T.A.L.K.E.R. Зов Припяти.
AppVerName=S.T.A.L.K.E.R. Зов Припяти.
DefaultDirName={pf}\S.T.A.L.K.E.R. Зов Припяти.
DefaultGroupName=S.T.A.L.K.E.R. Зов Припяти.
DirExistsWarning=no
AppVersion=1.0
OutputBaseFilename=setup
OutputDir=.
VersionInfoCopyright=Me
AppPublisher=Square Enix
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp
UninstallDisplayIcon=1.ico
ShowTasksTreeLines=true

[UninstallDelete]
Type: filesandordirs; Name: {app}


[Languages]
Name: russian; MessagesFile: Files\Russian.isl

[Tasks]
Name: desktopicon; Description: Создать значок на Рабочем столе; GroupDescription: Дополнительные значки:
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить Microsoft DirectX; Flags: unchecked
Name: Redist\VCCheck; Description: Установить Microsoft Visual C++ Redist; Flags: unchecked


[Files]
Source: Files\button.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\Finishe.bmp; DestDir: {tmp}; Flags: dontcopy
Source: "Files\WizardSmallImage.bmp"; DestDir: "{app}"; Attribs: hidden system;



[Icons]
Name: "{group}\Запустить"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon


[Run]
Filename: {src}\Redist\DirectX\DXSETUP.exe; StatusMsg: Обновление компонентов DirectX...; Tasks: Redist\DirectXCheck; Flags: waituntilterminated; Parameters: "/silent";
Filename: "{src}\Redist\vcredist_x86.exe"; StatusMsg: "Установка Microsoft Visual C++ Redist..."; Tasks: Redist\VCCheck; Flags: waituntilterminated; Parameters: "/Q";


[Registry]
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Version"; ValueType: String; ValueData: "1.0";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Language"; ValueType: String; ValueData: "Russian";



[code]
const
ButtonWidth = 80;
ButtonHeight = 23;
Color = clblack;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;
bidbtnCancelUnpacking = 5;

var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;


procedure InitializeWizard1();
begin
NeedSize := 8610;
WizardForm.DiskSpaceLabel.Hide;

NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;

WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;
ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent
ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]
with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end;

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]
ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
WizardForm.NextButton.Enabled:= True;
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
WizardForm.NextButton.Enabled:= False;
UpdateButtons()
end;

procedure ButtonTextures();
begin
WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure InitializeWizard2();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.FilenameLabel.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNameLabel.Color:=Color;
WizardForm.UserInfoNameEdit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;
end;

var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel: TLabel;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=True;
end;

procedure Labels();
begin
WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
WelcomeLabel1.SetBounds(Left, Top, Width, Height);
WelcomeLabel1.Left:=240
WelcomeLabel1.Top
WelcomeLabel1.Width:=230
WelcomeLabel1.Height:=200
WelcomeLabel1.Font:= WizardForm.WelcomeLabel1.Font
WelcomeLabel1.Font.Color:= clWhite;
WelcomeLabel1.Transparent:= True;
WelcomeLabel1.WordWrap:= true;
WelcomeLabel1.Caption:= WizardForm.WelcomeLabel1.Caption;
WelcomeLabel1.Parent:= WizardForm.WelcomePage

WelcomeLabel2:= TLabel.Create(WizardForm);
WelcomeLabel2.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
WelcomeLabel2.SetBounds(Left, Top, Width, Height);
WelcomeLabel2.Left:=240
WelcomeLabel2.Top:=100
WelcomeLabel2.Width:=230 //СЖИМАЕТ ТЕКСТ
WelcomeLabel2.Height
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

PageNameLabel:= TLabel.Create(WizardForm)
with WizardForm.PageNameLabel do
PageNameLabel.SetBounds(Left, Top, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite; //цвет надписи
PageNameLabel.Parent:= WizardForm.MainPanel;


FinishedHeadingLabel:= TLabel.Create(WizardForm);
FinishedHeadingLabel.AutoSize:= False;
with WizardForm.FinishedHeadingLabel do
FinishedHeadingLabel.SetBounds(ScaleX(30), ScaleY(20), ScaleX(200), ScaleY(220));
FinishedHeadingLabel.Left:=240
FinishedHeadingLabel.Top
FinishedHeadingLabel.Width:=230
FinishedHeadingLabel.Height:=200
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(ScaleX(30), ScaleY(120), ScaleX(130), ScaleY(220));
FinishedLabel.Left:=240
FinishedLabel.Top:=100
FinishedLabel.Width:=230 //СЖИМАЕТ ТЕКСТ
FinishedLabel.Height
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;

procedure InitializeWizard3();
Begin
ButtonTextures();
Labels();
ExtractTemporaryFile('Finishe.bmp');
WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finishe.bmp'));
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Procedure CurPageChanged2(CurPageID: Integer);
Begin
UpdateButtons();
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
begin
WizardForm.NextButton.Enabled := False;
ButtonLabel[bidNext].Enabled := False;
ButtonPanel[bidNext].Enabled := False;
end;
end;
end;

procedure InitializeUninstallProgressForm;
begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{tmp}\WizardSmallImage.bmp'), False);
UninstallProgressForm.Color:=Color;
UninstallProgressForm.InnerPage.Color:=Color;
UninstallProgressForm.MainPanel.Color:=Color;
UninstallProgressForm.PageNameLabel.Color:=Color;
UninstallProgressForm.PageDescriptionLabel.Hide;
UninstallProgressForm.PageNameLabel.Font.Color:=clWhite;
UninstallProgressForm.PageNameLabel.Width:=ScaleX(300);
UninstallProgressForm.StatusLabel.Color:=Color;
UninstallProgressForm.StatusLabel.Font.Color:=clWhite;


with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardSmallImage.bmp'));
SetBounds(ScaleX(335), ScaleY(2), ScaleX(160), ScaleY(50));
end;
end;

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
InitializeWizard3();
end;

procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged2(CurPageID);
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;
end;

Johny777
07-05-2012, 18:45
wertulll,
попробуй так
(по двум секциям раскидай)

[Files]
Source: Files\button.bmp; DestDir: {app}; Attribs: hidden system; /// копируем текстуру помимо как в темп(оттуда всё сотрётся после установки) ещё и в директорию установки и скрываем

[ code]
procedure InitializeUninstallProgressForm;
begin
FileCopy(ExpandConstant('{app}\button.bmp'), ExpandConstant('{tmp}\button.bmp'), False); /// принцип такой же как и у тебя, только не с картинкой для деинсталятора а с текстурой кнопки
LoadButtonImage(UninstallProgressForm.CancelButton) /// грузим текстуру для кнопки "отмены" окна удаления
end;

wertulll
07-05-2012, 19:35
Johny777,
ошибка при удалении

Johny777
07-05-2012, 23:49
wertulll,
там ведь кнопка только заблокирована?
если да, то не проще ли просто создать картинку, а кнопку скрыть?

bear!
08-05-2012, 03:13
Интересует такой вопрос — какие константы путей использовать, чтобы инсталлятор находил определенный файл или директорию у пользователя, и устанавливал туда нужные файлы?
Нужно для русификатора. Часто кстати видел, когда инсталлятор (русификатор или патч, к примеру) указывал путь, который я сам ранее назначал, ну или к примеру диск с этими файлами.

alert30
08-05-2012, 04:39
bear!, файлы русификации не просто, а вот если русификаторы засунуто в инсталлятор PatchWise Free; то смогу положить код.

bear!
08-05-2012, 06:20
Ну в смысле не просто? Эверест что ли покорить нужно. Видел я подобное и на Inno Setup.
Это все ради удобства, пользователь и сам может указать директорию, куда нужно установить, но просто так эффектней и удобней наверное. Поэтому если есть возможность рассказать подробней об этом, то было бы отлично.

wertulll
08-05-2012, 07:42
Johny777, последовал вашему совету :yes:

wertulll
08-05-2012, 07:47
подскажите код для отображения этого

Johny777
08-05-2012, 10:51
подскажите код для отображения этого »
насчёт лейбла с отображением прошедшего времени не знаю
а вот с процентами и оставшимся временем дела обстоят хорошо!



[Setup]
AppName=ProgressBar + TimeLeft v2 by South.Tver
AppVerName=ProgressBar + TimeLeft v2 by South.Tver
DefaultDirName={pf}\ProgressBar + TimeLeft v2
OutputBaseFilename=setup

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs
Source: {fonts}\*; DestDir: {app}; Flags: external;

Source: CallbackCtrl.dll; Flags: dontcopy
Source: InnoCallback.dll; Flags: dontcopy


[ Code]
type
TPBProc = function (h:hWnd;Msg,wParam,lParam:Longint):Longint;
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord); /// проценты

var
TimeLeftLabel : TLabel;

PBOldProc : Longint;
WFCaption : string;
eTime, sTime : DWORD;
///////////////////////////////// проценты /// начало
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
/////////////////////////////////////////// конец
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

///////////////////////////////// проценты /// начало
Function NumToStr(Float: Extended): String;
begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
end;
End;
//////// конец



function LongintToStringTime(t:Longint):string;
var
h,m,s:integer;
begin
h:=t div 3600;
t:=t-h*3600;
m:=t div 60;
s:=t-m*60;
Result:='';
if h>0 then Result:=Result+IntToStr(h)+' ч. ';
if (m>0) or (h>0) then Result:=Result+IntToStr(m)+' мин. ';
if (m>0) or (h>0) or (s>0) then Result:=Result+IntToStr(s)+' сек.';
end;

function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var
lt:Longint;
dt,at,pr,i1,i2:Extended;
p:string;
tc:DWORD;
begin
Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
if (Msg=$402) and (WizardForm.ProgressGauge.Position>WizardForm.ProgressGauge.Min) then begin
i1:=WizardForm.ProgressGauge.Position-WizardForm.ProgressGauge.Min;
i2:=WizardForm.ProgressGauge.Max-WizardForm.ProgressGauge.Min;

tc:=GetTickCount;
if (tc-eTime)>=1000 then begin //пересчитывем время оставшееся до конца установки не чаще, чем раз в 1 секунду
dt:=(tc-sTime)/1000;
at:=i2*dt/i1;
lt:=Round(at-dt)
TimeLeftLabel.Caption:='Осталось - '+LongintToStringTime(lt);
eTime:=tc;
end;

pr:=i1*100/i2;
p:=' - ['+Format('%f',[pr])+'%]';
StringChange(p,',','.');
end;
end;

procedure AllCancel;
begin
SetWindowLong(WizardForm.ProgressGauge.Handle,-4,PBOldProc);
TimeLeftLabel.Free;
PercentsLabel.Free; /// проценты
end;

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
Result:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: begin

MsgBox('Чтобы продлить время установки будут скопированы шрифты и справки',mbInformation,MB_OK); /// чтоб не пугались

PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4)); /// проценты

TimeLeftLabel:=TLabel.Create(nil);
with TimeLeftLabel do begin
Parent:=WizardForm.InstallingPage;
AutoSize:=True;
SetBounds(WizardForm.ProgressGauge.Left + ScaleX(250),WizardForm.ProgressGauge.Top + ScaleY(30),ScaleY(80),ScaleY(21));
end;

///////////////////// проценты /// начало
PercentsLabel:= TLabel.Create(nil);
with PercentsLabel do
begin
SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
AutoSize:= True;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
/// конец


sTime:=GetTickCount;
eTime:=sTime;

PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PBProc,4));
end;
ssPostInstall: AllCancel;
end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
if CurPageID=wpInstalling then begin
Confirm:=False;
Cancel:=ExitSetupMsgBox;
if Cancel then AllCancel;
end;
end;

/////// проценты /// начало
procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;
///////// конец


сделал так что ты можешь стереть проценты и оставить только время установки
немного изменил сами "проценты" (скопипастил создание лейбла у того же примера с которым совмещал :))

1. пример процентов из InnoSetup FAQ
2. "оставшееся время" - это пример ProgressBar + TimeLeft v2 by South.Tver (....\Inno Setup 5\Modules\South\botva2_example\progressbar+TimeLeft.iss), но без ботвы

*(перед тем как выложить проверил)

архив с библиотеками

wertulll
08-05-2012, 12:32
Johny777, спасибо !!!решил вопрос через ISDone :)




© OSzone.net 2001-2012