TCFS2 + TCFS2Tools: Полноэкранный режим и многое другое

Обсуждение только плагинов и утилит для Total Commander.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Flasher писал(а):И как исправить? С умножением вообще не срабатывает.
Умножение не поможет, само собой, т.к. findwnd(#2) никогда ничего не найдёт.
Flasher писал(а):Можешь макросом? Не улавливаю. Я пробовал избавиться от дочернего окна, но становилось только хуже.
Я же написал, надо проверять на существование окна внутри другого окна, а не рядом, т.к. дочернее окно можно найти только внутри окна верхнего уровня. Например, если ты посылаешь сообщения окну findwnd(#2,,findwnd(#3),#4), то и в проверке существования должно быть точно такое же выражение.
Вообще, я посмотрел на окно переименователя, там матрёшка целая: окно, в нём TPanel, в ней TMyGroupBox, в нём TMyComboBox, ещё и с индексами бардак... Искать надо так же:

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

TCFS2 /ei "settext(`hwnd ` findwnd(TMyComboBox,,findwnd(TMyGroupBox,,findwnd(TPanel,,findwnd(TMultiRename),1),4)))"
Я бы на твоём месте просто передавал формулу окна снаружи, было бы более универсально:

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

settext_wait=loop(@<=if_empty(#3,5)*20 && if(#2,settext(#1,#2)*0,delay(50)))
Вызов для твоего случая:

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

TCFS2 /ef "tcm(2400,1) eval(settext_wait(`yohoho`, findwnd(TMyComboBox,,findwnd(TMyGroupBox,,findwnd(TPanel,,findwnd(TMultiRename),1),4))))"
Жесть, конечно...
И как это сделать через TCFS2? Я привёл 2 примера, один из которых имеет редактируемый комбобокс. Хотелось бы конкретики.
Выбирать элемент комбобокса можно макросом (выбирается первая строка, начинающаяся с заданного текста):

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

select=sendmsg(#2, $14E, sendmsg(#2, $14C, 0, #1))
select_wait=loop(@<=if_empty(#3,5)*20 && if(#2,select(#1,#2)*0,delay(50)))
Пример вызова:

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

TCFS2 /ef "tcm(508,1) eval(select_wait(`7z`, findwnd(TComboBox,,findwnd(TMyGroupBox,,findwnd(TDLGZIP)))))"
Кстати, чтобы не писать одно и то же выражение внутри одной функции по несколько раз, можно сохранять результат в переменную с помощью varset в начале функции и считывать оттуда потом через varget, надо только определиться с номером переменной...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Примеры работают, но...
MVV писал(а):Жесть, конечно...
В том то и дело. Хотелось бы все эти findwnd упаковать в макрос.
MVV писал(а):выбирается первая строка, начинающаяся с заданного текста
У меня вторая 7zip_... вместо 7z.
MVV писал(а):чтобы не писать одно и то же выражение внутри одной функции по несколько раз
Какое выражение ты имеешь в виду?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Flasher писал(а):У меня вторая 7zip_... вместо 7z.
Если нужно выбрать не первое попавшееся совпадение (CB_FINDSTRING = $14C), а точное, то, возможно, надо использовать CB_FINDSTRINGEXACT = $158.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

sa писал(а):Если нужно выбрать не первое попавшееся совпадение (CB_FINDSTRING = $14C), а точное, то, возможно, надо использовать CB_FINDSTRINGEXACT = $158.
Да, искать строки в списке можно по частичному или полному совпадению. Можно добавить к команде третий необязательный аргумент, чтобы искать точное совпадение.

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

select=sendmsg(#2, $14E, sendmsg(#2, if(#3-0, $14C, $158), 0, #1))					; Выбрать в выпадающем списке элемент, начинающийся с заданного текста. Параметры: текст, дескриптор окна, режим поиска (0 - точное совпадение, 1 - начало)
select_wait=loop(@<=if_empty(#4,5)*20 && if(#2,select(#1,#2,#3)*0,delay(50)))		; Ожидает появления выпадающего списка и выбирает в нём элемент, начинающийся заданной строкой. Параметры: текст, формула дескриптора выпадающего списка, режим поиска (0 - точное совпадение, 1 - начало), число секунд (по умолчанию 5)
Flasher писал(а):Какое выражение ты имеешь в виду?
Если передавать выражение для вычисления дескриптора в параметре, то повторять ничего не приходится, т.к. можно везде указывать параметр, а если формировать его внутри макроса, то его надо повторять в проверке и в функции отправки сообщения.
Flasher писал(а):В том то и дело. Хотелось бы все эти findwnd упаковать в макрос.
Возможно, стоит добавить режим рекурсивного поиска в findwnd. Боюсь, универсальный макрос будет чересчур сложным, т.к. надо в цикле перебрать все дочерние окна и применить макрос к ним, и при этом нужно учитывать совокупный индекс...
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

MVV писал(а):Можно добавить к команде третий необязательный аргумент, чтобы искать точное совпадение.
Правильно понимаю: по умолчанию (без указания третьего аргумента) или при аргументе, равном 0, будет искаться точное совпадение, а при аргументе, равном 1 – частичное?
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

sa писал(а):Правильно понимаю: по умолчанию (без указания третьего аргумента) или при аргументе, равном 0, будет искаться точное совпадение, а при аргументе, равном 1 – частичное?
Понимаешь правильно, либо просто умеешь читать. :)
MVV писал(а):

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

... ; ... Параметры: текст, дескриптор окна, режим поиска (0 - точное совпадение, 1 - начало)
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

MVV
Смутило, что можно добавить необязательный аргумент, чтобы искать точное совпадение. :)
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):Да, искать строки в списке можно по частичному или полному совпадению.
А зачем нам искать по частичному, если полное доподле известно?
MVV писал(а):т.к. надо в цикле перебрать все дочерние окна и применить макрос к ним, и при этом нужно учитывать совокупный индекс.
Не понимаю, для чего это? Мы же уже знаем, сколько дочерних окон. Т.е. может быть цепочка из 2 или 3 окон. Т.е. будет 2 макроса под эти варианты. Разве нельзя сделать, чтобы параметрами шли только классы и индексы без findwnd (как у меня)?
MVV писал(а):Если передавать выражение для вычисления дескриптора в параметре, то повторять ничего не приходится, т.к. можно везде указывать параметр
Так в приведённых примерах никаких совпадающих выражений я не наблюдаю, чтобы их дублировать параметром, поэтому и спрашиваю, о чём речь.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Flasher писал(а):А зачем нам искать по частичному, если полное доподле известно?
Например, чтобы не писать тридцать символов, если достаточно первых пяти - ситуации бывают разные. :)
Не понимаю, для чего это? Мы же уже знаем, сколько дочерних окон. Т.е. может быть цепочка из 2 или 3 окон. Т.е. будет 2 макроса под эти варианты. Разве нельзя сделать, чтобы параметрами шли только классы и индексы без findwnd (как у меня)?
Цепочка может быть любой вложенности, посему скорее всего удобно было бы иметь функцию, которая может просмотреть всю иерархию и найти нужный нам TMyComboBox без указания всей цепочки.
Но можно и по цепочке, тогда можно сделать макрос, в который через запятую все классы цепочки указать (это если забить на тексты этих окон), чтобы он сам по цепочке прошёлся. Хотя, конечно, можно просто несколько веток описать по числу параметров, будет громоздко и неуниверсально.
Так в приведённых примерах никаких совпадающих выражений я не наблюдаю, чтобы их дублировать параметром, поэтому и спрашиваю, о чём речь.
В твоих первых примерах следовало бы повторять выражение для определения дескриптора окна findwnd(#2,,findwnd(#3),#4) в условии функции if и в параметре функции send, чтобы ждать то же окно, которому потом посылать сообщение.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):Но можно и по цепочке, тогда можно сделать макрос, в который через запятую все классы цепочки указать
Нет. В макрос классы указывать не надо. Классы нужно указывать исключительно в команде вызова.
MVV писал(а):Хотя, конечно, можно просто несколько веток описать по числу параметров, будет громоздко и неуниверсально.
Почему несколько-то? Я же всего про 2 пишу. Возьми любой диалог в ТС, откуда больше?
MVV писал(а):В твоих первых примерах следовало бы повторять выражение для определения дескриптора окна findwnd(#2,,findwnd(#3),#4) в условии функции if и в параметре функции send, чтобы ждать то же окно, которому потом посылать сообщение.
В макросе? Короче запись не станет.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Почему несколько-то? Я же всего про 2 пишу. Возьми любой диалог в ТС, откуда больше?
Элемент может быть на глубине 1, 2, 3, 4 уровней, возможно даже глубже... Универсальный вариант должен поддерживать все эти ситуации.
Нет. В макрос классы указывать не надо. Классы нужно указывать исключительно в команде вызова.
Что-то не пойму я, как ты хочешь это видеть...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):3, 4 уровней, возможно даже глубже
Приведи пример в ТС, пож-та.
MVV писал(а):Что-то не пойму я, как ты хочешь это видеть...
Ты же привёл ссылку с моими попытками. Т.е. в макросе указываем переменные для классов и индексов, а в команде вызова пишем конкретные.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Приведи пример в ТС, пож-та.
В окне копирования путь назначения - 2 уровень: TInpComboDlg, TMyComboBox.
В окне копирования режим перезаписи - 3 уровень: TInpComboDlg, TMyGroupBox, TMyComboBox.
В окне упаковки внешний архиватор - 3 уровень: TDLGZIP, TMyGroupBox, TComboBox.
В окне переименователя предустановка - 3 уровень: TMultiRename, TPanel, TMyComboBox.
В окне переименователя шаблон имени - 4 уровень: TMultiRename, TPanel, TMyGroupBox, TMyComboBox.
В окне переименователя шаблон расширения - 4 уровень: TMultiRename, TPanel, TMyGroupBox, TAltEdit.
В окне переименователя поле поиска - 4 уровень: TMultiRename, TPanel, TMyGroupBox, TMyComboBox.
...
Ты же привёл ссылку с моими попытками. Т.е. в макросе указываем переменные для классов и индексов, а в команде вызова пишем конкретные.
Либо кучу макросов придётся написать для разных случаев, либо один с кучей параметров, чтобы можно было все варианты задействовать: на каждом уровне может быть класс, текст, индекс...
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

MVV писал(а):В окне переименователя
Либо кучу макросов придётся написать
Окно переименования я брал для примера. Но по большому счёту там и не нужно, т.к. есть команда MULTIRENAME <operation name>.
Поэтому можно вполне остановится на 2-3 уровнях, о которых я писал.
MVV писал(а):либо один с кучей параметров, чтобы можно было все варианты задействовать
Сам вариант будет дольше отрабатывать, и команды по всей видимости длиннее будут, вот почему не нравится такой вариант.
MVV писал(а):удобно было бы иметь функцию, которая может просмотреть всю иерархию
Вот если это будет именно функция (не макрос), то, видимо, было бы действительно удобно. Готов такую добавить?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
MVV
Сообщения: 4815
Зарегистрирован: Чт окт 15, 2009 10:58
Откуда: Ростов-Дон

Сообщение MVV »

Вот если это будет именно функция (не макрос), то, видимо, было бы действительно удобно. Готов такую добавить?
Скорее, режим рекурсивного поиска, о котором я уже писал выше. Тогда индекс элемента будет глобальным в рамках родительского окна, независимо от того, где находятся элементы с заданными классом и текстом.
Ответить