Страница 36 из 130

Добавлено: Вт авг 23, 2011 23:25
Flasher
MVV
Отлично, выкладывай. Изображение

Добавлено: Вт авг 23, 2011 23:53
MVV
Выложил TCFS2 2.0.2.258:
+ функция if, работает как оператор ?:, но вычисляет только одно выражение
+ функция null, позволяющая проверить, задан ли параметр команды
+ поддержка относительных путей редирекции в функциях tcini и set_tcini [new]
* сокрытие курсора ожидания после запуска TCFS2 [new]

Добавлено: Ср авг 24, 2011 00:11
Flasher
Спасибо. Хм. А я уж думал, что вообще теперь фонового курсора не увижу, а оказалось только для delay. Ну ладно, хоть так.
MVV писал(а):+ функция null, позволяющая проверить, задан ли параметр команды
Это для ini-ключей что ли?

Добавлено: Ср авг 24, 2011 09:48
MVV
Flasher писал(а):Спасибо. Хм. А я уж думал, что вообще теперь фонового курсора не увижу, а оказалось только для delay. Ну ладно, хоть так.
А где ты его видишь? Я его вижу только мельком при запуске TCFS2, потом он исчезает и во время выполнения команд уже не появляется. Пробовал на вышеупомянутых строках с delay, а также с fs2.
Flasher писал(а):
MVV писал(а):+ функция null, позволяющая проверить, задан ли параметр команды
Это для ini-ключей что ли?
Это позволяет писать команды с опциональными параметрами. Например, пишешь функцию установки позиции сепаратора, которая ставит заданное значение, если параметр указан, или же сбрасывает на 50, если параметр не указан:

Код: Выделить всё

[Items]
setsep=run_item(set_separator, null(#1) ? 50 : #1-0)

TCFS2 /ei setsep(70)
TCFS2 /ei setsep
Или, быть может, какую-нибудь функцию установки размеров окна, где последние несколько параметров опциональны. Иногда может быть полезно.

Добавлено: Ср авг 24, 2011 23:08
Flasher
MVV писал(а):А где ты его видишь?
Там же, где и ты, собственно. Или я что-то не так написал?
MVV писал(а):Или, быть может, какую-нибудь функцию установки размеров окна, где последние несколько параметров опциональны.
Но как эти параметры могут пустовать?
Вот если ключ ini пустует, то это ещё понятно, для чего может пригодиться.

Добавлено: Чт авг 25, 2011 00:51
MVV
Flasher писал(а):
MVV писал(а):А где ты его видишь?
Там же, где и ты, собственно. Или я что-то не так написал?
Ну ты как-то невнятно написал. Если у тебя он появляется лишь единожды на долю секунды при запуске, то ничего страшного в этом нет. Особенно при сравнении с тем, что было раньше.
Flasher писал(а):
MVV писал(а):Или, быть может, какую-нибудь функцию установки размеров окна, где последние несколько параметров опциональны.
Но как эти параметры могут пустовать?
Вот если ключ ini пустует, то это ещё понятно, для чего может пригодиться.
При вызове команды ты можешь задать параметр или не задать - смотря как тебе надо. Опциональные параметры могут вычисляться автоматически, если не заданы явно - опять же, зависит от того, как составлена команда.

Добавлено: Чт авг 25, 2011 00:59
Flasher
MVV писал(а):Ну ты как-то невнятно написал. Если у тебя он появляется лишь на долю секунды при запуске, то ничего страшного в этом нет.
А что там невнятного? "Не увижу" - значит не увижу вообще. Страшного-то ничего нет, не несколько раздражает. Команды, завязынные на tcfs2, выполняются постоянно.
MVV писал(а):Особенно при сравнении с тем, что было раньше.
Кроме как с delay разницы практически не заметил.
MVV писал(а):При вызове команды ты можешь задать параметр или не задать - смотря как тебе удобнее
Ой, чую нужны примеры, торможу что-то...

Добавлено: Чт авг 25, 2011 09:49
MVV
Не увижу вообще - это из области фантастики. Винда ещё до передачи управления приложению (любому - проверил на нескольких, включая стандартные виндовские калькулятор и блокнот) ставит курсор занятости, и убрать его вообще можно только тем способом, который ты предлагал в соседней теме (через настройку курсоров :D).

А пример был четырьмя постами выше - функция setsep с опциональным параметром. Можно такой пример привести:

Код: Выделить всё

[Items]
moveto=move(#1, #2, if(null(#3), cxWorkArea-#1, #3), if(null(#4), cyWorkArea-#2, #4))
moveto=move(#1, #2, null(#3) ? @-#1 : #3-0, null(#4) ? cyWorkArea-#2 : #4-0)

TCFS2 /ei "moveto(300, 400)"
TCFS2 /ei "moveto(300, 400, , 400)"
TCFS2 /ei "moveto(300, 400, 600, 400)"
Если третий или четвертый параметр задан, размер окна ставится в соответствии с указанным параметром, иначе - максимальный возможный при таких координатах окна. Я не сильно настаиваю на том, что это будет очень полезно, но возможно где-то пригодится.

Оба варианта записи команды делают одно и то же, но выражения оператора ?: не могут быть пустыми, т.к. при его вычислении вычисляются оба. Значение выражения #3-0 совпадает со значением #3, если #3 задан, и является верным выражением, если #3 пуст (-0 - это верное выражение, хоть и бессмысленное). И ещё раз напомню, что @ внутри параметра вложенной функции не раскрывается, поэтому вместо cxWorkArea нельзя использовать @.

Добавлено: Сб авг 27, 2011 20:11
ask-rus
MVV
Необходима фича-убивашка, подробнее.

Добавлено спустя 1 час 8 минут:

+ Косяк программы.

Добавлено: Вс авг 28, 2011 02:04
MVV
ask-rus писал(а):+ Косяк программы.
Flasher писал(а):
TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)!=1) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) tem(em_1)"
Команда должна сменять панели при первом нажатии кнопки, т.к. происходит проверка значения ключа. В одном случае ключ при несовпадении принимает значение 1, и выполняется юзеркоманда вызова дефолтного бара, в другом - ноль, и выполняется юзеркоманда вызова второго бара. Но почему-то команда срабатывает верно только со второго раза.
Да, работает не всегда. Но это не вина программы. После более внимательного взгляда на команду я нашёл в ней нарушение логики:
Flasher писал(а):TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)!=1) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) tem(em_1)"
Ничего в глаза не бросается? В первом случае установка бара #1 сопровождается записью Bar=1, во втором случае установка бара #2 сопровождается записью Bar=0, а в третьем ты ставишь бар #1, а в Bar ничего не пишешь. Естественно, при следующем запуске выполнение команды идёт по первой ветке, в которой она снова ставит бар #1, но уже сопровождая его записью Bar=1. Думаю, уже стало понятно, как решить проблему:
TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)!=1) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) set_tcini(TCFS2, Bar, 1) tem(em_1)"
В предложенном мною варианте фигурировала отдельная команда set_bar, которая принимала номер бара и сама записывала этот номер в конфиг и одновременно вызывала соответствующую em-команду. С такой командой запись гораздо лаконичнее и понятнее, заодно и избавляет от проблем забывчивости:
TCFS2.exe /ef "set_bar(1), test(tcini(TCFS2, Bar, #)!=1) | set_bar(2) delay(15000) set_bar(1)"
Но это не решит проблему, связанную с тем, что панель переключается обратно через 5 секунд по той причине, что 10 секунд назад команда была вызвана и только-только закончила ожидание. Самый простой и безопасный способ решить проблему - различать сеансы:
TCFS2.exe /ef "set_tcini(TCFS2, Cmd1, 0)" "set_bar(1), test(tcini(TCFS2, Bar, #)!=1) | set_bar(2) delay(15000) if(tcini(TCFS2, Cmd1, # == @S), set_bar(1))"
Ни за что не поверю в то, что это прям уж такая супер-пупер сложная запись, добавлено в ней всего-то ничего: запоминание номера сеанса @S (макрос пока недоступен) перед началом выполнения команды и проверка номера сеанса после ожидания (если изменился, значит, команду вызывали повторно). Если оформлять команду как команду, а не вызывать с командной строки, то нужно будет записывать номер сеанса в каждой ветке. Единственное условие здесь - не использовать один и тот же INI-параметр в разных командах.
ask-rus писал(а):Необходима фича-убивашка, подробнее.
Собственно, я уже выражал своё мнение касаемо убийства процессов, и вижу более правильный вариант, который приведён выше.

Добавлено: Вс авг 28, 2011 09:00
ask-rus
MVV писал(а):макрос пока недоступен
Ну что ж, ждать только остается...

Добавлено: Вс авг 28, 2011 20:58
Flasher
MVV писал(а):После более внимательного взгляда на команду я нашёл в ней нарушение логики:
Flasher писал(а):TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)!=1) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) tem(em_1)"
Ничего в глаза не бросается? В первом случае установка бара #1 сопровождается записью Bar=1, во втором случае установка бара #2 сопровождается записью Bar=0, а в третьем ты ставишь бар #1, а в Bar ничего не пишешь. Естественно, при следующем запуске выполнение команды идёт по первой ветке, в которой она снова ставит бар #1, но уже сопровождая его записью Bar=1. Думаю, уже стало понятно, как решить проблему:
TCFS2.exe /ef "set_tcini(TCFS2, Bar, 1) tem(em_1), test(tcini(TCFS2, Bar, #)!=1) | set_tcini(TCFS2, Bar, 0) tem(em_2) delay(15000) set_tcini(TCFS2, Bar, 1) tem(em_1)"
Правильно ли я понимаю, что когда при выполнении "tem(em_2) delay(15000) tem(em_1)" срабатывает последняя команда, возвращается флаг из первого куска "set_tcini(TCFS2, Bar, 1)", т.к. в памяти отложилось, что к команде tem(em_1) приклеилась установка данного флага, действующая на протяжении всей записи?

Добавлено: Вс авг 28, 2011 21:03
MVV
Неправильно. Вызовы команд set_tcini и tem абсолютно никак друг с другом не связаны, ничего ни к чему не приклеивается. И TCFS2 ни за что не будет сама устанавливать или возвращать флаги в INI, если соответствующая команда не указана явно.

Добавлено: Вс авг 28, 2011 21:05
Flasher
Тогда я не вижу нарушения логики в своей записи. При возврате в дефолтную панель происходит установка в ноль. При последующем обращении происходит проверка на значения, отличные от единицы, и, соответственно, команда должна выполняться, а этого не происходит.

Добавлено: Вс авг 28, 2011 21:20
MVV
Ну как же не видишь? Ты переключаешь панель на основную, а параметр, обозначающий текущую панель, не меняешь. В результате при следующем запуске выполнение команды идёт по другой ветке, в которой снова ставится эта панель, которая и так стоит. Это и есть лишний запуск. И он как раз и делает, что записывает в Bar тот номер, который должна была записать команда при последнем вызове tem(em_1).

Твой оригинальный вариант без !=1 работал исключительно потому, что он из-за этого всегда выполнял вторую ветку, а первая не выполнялась никогда (если не ноль, мы запишем единичку, иначе ноль - при следующем запуске будет такое же условие). Впрочем, если записать вручную Bar=1, то вариант без !=1 будет всегда выполнять первую ветку, никогда не попадая во вторую.