Обмен кнопками
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3 ... 43, 44, 45  :| |:
Total Commander -> Секреты и советы

#661:  Author: sa PostPosted: Sat Jul 25, 2020 08:57
    —
Вариант для TC 9.0+ с блокировкой перерисовки активного файлового списка (как в предыдущем сообщении, но без команды 2918 - Обновить выбранные эскизы, которая может сильно нагружать TC при выделении графических файлов):
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef "if(msg($432,1004+msg($432,1000))==2,sendmsg(msg($432,3),$0B,0)+tcm(2049)+tcm(2053)+tcm(2053) +varset(1,msg($432,1006+msg($432,1000)))+tcm(2054)+msg($433,2936,varget(1)-msg($432,1006+msg($432,1000)))+sendmsg(msg($432,3),$0B,1)+tcm(2017),tem(em_>Выделите_2_объекта!))"
WCMICONS.DLL,39
Добавить выделение файлов/папок между двумя выделенными
Поскольку обнаружил, что в этом варианте блокировки всё-таки требуется итоговая перерисовка списка, а универсальной команды (кроме redraw с передёргиванием всего окна TC) для этого пока не найдено, то в итоге от блокировки отказался, а здесь приведу ещё одну "заплатку" для рассматриваемого случая. Для перерисовки в код кнопки добавлена команда 2017- Копировать в буфер имена файлов, но она затрёт буфер обмена именами выделенных файлов...

Last edited by sa on Wed Jul 29, 2020 21:30; edited 1 time in total

#662:  Author: FlasherLocation: Москва PostPosted: Sat Jul 25, 2020 11:54
    —
Quote:
как в предыдущем сообщении, но без команды 2918
Для варианта с правильным сообщением это поправимо.

#663:  Author: sa PostPosted: Mon Jul 27, 2020 17:50
    —
При остающемся неизменным алгоритме работы кнопки (перейти к первому выделенному объекту и выполнить команду "2936 Выделить файл под курсором, перейти к следующему" с параметром, равным разности запрошенных у TC номеров выделенных объектов), добавлю ещё один способ организации сообщения об ошибке – в заголовке, у меня там шрифт крупнее, чем в самом окне Smile :
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef "if(msg($432,1004+msg($432,1000))==2,tcm(2049)+tcm(2053)+tcm(2053)+varset(1,msg($432,1006+msg($432,1000)))+tcm(2054) +msg($433,2936,varget(1)-msg($432,1006+msg($432,1000))),tem(`em_>Выделено:<`msg($432,1004+msg($432,1000))`>`)+eval(settext_wait(`Выделите 2 объекта!`,findwnd(`#32770`))))"
WCMICONS.DLL,39
Добавить выделение файлов/папок между двумя выделенными
Сообщение, у которого меняется заголовок, может быть заголовком сообщения о нереализованной функции, как например, для функции tem(`em_>…>`) в коде кнопки или для более коротких функций вроде tem(em_) и tcm(1,1). А может быть и заголовком сообщения какой-нибудь внутренней команды TC, например, "О программе" tcm(690,1) или "Подсчитать занимаемое место" tcm(530,1) – может пригодиться при выделении файлов в обычных папках. Для пробы любую из этих функций надо вставить вместо tem(`em_>…>`), перед +eval.

P.S.Пришлось снова отказаться от блокировки/разблокировки теперь уже активного файлового списка sendmsg(msg($432,3),$0B,0/1): после неё тоже требуется дополнительная перерисовка панели. Заметно в случае, когда выделение остаётся неизменным по составу объектов, хуже того, если при этом ещё и смещается на панели в другое место. Можно увидеть на примере кнопки из предыдущего сообщения.
Стандартный вариант с redraw() не нравится, команда 2918 и сдвоенные 2012 (или 330) имеют свои недостатки.


Last edited by sa on Tue Jul 28, 2020 16:38; edited 1 time in total

#664:  Author: FlasherLocation: Москва PostPosted: Tue Jul 28, 2020 12:30
    —
Это всё, конечно, весело-забавно, не иначе как для топика "околокоммандерный ЮмАр". )
Но я лучше предложу что-то поинтересней с добавкой в свой код 3-х вн. команд, дабы не зависеть от числа 2 и не заморачиваться со случайным выделением в процессе выбора элементов:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef
if(msg(1074,msg(1074,1000)+1004)>1,sendmsg(msg(1074,3),$0B,0)+tcm(2057)+tcm(2054)+tcm(2053)+varset(1,msg(1074,1006+msg(1074,1000)))+tcm(2049)+tcm(2054)+tcm(2053)+tcm(2054)+msg(1075,2936,varget(1)-msg(1074,1006+msg(1074,1000)))+sendmsg(msg(1074,3),$0B,1),tcm(-1,1)+eval(settext_wait("`         [✖] Ошибка! Выделите > 1 объекта!`",findwnd(Static,,findwnd(#32770)))))
wciconex.dll,46
Выделить всё в границах крайних выделенных объектов
Если курсор стоял выше последнего выделенного объекта, то для избежания артефактов обновление эскизов можно вызывать только в случае совпадения числа до и после выделения:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef
varset(1,msg(1074,msg(1074,1000)+1004)) if(varget(1)>1,sendmsg(msg(1074,3),$0B,0)+tcm(2057)+tcm(2054)+tcm(2053)+varset(2,msg(1074,1006+msg(1074,1000)))+tcm(2049)+tcm(2054)+tcm(2053)+tcm(2054)+msg(1075,2936,varget(2)-msg(1074,1006+msg(1074,1000)))+sendmsg(msg(1074,3),$0B,1)+if(varget(1)==msg(1074,msg(1074,1000)+1004),tcm(2918)),tcm(-1,1)+eval(settext_wait("`         [✖] Ошибка! Выделите > 1 объекта!`",findwnd(Static,,findwnd(#32770)))))
wciconex.dll,46
Выделить всё в границах крайних выделенных объектов
Но понятно, что мало кому понадобиться выделять уже выделенное. Wink

#665:  Author: sa PostPosted: Fri Jul 31, 2020 17:13
    —
При так и остающемся неизменным алгоритме работы кнопки, ещё пара способов сообщения об ошибке. Первый - с командой cm_List, позволяющий использовать пробелы в строке внушительных размеров, с большим восклицательным знаком, подойдёт при работе в обычных папках:
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef "if(msg($432,1004+msg($432,1000))==2,tcm(2054)+tcm(2053)+tcm(2053)+msg($433,2936,msg($432,1006+msg($432,1000))+ tcm(2054)-msg($432,1006+msg($432,1000))),tem(`cm_List Вместо `msg($432,1004+msg($432,1000))` выделите 2 объекта!`))"
WCMICONS.DLL,39
Добавить выделение файлов/папок между двумя выделенными
Второй - если требуется универсальное средство. MVV (автор TCFS2) предлагал на форуме в пользовательских командах тотала прописать утилиту, которая показывает окошки с сообщениями и выкладывал простейшую программку для этого, размером с килобайт. В файле usercmd.ini она может быть записана, например, так:
Quote:
[em_MsgBox]
cmd=%COMMANDER_PATH%\Addon\TCFS2\MessageBox.exe
param=%Z%A
Чтобы использовать её в кнопке, достаточно вместо cm_List указать em_MsgBox.

#666:  Author: palle PostPosted: Sun Apr 25, 2021 21:10
    —
Циклическое изменение размера эскизов.

Code:

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Plugins\ADD\TC\TCFS2\TCFS2.exe
/ef "if(S_viewMode==269, if(eval(tcini(AllResolutions, TCFSThumbScaleFactor, #))==16, msg($0433, 2953, 32, 0) + set_tcini(AllResolutions, TCFSThumbScaleFactor, 32), if(eval(tcini(AllResolutions, TCFSThumbScaleFactor, #))==32, msg($0433, 2953, 49, 0) + set_tcini(AllResolutions, TCFSThumbScaleFactor, 49), if(eval(tcini(AllResolutions, TCFSThumbScaleFactor, #))==49, msg($0433, 2953, 100, 0) + set_tcini(AllResolutions, TCFSThumbScaleFactor, 100), if(eval(tcini(AllResolutions, TCFSThumbScaleFactor, #))==100, msg($0433, 2953, 16, 0) + set_tcini(AllResolutions, TCFSThumbScaleFactor, 16), msg($0433, 2953, 16, 0) + set_tcini(AllResolutions, TCFSThumbScaleFactor, 16))))), tcm(269))"
shell32.dll,96
Изменить размер эскизов|вкл. -> 16% -> 32% -> 49% -> 100%


-1

#667:  Author: sa PostPosted: Thu Dec 16, 2021 16:50
    —
На основе запроса. Кнопка с утилитой TCFS2.
Функции дополнительного модуля TCFS2Tools не используются.
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe /ef "set_ini(`%COMMANDER_PATH%\usercmd.ini`, em_cd, cmd, `cd`) set_ini(`%COMMANDER_PATH%\usercmd.ini`, em_cd, param, `%A%Z`)"
/ei "swCD (     `|*\`     ,     `*.*`     )"
wcmicons.dll,24
Переключатель: только файлы ( ||*\ ) и все ( *.* )
В файле TCFS2.ini, в секцию [Items] потребуется добавить строки:
Code:
swCD_L=set_style(# & ~$00000010) tem(`em_cd `#2), style(# & $00000010) | set_style(# | $00000010) tem(`em_cd `#1)
swCD_R=set_style(# & ~$00000020) tem(`em_cd `#2), style(# & $00000020) | set_style(# | $00000020) tem(`em_cd `#1)
swCD=run_item(swCD_R, #1, #2), eval(msg($432,1000)-1) | run_item(swCD_L, #1, #2)
Кнопка использует тоталовскую команду CD и может применяться для переключения между двумя вариантами фильтрации (по маскам файлов или сохранённым шаблонам поиска, перед именем шаблона требуется указание символа >), а также для попеременной смены каталога/архива или позиционируемого файла в панели (в сочетании с фильтрацией или без неё).
Варианты должны быть заключены в косые кавычки `` и записаны через запятую.
Если пользовательская команда em_cd в TC уже создана, то последовательность /ef “set _ini … `%A%Z`)" в кнопке можно убрать.

#668:  Author: sa PostPosted: Thu Apr 27, 2023 14:41
    —
Кнопка на основе запроса.
Code:
TOTALCMD#BAR#DATA
cm_SelectAllBoth,em_MoveToParent,cm_GoToParent,cm_CountDirContent,cm_Delete

WCMICONS.DLL,63
Переместить ВСЕ ФАЙЛЫ и ПАПКИ на уровень вверх|и предложить удалить родительскую папку
Потребуется завести в usercmd.ini пользовательскую команду:
Code:
[em_MoveToParent]
cmd=MULTIRENAME==MoveToParent
а в инструменте группового переименования (Ctrl+M) в качестве маски для имени файла записать ..\[N] (оставив все остальные параметры по умолчанию) и сохранить шаблон (F2) с именем MoveToParent.
Версия TC 10.50 и свежее.
Если родительская папка не была удалена (или была воссоздана), то в ИГП работает функция отката для перемещённых объектов.

#669:  Author: sa PostPosted: Thu Sep 28, 2023 15:19
    —
Кнопка для переименования файла/папки под курсором в инструменте группового переименования (ИГП).
В диалоге ИГП имя и расширение редактируются в отдельных полях, видны старое и новое имя, после переименования есть возможность отката (в том числе и после закрытия ИГП, но в рамках текущего сеанса работы TC).
Code:
TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utils\TCFS2\TCFS2.exe
/ef "tem(cm_ClearAll) varset(1,msg($432,1006+msg($432,1000))-msg($432,1008+msg($432,1000))) if(varget(1)<0, varset(1,2147483647)) tem(cm_Select) tem(`cm_GoToFirstEntry `varget(1)) tem(cm_ClearAllFiles) set_ini(`%%COMMANDER_PATH%%\usercmd.ini`, em_temp, cmd, `MULTIRENAME $tmp`) if(msg($432,1004+msg($432,1000)),set_tcini(Rename, $tmp_name, `%N`)+set_tcini(Rename, $tmp_ext)+tem(cm_ClearAllFolders), set_tcini(Rename, $tmp_name, `"%O"`)+set_tcini(Rename, $tmp_ext, `"%E"`)) set_tcini(Rename, $tmp_params, `0|1|1|1`) set_tcini(Rename, $tmp_search, `*\`) set_tcini(Rename, $tmp_replace) tem(em_temp)"
WCMICONS.DLL,46
Переименовать в ИГП файл/каталог под курсором


-1
Требуется утилита TCFS2. Функции дополнительного модуля TCFS2Tools не используются.
Версия TC 9.0 и свежее.

#670:  Author: Orion9 PostPosted: Sat Feb 24, 2024 13:08
    —
Довольно простой, но эффективный способ переключения иконки на панели инструментов (для любой кнопки) при помощи плагина Autorun и TCFS2.

Пример для команды 2957.
Code:

TOTALCMD#BAR#DATA
%COMMANDER_PATH%\Utilites\TCFS2\TCFS2.exe
/ef "msg($0B, 0, 0) tcm(2957) msg(regmsg(ColorMessage), 0, 0) tcm(2945) msg($0B, 1, 0) run_item(update)"
%COLOR_ICON%
Цвета для типов файлов (вкл./выкл.)


-1

autorun.cfg
Code:
Func SetColorByType()
   IniRead nIco %COMMANDER_INI% "Configuration" "ColorFilters" 1
   If nIco = 1 Then
      SetEnv COLOR_ICON "%COMMANDER_PATH%\Icons\Clsw\2.ico"
   Else
      SetEnv COLOR_ICON "%COMMANDER_PATH%\Icons\Clsw\6.ico"
   EndIf   
EndFunc

SetMessageAction "ColorMessage" SetColorByType

Единственный недостаток - иконки должны быть в виде отдельных фалов, TC не раскрывает переменную окружения с индексом (через запятую) как следует.



Total Commander -> Секреты и советы


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3 ... 43, 44, 45  :| |:
Page 45 of 45

Powered by phpBB © 2001, 2005 phpBB Group