Войти

Показать полную графическую версию : Скрипты 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

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
22-07-2011, 19:08
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('файл с измененным расширением','файл с правильным расширением');

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

ssv14
22-07-2011, 20:12
я думаю, можно сделать так:
переименовать те файлы OGG, которые нужно оставить в OG_ например.
После завершения установки и декодирования всех OGG, через батник переименовать OG_ в OGG через секцию [Run]

[Run]
Filename: "{app}\ren_ogg.bat"; Flags: shellexec runhidden

ssv14
23-07-2011, 00:05
ни как не получается подружить трэкерную музыку с 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;

nik1967
23-07-2011, 09:35
Ребят, объясните, чего у меня при компиляции выдаёт ошибку? »
Правильно, параметр то не указан:
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) проблему, всю голову сломал уже, как освобожусь - посмотрю, самому интересно.

ssv14
23-07-2011, 11:56
Лександер, не поможешь?
ни как не получается подружить трэкерную музыку с 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;

nik1967
24-07-2011, 10:40
1. Как убрать выделение? »
Так:
with WizardForm.DirEdit do begin
AutoSelect:= False;
end;

45king
24-07-2011, 12:37
а как сделать чтобы при удалении игры появлялась сообщение вы хотите удалить сохранение игры да или нет?

VinTagE
24-07-2011, 17:07
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/) ты можешь найти всё что тебе нужно =)

Gugle
25-07-2011, 18:42
Доброго времени суток!

Нашел на форуме как добавить дополнительное окно в скрипт, которое просит ввести какую то доп информацию до установки приложения:

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;

ssv14
25-07-2011, 21:39
есть код декодирования 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;

Gugle
26-07-2011, 10:04
Лександер, спасибо большое.

Еще вопросы:
1. Можно ли в *.ini файлы добавлять секции не "[название_секции]", а ";название_секции"? Если да, то как?
2. Как добавить полученное мной значение из предыдущего примера "UserPage.Values[0]" в *.ini файл? По всей вероятности надо использовать глобальную переменную, но пока понятного для себя примера не нашел.

Заранее благодарен!

Gugle
26-07-2011, 11:51
Второй вопрос отпал. Нашел описание, разобрался.
первый вопрос, об изменении записи названия секции остался.




© OSzone.net 2001-2012