Переключение между разными базами эскизов

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

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

Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Переключение между разными базами эскизов

Сообщение Avada »

По ходу приватного обсуждения в ЛС с участником форума Кабал, запросившим возможность переключения между разным размером эскизов, выяснилось, что задачу можно решить, если одноимённые файлы баз для эскизов с разным размером будут лежать независимо друг от друга в двух разных папках. Например, C:\Totalcmd\Base\1 и C:\Totalcmd\Base\2. Вручную эта методика работает — базы подхватываются, не мешают друг другу и не требуют удаления при переключении кэша.
Чтобы автоматизировать процедуру, хотелось бы получить скрипт, отрабатывающий такую последовательность действий:
1. Открыть диалог настроек на странице "Эскизы" (cm_ThumbnailsConfig).
2. Перевести по Tab (1 раз) фокус на поле "Расположение базы данных".
3. Вставить альтернативный путь, заместив прежний.
5. Перевести по Tab (7 раз) фокус на первое поле размера.
4. Вставить альтернативный размер, заместив прежний.
6. Перевести по Tab (1 раз) фокус на второе поле размера.
7. Вставить альтернативный размер, заместив прежний.
8. Нажать Enter (сохранить изменения и закрыть диалог).
Исходный скрипт с произвольными путём и размерами понадобится отредактировать и сохранить со своими данными как два разных скрипта (переход с меньшего размера эскизов на больший и наоборот), а для двух этих скриптов уже создавать кнопки или em-команды.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

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

args Path, Size1, Size2
local hwnd = win.handle("C=TTOTAL_CMD")
clip.save
clip.clear
clip.set(Path)
wait.for(clip.get)
wait.for(clip.get == Path)
win.postmessage(hwnd, 0x400+51, 482, 0)
*keys {tab}
clip.paste
wait.for(50)
clip.clear
clip.set(Size1)
wait.for(clip.get)
wait.for(clip.get == Size1)
*keys {tab 7}
clip.paste
wait.for(50)
clip.clear
clip.set(Size2)
wait.for(clip.get)
wait.for(clip.get == Size2)
*keys {tab}
clip.paste
wait.for(50)
*keys {enter}
clip.load
Нужны:
1) PowerPro;
2) Плагины win и clip (входят в стандартную поставку).
Кнопка:

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

TOTALCMD#BAR#DATA
e:\Utils\PowerPro\powerpro.exe
runfile.имя_скрипта("e:\новый\путь\к\базе", 128, 128)
E:\путь\к\икноке\иконка.ICO
test", "


-1
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Вахмурка
За вариант с PowerPro спасибо, но хотелось бы также иметь альтернативу без.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Кабал
Сообщения: 1
Зарегистрирован: Вт ноя 22, 2011 04:46

Сообщение Кабал »

Avada. Согласен. Хочется скрипт, который я мог бы применить без дополнительных средств.
Аватара пользователя
Rodny
Сообщения: 949
Зарегистрирован: Ср янв 24, 2007 00:59
Откуда: Могилёв, Беларусь

Сообщение Rodny »

Куда-то скриптописцы подевались...
Кабал писал(а):Хочется скрипт, который я мог бы применить без дополнительных средств.
Script Helper считается за доп. средство?
ChangeCacheBase.vbs

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

'==============================================================================
' Переключение между разными базами эскизов
' http://forum.wincmd.ru/viewtopic.php?t=14269

' Параметры для кнопки (путь - в кавычках)
' Путь Первый_размер Второй_размер

' Необходим Script Helper ActiveX от Volniy
'==============================================================================
Option Explicit
Dim TCS, Path, Size1, Size2
Set TCS = CreateObject("TCScript.Helper")

Path = WScript.Arguments(0)
Size1 = WScript.Arguments(1)
Size2 = WScript.Arguments(2)

'1. Открыть диалог настроек на странице "Эскизы" (cm_ThumbnailsConfig).
TCS.SendCommand(482)
'2. Перевести по Tab (1 раз) фокус на поле "Расположение базы данных".
TCS.SendKeystroke "{TAB}"
'3. Вставить альтернативный путь, заместив прежний.
TCS.SendKeystroke Path
'4. Перевести по Tab (7 раз) фокус на первое поле размера.
TCS.SendKeystroke "{TAB 7}"
'5. Вставить альтернативный размер, заместив прежний.
TCS.SendKeystroke Size1
'6. Перевести по Tab (1 раз) фокус на второе поле размера.
TCS.SendKeystroke "{TAB}"
'7. Вставить альтернативный размер, заместив прежний.
TCS.SendKeystroke Size2
'8. Нажать Enter (сохранить изменения и закрыть диалог)
TCS.SendKeystroke "{ENTER}"

Set TCS = Nothing
Wscript.Quit()
Кнопка

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

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\Scripts\ChangeCacheBase.vbs
"C:\Totalcmd\Base\1" 128 128
%WINDIR%\System32\WScript.exe
Переключение между разными базами эскизов


-1
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Rodny
Спасибо, работает. А Script Helper лично я согласен за доп. средство не считать, так что результат вполне устраивает.
Только (пояснение для новичков) кнопок там, разумеется должно быть две (вторая создаётся на основе первой с изменением пути к базе и размеров).
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Прошу подсказать, как при использовании имеющегося скрипта от Rodny обеспечить возможность корректно вставлять путь к базе, содержащий переменную %Commander_path% — без искажений и обязательно с сохранением этой переменной. При указании переменной в кнопке в поле "Параметры" номер не проходит ни с одиночными символами процента, ни с удвоенными: вставляется усечённый путь. Если же указывать путь в поле "Команда", переменная раскрывается правильно, но вставленный путь сохраняется в явном виде.
На уже имеющиеся темы с обсуждением сходного вопроса прошу не ссылаться: мне нужно решение именно в данной конкретной ситуации.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Так?

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

Set WshShell = WScript.CreateObject("WScript.Shell")
Path = Replace (WScript.Arguments(0), "%Commander_path%", WshShell.ExpandEnvironmentStrings("%Commander_path%"))
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada писал(а):с сохранением этой переменной
Зачем? Она же раскрываться должна.

Lev, WSH без объявления переменной через DIM не работает, поэтому лучше сразу вызывать:

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

Path = CreateObject("WScript.Shell").Environment("Process")("COMMANDER_PATH")
Это я скидывал клиенту ещё до Rodny:

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

' Переключаться между 2-мя размерами эскизов
'===========================================
With CreateObject("TCScript.Helper")
  If .INIRead(.MainINI, "Configuration", "ThumbHeightNoCache", "") = "80" Then
    F = "2"   ' Задаём имя папки ( 1 символ)
    W = "120" ' Задаём ширину
    H = "120" ' Задаём высоту
  Else
    F = "1"
    W = "80"
    H = "80"
  End If
  .SendCommand 482
  .SendKeystroke "{TAB}{END}{BS}" & F & "{TAB 7}" & W & "{TAB}" & H & "~"
  .INIWrite .MainINI, "Configuration", "ThumbHeightNoCache", H
End With
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Lev
Сообщения: 392
Зарегистрирован: Ср мар 02, 2005 16:34

Сообщение Lev »

Flasher писал(а):Lev, WSH без объявления переменной через DIM не работает, поэтому лучше сразу вызывать
Во первых предлагалась правка к скрипту, где все переменные объявлены
Во вторых - впервые слышу, что "WSH без объявления переменной через DIM не работает". У меня уже десяток лет без объявлений wsh трудится. Может у Вас Option Explicit в каждом скрипте воткнут?
В третьих - перед постом протестировал свою пару строчек
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Раскрываться должна. Но и сохранение изменённой записи с переменной крайне желательно. Иначе никакой портабельности не получается. Запускаю TC с флэшки, а он обращается к базе не внутри текущего каталога TC (допустим, K:\Totalcmd\Base\1), а к другой, согласно указанному в параметрах кнопки местоположению на жёстком диске (C:\Totalcmd\Base\1). Опять же на разных машинах у флэшки буквы меняются...
Что касаемо последнего скрипта, то одна кнопка вместо двух, конечно, экономит место (хотя и в применении двух кнопок есть свои преимущества.) Но мне совершенно не нужны ни периодически вылезающий запрос на удаление кэша в результате изменения размера эскизов, ни само это удаление. И здесь, как и в нынешнем варианте Rodny, не решена проблема использования пути с переменной и сохранения затем пути ровно в том же (а не в раскрытом и не в испорченном!) виде.

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

Сообщение Flasher »

Lev
1. Переменные объявлены только те, что фигурируют в скрипте, WshShell там не было.
2. Я много раз сталкивался. На Win7 проверялось?
Option Explicit не использую нигде. Это для отладки.
3. Там есть какие-то завязки, когда объектов в скрипте несколько, и вызываются их методы. Отдельно WSH, может, и работает.

Avada писал(а):одна кнопка вместо двух, конечно, экономит место
Так было изначально запрошено.
Avada писал(а):Но мне совершенно не нужны ни периодически вылезающий запрос на удаление кэша в результате изменения размера эскизов, ни само это удаление.
Не должно быть. Главное, что в ключе должно быть указано правильное название папки:
ThumbsLocation=%COMMANDER_PATH%\Thumbs\2
В папке "2" - эскизы 120х120, в папке "1" - 80х80. В 4 строчке скрипта значение должно соответствовать значение размера эскизов из папки "1", т.е. 80.
Avada писал(а):И здесь, как и в нынешнем варианте Rodny, не решена проблема использования пути с переменной и сохранения затем пути ровно в том же (а не в раскрытом и не в испорченном!) виде.
Тут этой переменной вообще нет, она не нужна.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher писал(а):Так было изначально запрошено.
Изначально я запрашивал две кнопки.
Flasher писал(а):Не должно быть. Главное, что в ключе должно быть указано правильное название папки
Это уже не папка, а путь к ней. И правильным путём будет тот, который я таковым считаю и хочу указать, не правда ли? На данный момент, к примеру, у меня на домашнем компе это C:\Totalcmd\Profile\Base\2. Без Thumbs. И с помощью скрипта (и, соответственно, кнопки или их пары) я хочу, чтобы этот путь после смены базы записался в INI-файл в нужном мне виде, как %Commander_path%Profile\Base\2. И альтернативный путь (к папке 1) точно так же. Если это реально, конечно. А что на самом деле главное, см. далее.
Flasher писал(а):В папке "2" - эскизы 120х120, в папке "1" - 80х80. В 4 строчке скрипта значение должно соответствовать значение размера эскизов из папки "1", т.е. 80.
У меня другие размеры: 128x128 и а 96x96. В этом-то и было дело. Исправил в скрипте на свои — вылезание предупреждения прекратилось.
Flasher писал(а):Тут этой переменной вообще нет, она не нужна.
Вообще не нужна или тут не нужна? Потому что мне (см. всё предыдущее) она вот именно что нужна.
Последний раз редактировалось Avada Вт мар 26, 2013 19:47, всего редактировалось 1 раз.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Avada писал(а):Изначально я запрашивал две кнопки.
Я про автора первичного запроса.
Avada писал(а):И правильным путём будет тот, который я таковым считаю и хочу указать, не правда ли? На данный момент, к примеру, у меня на домашнем компе это C:\Totalcmd\Profile\Base\2. Без Thumbs.
Если Thumbs указан зелёным цветом, то нужно понимать, что это изменяемая по усмотрению часть пути. В твоём случае это Profile\Base.
Avada писал(а):И с помощью скрипта (и, соответственно, кнопки или их пары) я хочу, чтобы этот путь после смены базы записался в INI-файл в нужном мне виде
Оно так и происходит, через диалог.
Avada писал(а):Вообще не нужна или тут не нужна?
Переменная в скрипте не нужна. Или у тебя меняется Profile\Base?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher писал(а):Я про автора первичного запроса.
Так в этой теме я и есть такой автор. У Кабал одно сообщение, и оно идёт после моего. Всё предыдущее обсуждалось до создания темы в личке. Впрочем, это неважно.
Flasher писал(а):Если Thumbs указан зелёным цветом, то нужно понимать, что это изменяемая по усмотрению часть пути. В твоём случае это Profile\Base.
Понял.
Flasher писал(а):Оно так и происходит, через диалог.
Нет. Запись идёт в явном виде. (С сообщением, как сказано выше, уже разобрался).
Flasher писал(а):Или у тебя меняется Profile\Base?
У меня — нет. Только цифровое имя подкаталога для конкретной базы.
Если вставить в диалоге в поле "Расположение базы данных" путь к нужной папке, содержащий переменную, он записывается в INI-файл с этой переменной. Тотал её видит и обрабатывает правильно. Что и требуется. То есть задача в принципе решаема. Осталось понять, каким образом её корректно вставить на уровне скрипта, чтобы в кнопке не указывать.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Ответить