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

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

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

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

Сообщение Flasher »

Avada писал(а):Всё предыдущее обсуждалось до создания темы в личке.
Запрос-то изначально не в личке был. :wink:
Avada писал(а):Нет. Запись идёт в явном виде.
В смысле? Открывается диалог, правится путь и подтверждается, тем самым запись в ini меняется.
Avada писал(а):Что и требуется. То есть задача в принципе решаема.
Да, и именно так она решена в моём скрипте.
Avada писал(а):Осталось понять, каким образом её корректно вставить на уровне скрипта, чтобы в кнопке не указывать.
В моём скрипте разве для кнопки что-то нужно указывать?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

Flasher
Кажется, всё заработало так, как следует. Спасибо, буду ещё смотреть. При наличии проблем сообщу.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
SilverVox
Сообщения: 25
Зарегистрирован: Сб июн 13, 2009 19:18
Откуда: Русь

Сообщение SilverVox »

Я недавно решал аналогичную проблему для себя, ну вот поделюсь и своим решением.
Правда я по специальности художник, и в программировании дилетант полный, раньше писал только батники и то по мере крайней надобности. На VBS, это практически мой первый скрипт, не учитывая разных там "Привет Мир", поэтому попрошу знающих людей жестоко не критиковать мою работу, а по возможности соизволить помочь исправить разные там неприятные глазу проблемы компоновки и оптимизации кода. Потому-что я практически не знаю синтаксиса и все это я сваял исключительно подсматривая в примеры других скриптов. Но несмотря на мою недалекость, у меня все работает более года, вот недавно только (после обнаружения данной темы) внес кое-какие актуальные исправления, прежде чем выложить.

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

'==========================================================
'VBS
'Имя Файла: ChangeSizeThumbnails.vbs
'Автор:     SilverVox
'Версия:    1.1
'Дата:      17.09.2014
'
'Производит изменение размеров эскизов для TotalCommander.
'Размер передается в параметрах командной строки.
'Для работы нужен WSH Helper for TC by Volniy
'
'Параметры вызова:
'   {Ширина} {Высота}
'==========================================================


Option Explicit
Dim TCS, Width, Height, MaxValue, ThumbsLocation
Set TCS = CreateObject("TCSCRIPT.Helper")
TCS.Pause = 100
TCS.Wait = True
TCS.LockTC True

MaxValue = 560      'Максимально допустимое значение размеров (Можно изменять на свое усмотрение)

If not TCS.IsRunningTC Then
        MsgBox "Процесс TotalCmd.exe не найден.", vbCritical + vbOKOnly, "Ошибка!"
        Quit(1)
End If

If WScript.Arguments.Count < 2 Then
        MsgBox "Неверное количество параметров.", vbCritical + vbOKOnly, "Ошибка параметров командной строки!"
        Quit(2)
End If

Width =  CorrectedValue(WScript.Arguments(0))
Height = CorrectedValue(WScript.Arguments(1))

TCS.GetINIFiles
ThumbsLocation = TCS.INIRead(TCS.MainINI, "Configuration", "ThumbsLocation")

If ThumbsLocation = "" Then
    TCS.SendCommand 482
    TCS.SendKeystroke "{TAB 8}" & Width & "{TAB}" & Height & "{ENTER}"
Else
    If Right(ThumbsLocation, 1) = "\" Then ThumbsLocation = Mid(ThumbsLocation, 1, Eval(Len(ThumbsLocation)-1))
    With CreateObject("Scripting.FileSystemObject")
        If SplitChkValue(.GetFileName(ThumbsLocation)) Then
            ThumbsLocation = .GetParentFolderName(ThumbsLocation)
        End if
    End With
    If Right(ThumbsLocation, 1) <> "\" Then ThumbsLocation = ThumbsLocation & "\"
    ThumbsLocation = ThumbsLocation & Width & "X" & Height
    ThumbsLocation = Replace(ThumbsLocation, "%", "{%}")
    TCS.SendCommand 482
    TCS.SendKeystroke "{TAB}{BS}" & ThumbsLocation & "{TAB 7}" & Width & "{TAB}" & Height & "{ENTER}"
End If

Quit(0)



'===== СубПроцедуры =============================================================

Function SplitChkValue(Value)
        Dim SbStr, Num
        SplitChkValue = True
        Num = 0
        For Each SbStr In Split(Value, "X")
            Num = Eval(Num+1)
            If Not ChkValue(SbStr) Then SplitChkValue = False
        Next
        If Num <> 2 Then SplitChkValue = False
End Function

Function ChkValue(Value)
    Dim N
    ChkValue = False
    If IsNumeric(Value) Then
        If Trim(Value) = Value Then
            Value = CCur(Value)
            For N = 1 To Eval(MaxValue/8)
                If Value = Eval(N*8) Then
                    ChkValue = True
                End If
            Next
        End If
    End If
End Function

Function CorrectedValue(Value)
    Dim N, PrvN
    If IsNumeric(Value) Then
        Value = Int(Value)
        If Value < 8 Then
            MsgBox "Значения параметров выходят за границы допустимой области.", vbCritical + vbOKOnly, "Ошибка параметров командной строки!"
            Quit(3)
        End If
        If Value > MaxValue Then
            MsgBox "Значения параметров выходят за границы допустимой области.", vbCritical + vbOKOnly, "Ошибка параметров командной строки!"
            Quit(4)
        End If
        PrvN = 0
        For N = 1 To Eval(MaxValue/8)
            If Value < Eval(N*8) Then
                If Value > Eval(PrvN*8) Then
                    If Eval(N - PrvN) < 4 Then Value = Eval(PrvN*8)
                    If Eval(N - PrvN) > 4 Then Value = Eval(N*8)
                End If
            End If
            PrvN = N
        Next
    Else
        MsgBox "Нечисловые значения в параметрах.", vbCritical + vbOKOnly, "Ошибка параметров командной строки!"
        Quit(5)
    End If
    CorrectedValue = Value
End Function


Sub Quit(Errorlevel)
  Set TCS  = Nothing
  WScript.Quit Errorlevel
End Sub

Использование:
ChangeSizeThumbnails.vbs {Ширина} {Высота}

Описание:
Посредством командной строки можно указывать любые размеры (в разумных пределах). Если используется кэширование, то в каталоге по заданному пути создаются папки с именами используемых размеров (по типу: "128x128"), что снижает вероятность конфликтных ситуаций несоответствия указываемых в настройках размеров с размерами уже существующей базы эскизов. Ну и вроде все в общем.


Пример кнопки:

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

TOTALCMD#BAR#DATA
ChangeSizeThumbnails.vbs
128 128
WCMICONS.dll,26
128x128
%commander_path%\System\
0
-1
Если струну не дотянуть – она не будет звучать.
Если перетянуть – она лопнет.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

SilverVox
Художник что рисует - дождь? :wink:
Нехилый такой художник, если первый "блин" в таком ракурсе рождается - с использованием функций и т. п.
Тут особо критиковать нет смысла. Просто если человек предпочитает быструю работу, то он не будет запариваться по куче отладочных проверок, ему достаточно соблюдать правила введения данных. Иные могут делать по своему и навешивать на скрипт сколько угодно условий. Я лично в таких простых и требующих резкости задачах стараюсь этого избегать. Да и реверсное переключение, предложенное мной, куда приятнее в плане оптимальности.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
SilverVox
Сообщения: 25
Зарегистрирован: Сб июн 13, 2009 19:18
Откуда: Русь

Сообщение SilverVox »

Рисую иллюстрации для детских книг, ну и официальная моя профессия, специалист ДПИ в области художественных изделий из дерева метала и керамики.

Ну а насчет первого блина, то это относительно VBS, я работал когда-то с MSDOS и научился писать батники аналогичной сложности. Но командная строка далеко не все умеет, и со временем для решения некоторых задач захотелось чего-то посерьезней. Вот попробовал разобратся в VBS, так как на моем компе было несколько примеров скриптов, и на тот момент не было доступа в нет, то все познания получил из них. Теперь буду искать какую то литературу по синтаксису, может что-то из этого получится.
На самом деле я простой пользователь, который постоянно недоволен теми или иными недостатками и неудобствами, просто хочется сделать свою рабочую среду удобной и стабильной, так как я рисую в основном на компе.

Ну а проверки я "навесил" только, как мне показалось, самые необходимые, я люблю хоть минимум, но надежности.
В ходе экспериментов выяснилось, что в размерах эскизов могут быть только значения из ряда полученного в результате умножения 8 на ряд простых чисел, а если задать несоответствующий размер то командер его скорректирует до ближайшего значения. А так как идея моего подхода заключалась в возможности передать любой размер, и создавать для каждого значения свой каталог для кэша с именем соответствующим размеру, то просто пришлось проверять входящие значения и корректировать их в соответствии. Ну и посчитал нужным продумать возможность корректной работы в условиях без кэширования. Остальное возможно было и лишним, в умелых руках все и так работает как надо, а скорость работы, экономия оперативной памяти (и своего времени), часто бывают очень важным фактором. Но как по мне, когда делаешь для себя, то хочется один раз сделать так, чтобы использование было менее обусловленным, тем более если хочется поделится своим творением с друзьями.

Насчет реверсного переключения согласен, это действительно очень удобно, я на момент решения проблемы почему-то и не подумал о такой возможности.

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

Сообщение Flasher »

SilverVox писал(а):Но как по мне, когда делаешь для себя, то хочется один раз сделать так, чтобы использование было менее обусловленным, тем более если хочется поделится своим творением с друзьями.
ИМХО, если человек заморочился по данной теме, то вводить заведомо правильные величины для него труда не составит.
SilverVox писал(а):Насчет реверсного переключения согласен, это действительно очень удобно
Конечно. Как правило двух режимов более чем достаточно. Кстати, можно в таком ключе ещё обычную кнопку с TCFS2 сварганить. Могу позже сделать.
[cut]
SilverVox писал(а):Теперь буду искать какую то литературу по синтаксису, может что-то из этого получится.
Могу подкинуть в ЛС, у меня этого добра навалом. )[/cut]
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
SilverVox
Сообщения: 25
Зарегистрирован: Сб июн 13, 2009 19:18
Откуда: Русь

Сообщение SilverVox »

ИМХО, если человек заморочился по данной теме, то вводить заведомо правильные величины для него труда не составит.
Возможно вы правы, я не имею достаточного опыта в данной области, многое еще не понимаю.

А с TCFS2 я еще пока не сталкивался, было бы интересно.

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

Сообщение Flasher »

SilverVox писал(а):А с TCFS2 я еще пока не сталкивался, было бы интересно.
Забыл выложить в своё время аналог данного решения:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\
Utils\TCFS2\TCFS2.exe
/ef "msg($0B, 0) tcm(482,1) if(tcini(Configuration, ThumbHeightNoCache,
80), eval(send_wait(`{TAB}{END}{BS}2{TAB 7}120{TAB}120{ENTER}`, findwnd(`TDLGCONFIGALL`)))+set_tcini(Configuration, ThumbHeightNoCache, 120), eval(send_wait(`{TAB}{END}{BS}1{TAB 7}80{TAB}80{ENTER}`, findwnd(`TDLGCONFIGALL`)))+set_tcini(Configuration, ThumbHeightNoCache, 80)) delay(20) tcm(330) msg($0B, 1) tcm(330)"
wcmicons.dll,26
Эскизы:
80/120 пикселей
Avada, можешь проверить.
Последний раз редактировалось Flasher Сб янв 03, 2015 05:33, всего редактировалось 2 раза.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

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

Сообщение Flasher »

Avada
Ну, да. И никакого Хелпера. :wink:
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Avada писал(а):По сравнению с предыдущим решением почти совсем не вылезает диалог настроек.
Предыдущее решение можно ускорить, если перед If задать стандартную задержку для операций не 70 миллисекунд (по умолчанию), а ноль

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

.Pause = 0
А чтобы не передёргивался экран можно добавить в начале записи (после строки With)

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

.LockTC True 
а в конце (перед строкой End With)

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

.LockTC False
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

sa писал(а):А чтобы не передёргивался экран
Эта блокировка не влияет на появление окон, экран не передёргивается, тут иной эффект, поэтому смысла ставить её нет никакого.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

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

Сообщение Flasher »

Я бы сформулировал иначе.
Каждый может попробовать в данном скрипте добавить блокировку и убедиться, что смысл в её применении отсутствует.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
sa
Сообщения: 2758
Зарегистрирован: Ср апр 29, 2009 18:56

Сообщение sa »

Разницу в поведении можно увидеть (или не увидеть) на примере скрипта, который просто вызывает диалог настройки и тут же закрывает его, ничего не изменяя при этом.
Без блокировки:

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

With CreateObject("TCScript.Helper")
  .SendCommand 490
  .SendKeystroke "{ENTER}"
End With 
С блокировкой:

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

With CreateObject("TCScript.Helper")
  .LockTC True
  .SendCommand 490
  .SendKeystroke "{ENTER}"
  .LockTC False
End With
Ответить