Войти

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


Страниц : 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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 [145] 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

El Sanchez
29-08-2011, 18:07
Объясните, почему если из строчки Name: nomer0; Description: Все222; GroupDescription: w; MinVersion: 0,1; Check: isTaskChecked('nomer0'); Components: nomer0; удалить Components: nomer0; то становится видно зависимые задачи у nomer1, если оставить - нет »
Sollar, потому что зависимые задачи/компоненты нужно писать сразу после основной, а не через несколько строчек, да и R.i.m.s.k.y. верно говорит - лишние проверки да и вообще строки. isTaskChecked - кастомная функция? Или спутали с IsTaskSelected? Хотя бы должно быть так:

[Types]
Name: Ros; Description: Рос
Name: Other; Description: Другое

[Components]
;компоненты Другое
Name: nomer0; Description: Все; Types: Other; Flags: disablenouninstallwarning checkablealone;
Name: ex1; Description: Alcohol52; Types: Other; Flags: disablenouninstallwarning
Name: ex2; Description: BullzipPDFPrinter; Flags: disablenouninstallwarning; Types: Other;
Name: ex3; Description: FoxitReader; Types: Other; Flags: disablenouninstallwarning;
;компоненты Рос
Name: nomer1; Description: Все; Types: Ros; Flags: disablenouninstallwarning checkablealone;
Name: ex4; Description: 7zip; Types: Ros; Flags: disablenouninstallwarning;

[Tasks]
Name: nomer1; Description: Все; GroupDescription: ж; MinVersion: 0,1; Components: nomer1
Name: nomer1\zip7; Description: 7zip; GroupDescription: ж; Components: ex4; MinVersion: 0,1
Name: nomer0; Description: Все222; GroupDescription: w; MinVersion: 0,1; Components: nomer0
Name: nomer0\Alcohol52; Description: Alcohol52; GroupDescription: w; Components: ex1; MinVersion: 0,1
Name: nomer0\FoxitReader; Description: FoxitReader; GroupDescription: w; Components: ex3; MinVersion: 0,1
Name: nomer0\BullzipPDFPrinter; Description: BullzipPDFPrinter; GroupDescription: w; Components: ex2; MinVersion: 0,1



если инно компилит или ворд красненьким не подчеркивает не значит что ошибки нет »
R.i.m.s.k.y., этт точно.

Mafia_forever
29-08-2011, 18:12
R.i.m.s.k.y. как можно теперь вместо

C\Program Files\Inno Setup 5\bass.dll

поставить это

Общий Размер 800мб... Распаковано 80мб - 5%

Mafia_forever
29-08-2011, 21:19
потом как можно текст приветствия и последнюю страницу текст чтоб был не с правой сторонны как обычно а был растянут на весь инсталятор

R.i.m.s.k.y.
29-08-2011, 21:25
Mafia_forever, не знаю, мне это неинтересно, недаром я в подпись вынес оформление в инно - пустая трата времени, головняка много, а толку мало

Mafia_forever
29-08-2011, 22:13
R.i.m.s.k.y.
ладно потом узнаю а обьясни что такое РЕПАК а то я не непонимаю

kindza811
29-08-2011, 22:16
Здравствуйте,помогите мне сделать такой же инсталлятор как показано на скриншотах

http://fastpic.ru/view/7/2010/0613/506960ad0e127f5b499f18e6fd934a18.jpg.html

http://fastpic.ru/view/7/2010/0613/325c048e13648a443cf7941076032b8f.jpg.html

http://fastpic.ru/view/7/2010/0613/9130b8cb2aeb1b83fabf65032e310ed9.jpg.html

kindza811
29-08-2011, 22:19
http://forum.oszone.net/attachment.php?attachmentid=69248&stc=1&d=1314641926
http://forum.oszone.net/attachment.php?attachmentid=69249&stc=1&d=1314641926

R.i.m.s.k.y.
29-08-2011, 22:20
Mafia_forever, нашел епт гугель :)
к твоему сведению яндекс давно уже починили

Репак - это перепакованное нечто с разными целями и очевидностями , отличающееся от оригинала в разные стороны полезности
К примеру можно взять дистр вишера 1, грамотно содрать регшотом, добавить к нему приключения что вышли, книги, музыку, ролики и тп что не вошло в оффиздание, все патчи и носд - будет суперрепак (у меня такой, да!)
А можно взять оригинал CoD и повырезать из него все дороги кроме русской, пережать в нем видео в три раза меньше, звук в 56кбит с целью меньшего размера - будет гетторепак
А можно взять идиотский формат блурея и без пережатия запихать все в один файл-контейнер-матрешку, что значительно юзабельнее, по пути сняв заSHITу - тоже будет репак, ремуксом называется
Далее берется ремукс и палка-руко-выпрямлялка, видео кодится до приемлемого размера с меньшим разрешением кадра с целью утягивания по открытым каналам связи, сиречь интернет - сие зовется СЧЕГОСОДРАЛИ_рип, если драли с блурика - блюрейрип.

в таком вот акцепте

вот поэтому я и не долюбливаю оформлялщиков, акцентируются на эффектном внешнем виде, а после скачки не работает установка, на 40-60% ошибки недостающих файлов
такими геттокодерами инно понимается как цель самовыражения, наподобие забора, отметимся красиво и похрену что за забором

kindza811, а чей-то на твои картинки антивирь мой ругается как Каддафи на НАТО? только ты не думай что я решил помочь

Rikill
29-08-2011, 22:42
kindza811, этот скрипт защищён авторскими правами, тебе его никто не даст.

Mafia_forever
29-08-2011, 23:12
R.i.m.s.k.y. надо подумать очень долго я почти считай сделал свой инсталятор только не магу найти код для musicbutton.png

insombia
29-08-2011, 23:31
Mafia_forever innoultra.ru там есть почти все!

Mafia_forever
30-08-2011, 00:15
insombia у меня на инстляторе во время распаковки ARC архива прогресс не наполняется что сделать надо не знаешь

Raf-9600
30-08-2011, 01:10
У меня есть вот такой батник:for /R data\local\sfx\Act1 %%i in (*.ogg) do oggdec.exe "%%i"Ктонить подскажет, как его перенести в секцию [Run]? В смысле чтоб функции прописанные выше, выполнялись навпрямую, без батников.

El Sanchez
30-08-2011, 09:20
Ктонить подскажет, как его перенести в секцию [Run]? В смысле чтоб функции прописанные выше, выполнялись навпрямую, без батников. »
Raf-9600,

[Run]
Filename: {cmd}; Parameters: "/c for /R ""полный путь до data\local\sfx\Act1"" %i in (*.ogg) do oggdec.exe ""%i"""; Flags: runhidden

R.i.m.s.k.y.
30-08-2011, 09:43
El Sanchez, я бы добавил на конце waituntilterminated и WorkingDir

[Run]
Filename: {cmd}; Parameters: "/c for /R ""полный путь до data\local\sfx\Act1"" %i in (*.ogg) do oggdec.exe ""%i"""; WorkingDir: """полный путь до data\local\sfx\Act1"""; StatusMsg: "немножко уличной магии"; Flags: runhidden waituntilterminated

vint56
30-08-2011, 09:51
Raf-9600, есть такой код от Shegorat может пригодится
[Setup]
AppName=RecodeOgg
AppVerName=RecodeOgg
OutputDir=.
OutputBaseFilename=RecodeOgg
DefaultDirName={pf}\RecodeOgg
AppendDefaultDirName=False
DisableDirPage=True

[files]
Source: oggdec.exe; DestDir: {app};
Source: oggs\*; DestDir: {app};
Source: oggs\*; DestDir: {app}\Data;
[code]
var
Files: Array of String;
S: String;
n: Integer;

Function StringToArray(Text, Cut: String): array of String; var i, k: Integer;
Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k:= Pos(Cut,Text);
if k = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i:= GetArrayLength(Result) -1;
if k = 0 then
Result[i]:=Text
else begin
Result[i]:= Copy(Text, 1, k -1); Delete(Text, 1, Length(Result[i]) + Length(Cut));
end;
Until Length(Text) * k = 0;
End;

procedure FindFiles(FromDir: String; Mask: String);
var FSR, DSR: TFindRec; FindResult: Boolean;
begin
FindResult:= FindFirst(AddBackslash(FromDir)+Mask, FSR)
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
S:= S + AddBackslash(fromDir) + FSR.Name +'|';
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR)
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
FindFiles(AddBackSlash(FromDir)+DSR.Name, Mask)
end;
FindResult:= FindNext(DSR);
end;
FindClose(FSR); FindClose(DSR)
end;

procedure RecodeOgg;
var ResultCode: integer; CurFile: String;
begin
FindFiles(ExpandConstant('{app}'), '*.ogg') //Находим все файлы по маске, в выбранной папке
Files:= StringToArray(S, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files)-1; //Получаем кол-во файлов
WizardForm.ProgressGauge.Position:=0
for n:=(GetArrayLength(Files)-1) downto 0 do begin
CurFile:= Files[n]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}')), '')
Exec(ExpandConstant('{app}\oggdec.exe'), '-Q '+AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files[n]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files[n]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\oggdec.exe'))
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then RecodeOgg;
end;

Sollar
30-08-2011, 11:06
El Sanchez, как сделать чтобы событие наступало сразу после первого клика?
если так, то только после второго

procedure TaskOnClick(Sender: TObject);
var
i:integer;
begin
if IsTaskSelected('nomer1') or IsTaskSelected('nomer0') then
begin
for i:=2 to WizardForm.TasksList.Items.Count-1 do
begin
WizardForm.TasksList.ItemEnabled[i]:= False;
end;
end;
end;

procedure InitializeWizard();
begin
WizardForm.TasksList.OnClick := @TaskOnClick;
end;


а если так, то только после перехода на другую страницу

procedure CurPageChanged(CurPageID: Integer);
var
i: integer;
begin
if CurPageID = wpSelectTasks then
begin
if IsTaskSelected('nomer1') or IsTaskSelected('nomer0') then
begin
for i:=2 to WizardForm.TasksList.Items.Count-1 do
begin
WizardForm.TasksList.ItemEnabled[i]:= False;
end;
end;
end;
end;

Raf-9600
30-08-2011, 15:08
Ктонить может объединить код конвертирования OGG
[C0de]
var
Files: Array of String;
S: String;
n: Integer;

Function StringToArray(Text, Cut: String): array of String; var i, k: Integer;
Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k:= Pos(Cut,Text);
if k = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i:= GetArrayLength(Result) -1;
if k = 0 then
Result[i]:=Text
else begin
Result[i]:= Copy(Text, 1, k -1); Delete(Text, 1, Length(Result[i]) + Length(Cut));
end;
Until Length(Text) * k = 0;
End;

procedure FindFiles(FromDir: String; Mask: String);
var FSR, DSR: TFindRec; FindResult: Boolean;
begin
FindResult:= FindFirst(AddBackslash(FromDir)+Mask, FSR)
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
S:= S + AddBackslash(fromDir) + FSR.Name +'|';
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR)
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
FindFiles(AddBackSlash(FromDir)+DSR.Name, Mask)
end;
FindResult:= FindNext(DSR);
end;
FindClose(FSR); FindClose(DSR)
end;

procedure RecodeOgg;
var ResultCode: integer; CurFile: String;
begin
FindFiles(ExpandConstant('{app}'), '*.ogg') //Находим все файлы по маске, в выбранной папке
Files:= StringToArray(S, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files)-1; //Получаем кол-во файлов
WizardForm.ProgressGauge.Position:=0
for n:=(GetArrayLength(Files)-1) downto 0 do begin
CurFile:= Files[n]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}')), '')
Exec(ExpandConstant('{app}\oggdec.exe'), '-Q '+AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files[n]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files[n]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\oggdec.exe'))
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then RecodeOgg;
end;
с кодом

#define TIME_FOR_VIEW 10

[C0de]
procedure ChangeCaption(str: string);
begin
WizardForm.StatusLabel.Caption:= str;
end;

function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';

function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;

NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel: TLabel;
n: Integer;
VolumeName, FileSystemName: String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
ListBox: TListBox;
StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
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)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard1();
begin
with WizardForm do begin
with MainPanel do
Height := Height - 1;
with WizardSmallBitmapImage do begin
Left := 0;
Top := 0;
Height := 58; //Размер рисунка
Width := 497; //
end;
with PageNameLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
with PageDescriptionLabel do begin
Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
Left := Left + 497; //
end;
end;
end;

procedure InitializeWizard2();
begin
NeedSize := 2500; //Здесь указывается место для приложения
WizardForm.DiskSpaceLabel.Hide;
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= []
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

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

procedure InitializeWizard3();
begin
WizardForm.TYPESCOMBO.Visible:= false;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(200);
InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'Описание';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'Переместите ваш указатель мыши на компоненты чтобы увидеть их описание.';
Info.WordWrap := true;
//Впишыте описание компонентов
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'Выберите язык внутриигрового текста;'+ //Text
'Немецкий текст;'+
'Испанский текст;'+
'Французский текст;'+
'Итальянский текст;'+
'Польский текст;'+
'Выберите этот пункт, если вы хотите установить внутриигровую музыку. Учтите, что её можно отключить даже после инсталляции, в меню опций игры.;' // Music
);
end;



function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;

const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

procedure InitializeWizard4();
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end;
end;

procedure CurPageChanged2(CurPageID: Integer);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
end;


//Проверка на оставшыеся файлы
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
if DirExists(ExpandConstant('{app}')) then
if ExpandConstant('{language}') = 'ua' then
case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 +
'"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 +
'"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 +
'"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK);

IDCANCEL:;
end
else
if ExpandConstant('{language}') = 'ru' then
case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);

IDCANCEL:;
end
else
case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 +
'"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 +
'"No" to open the directory with explorer to delete the files manually.'#13#13 +
'"Cancel" to do nothing and delete the directory later manually.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK);

IDCANCEL:;
end
end
end
end;




const
n1=28; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..N1] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
var
A,b,c: string;
i,j,k:byte;
begin
For i:=1 to X do A:=A+chr(i);
B:='';
For i:=1 to X do begin
j:=Random(Length(A)-1)+1;
C:='';
B:=B + A[j];
for k:=1 to Length(A) do
if k<>j then C:=C+A[k];
A:=C;
end;
for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;
bmp: TRandNumbers;
z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
then begin
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
if (currTime/{#TIME_FOR_VIEW} = N1) then currTime:=0;
end;
end;


procedure InitializeWizard5;
begin
bmp:=get_unique_random_number(N1);
ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов...';
for z:=2 to N1 do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged3(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageDescriptionLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := True;
WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100);
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;


procedure CurPageChanged4(CurPageID: Integer);
begin
if CurPageID = wpInstalling then
WizardForm.BeveledLabel.hide;
if CurPageID = wpInfoAfter then
WizardForm.BeveledLabel.show;
end;




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


procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
CurPageChanged3(CurPageID);
CurPageChanged4(CurPageID);
end;

procedure DeinitializeSetup();
begin
disabledesc();
KillTimer(0, TimerID);
end;

Я как ни мучался, постоянно слайд-шоу глючит. Тоесть первую картинку подгружает, а когда приходит время отобразить следующую, пишет ошибку, что не нашло слайда во временной папке.
И ещё три просьбы, касательно кода для конвертирования OGG:
1. Можно ли сделать чтоб он запускался только если выбран компонент VoiceD2 или VoiceLoD?
2. Можно ли сделать чтоб во время его выполнения, отображалась определённая надпись в StatusLabel?
3. Ктонить способен модифицировать его так, чтобы он запускался ДО начала выполнения секции [Run]?

R.i.m.s.k.y.
30-08-2011, 16:31
Raf-9600,

1. используй функцию IsComponentSelected('VoiceD2 ')

2. да можно, делай.
procedure ChangeCaption(str: string);
begin
WizardForm.StatusLabel.Caption:= str;
end;
вызывай откуда хочешь эту процедуру примерно так: ChangeCaption('Будь мужиком, прочти справку!')

3. я способен, читай в справке
procedure CurStepChanged(CurStep: TSetupStep);
Called with CurStep=ssInstall just before the actual installation starts, with CurStep=ssPostInstall just after the actual installation finishes, and with CurStep=ssDone just before Setup terminates after a successful install.
или
procedure CurPageChanged(CurPageID: Integer);
wpWelcome, wpLicense, wpPassword, wpInfoBefore, wpUserInfo, wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpSelectTasks, wpReady, wpPreparing, wpInstalling, wpInfoAfter, wpFinished
не знаешь инглиша - в шапке русская справка (http://ifolder.ru/20814819) , или translate.google.com

Raf-9600
30-08-2011, 16:54
используй функцию IsComponentSelected('VoiceD2 ') »
Если я не ошибаюсь, это нужно прописать две строчки:
if IsComponentSelected('VoiceD2') = True then
if IsComponentSelected('VoiceLoD') = True then
Только я не догоняю, где именно? :)

вызывай откуда хочешь эту процедуру примерно так: ChangeCaption('Будь мужиком, прочти справку!') »
Почему я вот прописал вот так:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then RecodeOgg;
begin
WizardForm.StatusLabel.Caption := 'Конвертация ogg...';
end;
end;
А оно нефига StatusLabel не меняет? Это я делал по примеру смены StatusLabel на время распаковки слайдов, из кода выше.

я способен, читай в справке »
Я немного не шарю в коде >.<




© OSzone.net 2001-2012