Raf-9600,
Цитата
Raf-9600:
Единственная мелочь: в твоём коде проверка в процедуре BASS_PlayFile такая if Channel 0 then, а должно быть if Channel = 0 then.
Скрипты Inno Setup. Помощь и советы [часть 6]
Не такая уж и мелочь. Благодарю! Я её проглядел.
Цитата
Raf-9600:
Собственно вот как эта часть выглядит у меня. Не воспроизводим один файл два раза под ряд если их хотябы два.
Скрипты Inno Setup. Помощь и советы [часть 6]
Ну давай теперь разбирать, что ты там написал
if i >= 1 then
означает "если длина массива больше-равно 1".
Не вижу смысла. Если длина массива 1, то рандом не нужен
Если больше одного, рандом уместен
те мы уже пишем
if i = 1 then uSoundName := Sounds[0]
else
if i > 1 then ипользуем рандом, но
ты хочешь чтоб файлы не проигрывались два раза подряд и рекурсивно вызываешь BASS_PlayFile() пока значения TempSoundName и uSoundName будут разными.
Да функция GetArrayLength() и Random() работают быстро, но мы не знаем сколько раз пройдёт рекурсия пока рандом не выдаст другое значение. Те тут крайне нестабильная секция кода с точки зрения скорости. Другими словами очень желательно другое решение. В данном случае модификация рандома. Вот кокретно для решения этой задачи наваял код:
алгоритм простой - чистая математика
функция function RandRange(const LeftInt, RightInt: Integer): Integer;
где LeftInt - левая граница
RightInt - правая
условие RightInt > LeftInt хотя бы на 1
например мы хотим получить случайные числа от 2 до 7 включительно.
функция
function NotRandRand(const LeftInt, RightInt: Integer; var LastResultInt: Integer): Integer;
где всё тоже самое кроме LastResultInt, в которую пишется значение последнего результата.
условие: переменная, которую отправляем в var LastResultInt: Integer должна быть глобальной (это съест всего лишь 4 байта памяти процесса), иначе ничего работать не будет!
как она работает думаю понятно по коду. Единственное скажу, что если последнее выпавшее число не равно левой границе и павой, то значит речь идёт о 2-х половинах
и тут мы доверим рандому case Random(2) of
например у нас числа 1...7. Вапало 5. --> в след. раз в Random(2) выпал 0 (рандом возвращает входное значение -1), то мы выполним RandRange(1, 5-1)
если выпала 1, то RandRange(5+1, 7)
короче говоря никаких повторов 222, 33, итд. Минимум через 1
вот код:
читать дальше »
Код:
Код: Выделить всё
function RandRange(const LeftInt, RightInt: Integer): Integer;
begin
Result := Random( (RightInt + 1)-LeftInt ) + LeftInt;
end;
function NotRandRand(const LeftInt, RightInt: Integer; var LastResultInt: Integer): Integer;
begin
Result := RandRange(LeftInt, RightInt);
if Result = LastResultInt then
begin
if LastResultInt = LeftInt then
Result := RandRange(LeftInt+1, RightInt)
else
if LastResultInt = RightInt then
Result := RandRange(LeftInt, RightInt-1)
else
case Random(2) of
0: Result := RandRange(LeftInt, LastResultInt-1);
1: Result := RandRange(LastResultInt+1, RightInt);
end;
end;
LastResultInt := Result;
end;
procedure Test();
var
sArray: array [0..3] of String;
S: String;
i, e, L, R, LastInt: Integer;
begin
for i := 0 to 3 do
begin
sArray[i] := IntToStr(i+1) + ')' + #32;
case i of
0:
begin
L := 1;
R := 9;
end;
1:
begin
L := 7;
R := 8;
end;
2:
begin
L := 2;
R := 16;
end;
3:
begin
L := 0;
R := 1;
end;
end;
for e := 0 to 7 do
sArray[i] := sArray[i] + #32#32#32 + IntToStr(NotRandRand(L, R, LastInt));
LastInt := 0;
end;
S := sArray[0];
for i := 1 to 3 do
S := S + #13#10 + sArray[i];
MsgBox(S, mbInformation, MB_OK);
end;
procedure InitializeWizard();
begin
Test();
end;
процедура Test(); отладочная. Вот мой результат
читать дальше »
обрати внимание на 2 и 4-ю строку. Как и следовало ожидать при RightInt - LeftInt = 1 значения чередуются
вот твой участок кода (обновлённый):
читать дальше »
Код:
Код: Выделить всё
var
LastInt: Integer;
function BASS_PlayFile(const Sounds: array of String): boolean;
var
TempSoundName, uSoundPath: String;
Len: integer;
begin
Len := GetArrayLength(Sounds);
// Не воспроизводим один файл два раза под ряд если их хотябы два.
if Len = 1 then
uSoundName := Sounds[0];
else
if Len > 1 then
uSoundName := Sounds[ NotRandRand(0, Len-1, LastInt) ];
Хочу заметить. У меня лежит код (пока времени нет довести до ума

) настоящего рандома из микрофона ноутбука. Те шум окружающей среды. И там бывают подряд повторяющиеся значения. Те повтор для рандома это нормально, в противном случае это не рандом, а какой-то счётчик!
строка
if not FileExists(AddBackslash(RemoveBackslash(ExpandConstant('{tmp}'))) + 'BASS.dll') then ExtractTemporaryFile('BASS.dll');
не нужна (заметь у меня в коде её нет), тк BASS.dll итак извлекается для последующей её динамичной загрузки
=========================================================================================
ispolin, у меня компилятор на Свойство ItemCount не ругается. Использую расширенную версию(не самую новую - 5.4.3). В шапке есть ссылка на расширенную.