Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]
Gnom_aka_Lexander
22-07-2011, 16:56
Подскажите пожалуйста как растянуть внутренне окно окно
в дизайнере не активно »
в правом верхнем углу - комбобокс с объектами, выбираеш OuterNotebook, и он становится активным, можно менять, по своему усмотрению. С InnerNotebook - тоже самое. В рестулсовском форм-дизайнере, объекты типа TNewNotebook и TNewNotebookPage, только таким образом можно зацеплять для редактирования.
возможно как-то сделать, что бы не велся поиск файлов OGG, а брался из списка,
например из ogglist.txt, в котором прописаны пути к каждому файлу: »
Можно поинтересоваться, для чего? теоретически - можно, используя функции работы с ini-файлами, но есть скрипт, который нормально сам все находит во вложенных подкаталогах.
Еще есть библиотека bass.dll последней версии v.2.4.7 и приведен пример для использования музыки MP3. Но она еще умеет трэкерную музыку воспроизводить MOD, IT, S3M. Может кто-то набросать пример использования этих трэкерных форматов? »
На сайте библиотеки есть примеры, перегнать с дельфи, в урезанный дельфи - можно попробовать, осталось найти того, у кого есть желание этим заняться.
Лександер, а можешь ГОГ доделанный выложить. »
В следующий раз, с личными вопросами, сразу в личку обращайся :)
Gnom_aka_Lexander
22-07-2011, 17:50
Neutron, Если я понял, то тебе нужен статус панель на ботве то вот пример:
Скачать статус панель от Shegorat
P.S> Там разобратся не трудно! »
А в чем связь статус-панели, и модуля системных требований, который ты предлагаешь взамен?
ssv14:
возможно как-то сделать, что бы не велся поиск файлов OGG, а брался из списка,
например из ogglist.txt, в котором прописаны пути к каждому файлу.
Можно поинтересоваться, для чего? теоретически - можно, используя функции работы с ini-файлами, но есть скрипт, который нормально сам все находит во вложенных подкаталогах. »
просто тогда будут все OGG файлы распаковываться, а необходимо несколько файлов так и оставить
Gnom_aka_Lexander
22-07-2011, 19:35
просто тогда будут все OGG файлы распаковываться, а необходимо несколько файлов так и оставить »
Ясно, сейчас освобжусь, накидаю пример получения списка из ини, там такто просто, глянь пока в справке функцию -
function GetIniString(const Section, Key, Default, Filename: String): String;
-указываеш заранее в ини список, например так: секция - список, ключ - номер файла, имя файла - имя файла. Потом в скрипте читаеш имена файлов по номерам ключей.я думаю, можно сделать так: »
Можно и так, но не обязательно батником, можно и в коде это сделать.
Экспортируеш системную функцию перемещения:
function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';
Потом в нужном месте пишеш:
MoveFile('файл с измененным расширением','файл с правильным расширением');
кстати, для бекапа, эту функцию тоже удобнее исподьзовать, чем самописную функцию перемещения для инно - системная значительно быстрей сработает.
я думаю, можно сделать так:
переименовать те файлы OGG, которые нужно оставить в OG_ например.
После завершения установки и декодирования всех OGG, через батник переименовать OG_ в OGG через секцию [Run]
[Run]
Filename: "{app}\ren_ogg.bat"; Flags: shellexec runhidden
ни как не получается подружить трэкерную музыку с bass.dll v2.4.7
что я не так делаю?
[_Code]
const
BASS_MUSIC_RAMP = 1;
BASS_MUSIC_RAMPS = 2;
BASS_MUSIC_LOOP = 4;
BASS_MUSIC_FT2MOD = 16;
BASS_MUSIC_PT1MOD = 32;
BASS_MUSIC_SURROUND = 512;
BASS_MUSIC_SURROUND2 = 1024;
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD; frec: DWORD): Boolean;
external 'BASS_MusicLoad@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_ChannelGetLevel(handle: DWORD): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_Start: Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_Stop: Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free: Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
function InitializeSetup(): Boolean;
var
Mus: HWND;
modName: string;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('BUSSI.S3M');
modName := ExpandConstant('{tmp}\BUSSI.S3M');
BASS_Init(-1, 44100, 0, 0, 0);
Mus := BASS_MusicLoad(FALSE, PChar(modName), 0, 0, BASS_MUSIC_SURROUND, 0);
BASS_Start();
BASS_ChannelPlay(Mus, False);
BASS_ChannelGetLevel();
Result := True;
end;
procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;
Ребят, объясните, чего у меня при компиляции выдаёт ошибку? »
Правильно, параметр то не указан:
procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged1(CurPageID);
CurPageChanged2(CurPageID);
end;
И ещё один косяк:
[Files]
Source: Files\Data\innocallback.dll; Flags: ignoreversion dontcopy nocompression
Source: Files\Data\1.bmp; Flags: ignoreversion dontcopy nocompression
Правда, в скрипте ещё косяков хватает, но просто не стал дальше разбираться, некогда.
Gnom_aka_Lexander
23-07-2011, 11:22
Вообщем слепил, но всё равно какая-то лажа получилась, при нажатии установить, закрывается и ни чего не делает! »
Дык, делает. Именно то, что ты ему и говориш делать.
procedure InstallButtonClick(Sender: TObject);
var
CurPageID: Integer;
begin
Exec(ExpandConstant('{src}\Setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode); //Установить(но, ты заставляеш его запустить файл Setup.exe, которого нет, поскольку это и есть запущеный сетапник.)
AutoRun.Close; // закрываем форму авторана. (единственная нужная здесь строчка)
PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0); // до кучи, имитируем нажатие кнопки отмены , видимо - контольный в голову, чтоб наверняка :)
end;
В модуле AutoRUN.iss замени приведенный выше кусок, вот этим:
procedure InstallButtonClick(Sender: TObject);
var CurPageID: Integer;
begin AutoRun.Close; end;
Лександер, не поможешь? »
Я сейчас уперся рогом в свою (http://forum.krinkels.ru/showpost.php?p=858&postcount=100) проблему, всю голову сломал уже, как освобожусь - посмотрю, самому интересно.
Лександер, не поможешь?
ни как не получается подружить трэкерную музыку с bass.dll v2.4.7
[_Code]
const
BASS_MUSIC_RAMP = 1;
BASS_MUSIC_RAMPS = 2;
BASS_MUSIC_LOOP = 4;
BASS_MUSIC_FT2MOD = 16;
BASS_MUSIC_PT1MOD = 32;
BASS_MUSIC_SURROUND = 512;
BASS_MUSIC_SURROUND2 = 1024;
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD; frec: DWORD): Boolean;
external 'BASS_MusicLoad@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_ChannelGetLevel(handle: DWORD): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_Start: Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_Stop: Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free: Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';
function InitializeSetup(): Boolean;
var
Mus: HWND;
modName: string;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('BUSSI.S3M');
modName := ExpandConstant('{tmp}\BUSSI.S3M');
BASS_Init(-1, 44100, 0, 0, 0);
Mus := BASS_MusicLoad(FALSE, PChar(modName), 0, 0, BASS_MUSIC_SURROUND, 0);
BASS_Start();
BASS_ChannelPlay(Mus, False);
BASS_ChannelGetLevel();
Result := True;
end;
procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;
Gnom_aka_Lexander
23-07-2011, 15:32
сколько помню было так! »
Сейчас некогда смотреть, но логично предложить, что гдето в модулях отключена страница приветсятвия. Отчего я и не люблю модульную систему - при большом количестве процедур, собираемых в одну, инсталл начинает здорово тупить. Плюс, всегда есть шанс запутаться в правильности порядка подачи процедур, чего никогда не будет, если процедура одна.
dracosha
24-07-2011, 10:09
Neutron,
2. Имеется например инсталл »
UsePreviousLanguage=yes
ShowLanguageDialog=yes
LanguageDetectionMethod=uilanguage
[Languages]
Name: english; MessagesFile: compiler:Default.isl;
Name: russian; MessagesFile: compiler:Languages\Russian.isl;
[Files]
Source: "{#MyAppSourcePath}\russian.txt"; DestDir: "{app}"; Languages: russian;
Source: "{#MyAppSourcePath}\english.txt"; DestDir: "{app}"; Languages: english;
1. Как убрать выделение? »
Так:
with WizardForm.DirEdit do begin
AutoSelect:= False;
end;
а как сделать чтобы при удалении игры появлялась сообщение вы хотите удалить сохранение игры да или нет?
45king, а как сделать чтобы при удалении игры появлялась сообщение вы хотите удалить сохранение игры да или нет? »
Так можно:
[Registry]
Root: HKLM; SubKey: SOFTWARE\Chuvakstepan\Spider-man3; ValueType: string; ValueName: PathGame; ValueData: {app}; Flags: uninsdeletekey
[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var ResultStr:String;
begin
if CurUninstallStep=usPostUninstall then
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Chuvakstepan\Spider-man3', 'UnInstConfirm', ResultStr)
if DirExists(ExpandConstant('{userdocs}')+'\Activision\Spider-Man 3') then
if MsgBox('Удалить сохраненные игры',mbconfirmation, mb_YesNo) = IDYES then
begin
if not DelTree(ExpandConstant('{userdocs}')+'\Activision\Spider-Man 3', True, True, True)
then
MsgBox('Папка не удалена!' #13#13 'Папка не существует или задействована.', mbError, MB_OK);
end;
end;
end;
P.S> На этом сайте (http://innoultra.ru/?page_id=18/) ты можешь найти всё что тебе нужно =)
Доброго времени суток!
Нашел на форуме как добавить дополнительное окно в скрипт, которое просит ввести какую то доп информацию до установки приложения:
var
UserPage: TInputQueryWizardPage;
procedure InitializeWizard;
begin
UserPage := CreateInputQueryPage(wpWelcome,
'Доп. информация', 'ВНИМАНИЕ! доп инфо ');
UserPage.Add('Количество :', False);
UserPage.Add('ни о чем:', True);
end;
Все хорошо. Я даже нашел как проверить, что данные введены:
function NextButtonClick(CurPageID: Integer): Boolean;
var
I: Integer;
begin
Result := True;
if CurPageID = UserPage.ID then begin
if UserPage.Values[0] = '' then begin
MsgBox('Вы должны че нить ввести в первое поле', mbError, MB_OK);
Result := False;
end;
end;
end;
Вопрос! Как проверить, что в UserPage.Values[0] введено число, а не просто текст?
И, если это возможно, как проверить что число попало в промежуток, например от -10 до 10.
Заранее благодарен.
Gnom_aka_Lexander
25-07-2011, 20:03
Вопрос! Как проверить, что в UserPage.Values[0] введено число, а не просто текст?
И, если это возможно, как проверить что число попало в промежуток, например от -10 до 10. »
Так, както:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[code]
var
UserPage: TInputQueryWizardPage;
procedure InitializeWizard;
begin
UserPage:= CreateInputQueryPage(wpWelcome, 'название страницы','Тема страницы','Служебная подпись страницы');
UserPage.Add('Количество :', False);
UserPage.Add('ни о чем:', True);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
// проверяем, что поле не пустое
if CurPageID = UserPage.ID then begin if UserPage.Values[0] = '' then begin
MsgBox('Вы должны что-нибудь ввести в первое поле', mbError, MB_OK);
Result := False; Exit; end;
// проверяем, что введено именно число
if AnsiUppercase(UserPage.Values[0])<>AnsiLowercase(UserPage.Values[0]) then begin
MsgBox('Допустимо вводить только цифры', mbError, mb_Ok);
Result := False; Exit; end;
// проверяем, что модуль числа, не зависимо от знака, не превышает 10. (как раз попадаем в диапазон от -10 до 10)
if Abs(StrToInt(UserPage.Values[0]))>10 then begin
MsgBox('за пределами допустимых значений', mbError, mb_Ok); Result := False; Exit; end;
end; end;
Gnom_aka_Lexander
25-07-2011, 20:42
страницу выбора папки установки, папки меню пуск и.т.д »
А их всего два во всем инсталляторе -
procedure InitializeWizard();
begin
WizardForm.DirEdit.AutoSelect:= False;
WizardForm.GroupEdit.AutoSelect:= False;
end;
есть код декодирования OGG. Нужно сделать что бы еще и WV декодировалось. Объединяю оба один за другим, но беда в том, что oни получаются идентичны (кроме переменных) и используют одну и туже функцию StringToArray и при компиляции ругается, что во втором куске она продублирована.
Как прописать ее для обоих участков кода, для 3х участков?
[code1]
var
Files1: Array of String;
S1: String;
n1: Integer;
Function StringToArray(Text, Cut: String): array of String;
var i1, k1: Integer;
Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k1:= Pos(Cut,Text);
if k1 = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i1:= GetArrayLength(Result) -1;
if k1 = 0 then
Result[i1]:=Text
else begin
Result[i1]:= Copy(Text, 1, k1 -1); Delete(Text, 1, Length(Result[i1]) + Length(Cut));
end;
Until Length(Text) * k1 = 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
S1:= S1 + 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\sound\'), '*.ogg') //Находим все файлы по маске, в выбранной папке
Files1:= StringToArray(S1, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files1)-1; //Получаем кол-во файлов
for n1:=(GetArrayLength(Files1)-1) downto 0 do begin
CurFile:= Files1[n1]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}\ogg\sound\')), '')
Exec(ExpandConstant('{app}\ogg\sound\oggdec.exe'), '-Q '+ AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files1[n1]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files1[n1]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\ogg\sound\oggdec.exe'))
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.ProgressGauge.Position := 0;
WizardForm.StatusLabel.Caption := 'Decompressing audio files, please wait...';
RecodeOgg;
end;
end;
//-------распаковка WV ------------------------------------------------
[code2]
var
Files2: Array of String;
S2: String;
n2: Integer;
Function StringToArray(Text, Cut: String): array of String; //стопор, т.к уже дублируется в предыдущем коде
var i2, k2: Integer;
Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k2:= Pos(Cut,Text);
if k2 = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i2:= GetArrayLength(Result) -1;
if k2 = 0 then
Result[i2]:=Text
else begin
Result[i2]:= Copy(Text, 1, k2 -1); Delete(Text, 1, Length(Result[i2]) + Length(Cut));
end;
Until Length(Text) * k2 = 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
S2:= S2 + 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 RecodeWV;
var ResultCode: integer;
CurFile: String;
begin
FindFiles(ExpandConstant('{app}\WV\sound\'), '*.wv') //Находим все файлы по маске, в выбранной папке
Files2:= StringToArray(S2, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files2)-1; //Получаем кол-во файлов
for n2:=(GetArrayLength(Files2)-1) downto 0 do begin
CurFile:= Files2[n2]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}\WV\sound\')), '')
Exec(ExpandConstant('{app}\WV\sound\wvunpack.exe'), '-t -q -y '+ AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files2[n2]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files2[n2]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\WV\sound\wvunpack.exe'))
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
begin
WizardForm.ProgressGauge.Position := 0;
WizardForm.StatusLabel.Caption := 'Decompressing audio files, please wait...';
RecodeWV;
end;
end;
Лександер, спасибо большое.
Еще вопросы:
1. Можно ли в *.ini файлы добавлять секции не "[название_секции]", а ";название_секции"? Если да, то как?
2. Как добавить полученное мной значение из предыдущего примера "UserPage.Values[0]" в *.ini файл? По всей вероятности надо использовать глобальную переменную, но пока понятного для себя примера не нашел.
Заранее благодарен!
Второй вопрос отпал. Нашел описание, разобрался.
первый вопрос, об изменении записи названия секции остался.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.