AIMP Forum
AIMP for Windows => Skin Editor, Skin Engine => Вопросы / Questions => Topic started by: HyperOne on March 08, 2016, 17:54:15
-
Правильно ли я набираю строки в скрипте?:
FindObject('acPlayerRepeat').execute; //переключить Repeat
и
FindObject('acPlayerShuffle').execute; //переключить Shuffle
...потому как состояния этих переключателей таким образом не переключаются. И вообще окном отладчика пользоваться не научился. Он у меня всегда пуст.
-
Правильно ли я набираю строки в скрипте?:
FindObject('acPlayerRepeat').execute; //переключить Repeat
и
FindObject('acPlayerShuffle').execute; //переключить Shuffle
...потому как состояния этих переключателей таким образом не переключаются.
Правильно, к подобным провайдерам можно обращаться в упрощенном виде. Всё переключается, после каждой команды состояние меняется на противоположное.
Как вы определяете, что переключилось?
...И вообще окном отладчика пользоваться не научился. Он у меня всегда пуст.
Для того, чтобы в отладочном окне что=то отображалось, это что-то надо выводить процедурой
OutputDebugString(IntToStr(State));
Вместо State может быть любая переменная , объявленная в скрипте.
-
Вопрос решил. Я связал кнопку со скриптом не добавив Value + ScrollDelta. Теперь другой вопрос, который не описывается в справочнике. Как получить значение с TASELogicalOperatorCommutator, если не следующим методом:
case FindObject('NewLogicalOperatorCommutator').Get('Result') of
0:
...
...
Просто так он выдаёт ошибку:
NewScriptableOperatorCounter: Property Result does not exist
Напрямую к Repeat и Shuffle пытаюсь обратиться, только со State, результат такой же.
-
У коммутаторов нет свойства Result и получить его нельзя, равно как и у acPlayerRepeat нет свойства State, по крайней мере они не являются публичными.
Как вариант, можно подключить к этим выводам обычный счётчик и из скрипта считывать его состояние - это работает.
P.S. Если не секрет, что за задача такая - обращаться к провайдерам acPlayerRepeat, acPlayerShuffle через скрипты?
-
Если не секрет, то я сделал одну кнопку-переключатель с тремя состояниями: "По порядку->повтор трека->случайный порядок" вместо двух кнопок, для Трея, для особой компактности.
Классный способ, спасибо!
P.S.: Я случайно ошибся разделом на форуме, у них названия одинаковые.
-
Ну, вообще то, в таком случае должно быть 4 сосотояния:
- всё выключено
- включен Shuffle
- включен Repeat
- влючены оба.
-
4-е состояние есть:
procedure Execute(var State: Integer);
var
Rp : TComponent;
Sf : TComponent;
Ct : TComponent;
begin
Rp:= FindObject('acPlayerRepeat');
Sf:= FindObject('acPlayerShuffle');
Ct:= FindObject('ShuffpeatCounter');
case Ct.Get('Position') of
0:
begin
Rp.Execute
end;
1:
begin
Rp.Execute;
Sf.Execute
end;
2:
begin
Sf.Execute
end;
3:
begin
Rp.Execute
end;
end;
end;
Только он недоступен для такой кнопки. Единственная разница между "включён Repeat" и "включены оба" – в том, какой будет следующий трек при ручном листании. С последнего состояния, при нажатии, прыгает сразу к "2:"
-
Тут ещё может быть неприятный момент - рассинхронизация счётчика, поскольку провайдеры при каждом проходе скрипта просто инвертируют своё состояние, а не привязаны жёстко к позиции счётчика. Если пользователь в главном окне включит обычной кновкой Repeat или Shuffle - то потом в трее алгоритм нарушится.
По ходу, придётся проверять State...
-
Тут ещё может быть неприятный момент - рассинхронизация счётчика, поскольку провайдеры при каждом проходе скрипта просто инвертируют своё состояние, а не привязаны жёстко к позиции счётчика. Если пользователь в главном окне включит обычной кнопкой Repeat или Shuffle - то потом в трее алгоритм нарушится.
Всё стабильно, на баги проверено.
acPlayerShuffle и acPlayerRepeat своими state-ами привязаны к коммутатору. То есть они твёрдо зависят от состояния из плеера, не из скина.
В параметрах:
If(Value1=0 AND Value2=0,0,If(Value1=0 AND Value2=1,1,If(Value1=1 AND Value2=0,2,3)))
Коммутатор связан с счётчиком, с счётчика считывается значение, скриптом выполняются только действия плеера. От скриптов связей нет, только К скриптам от кнопки. Position скрипта в принципе вообще не нужен.
-
В параметрах:
If(Value1=0 AND Value2=0,0,If(Value1=0 AND Value2=1,1,If(Value1=1 AND Value2=0,2,3)))
Что эквивалентно: Value1 * 2 + Value2
-
Баги всё-таки есть, проявляются при запуске Aimp-а, там же запускается скрипт. Решил проблему таким образом:
Добавил If перед case на проверку State. Кнопка нажимается, State меняется на 1. Если State = 1, то исполняются действия и заодно последней строкой State:=0 заряжается для следующего нажатия. При запуске Aimp-а, действия не работают, так как State по умолчанию 0.
procedure Execute(var State: Integer);
var
Rp : TComponent;
Sf : TComponent;
Ct : TComponent;
begin
Rp:= FindObject('acPlayerRepeat');
Sf:= FindObject('acPlayerShuffle');
Ct:= FindObject('ShuffpeatCounter');
If State Then
case Ct.Get('Position') of
0:
begin
Rp.Execute
end;
1:
begin
Rp.Execute;
Sf.Execute
end;
2:
begin
Sf.Execute
end;
3:
begin
Rp.Execute
end;
end;
State:=0
end;
Один раз баг при этом проявился, но его повторить пока не смог. при смене скина и при его установке.
-
Для MainForm есть ещё скрипт OnLoaded - он может помочь в установке начальных значений.
-
В данной ситуации у меня тормозит счётчик. Он сохраняет последнее значение перед сменой обложки на любую, затем воспроизводит такое же значение (даже не по умолчанию), при смене обратно. Коммутатор, в отличии от счётчика, всё успевает.