View previous topic :: View next topic |
Author |
Message |
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Mon Apr 27, 2015 16:18 Post subject: |
|
|
sa wrote: | Разве не о том глобальном? | О нём. А что это меняет? _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Tue Apr 28, 2015 02:01 Post subject: |
|
|
Обновлённое решение на AutoHotkey.
Работает в большинстве ситуаций (вид без каталогов, архивы, виртуальные панели, один файл/каталог в панели и т.д..).
Не работает в режиме просмотра миниатюр (ограничение Тотала на вызов LB-комманд в этом режиме) и в режиме просмотра результатов поиска в архиве (тоже ограничение)
Code: | ;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Total Commander DreamLair
; Script: Zebra file selection
; Скрипт: Выделение файлов зеброй
; Script version: 3.2.1 (2015.04.30)
; Script author: LonerD
; Made in Donetsk People's Republic
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Parameters:
; 1) Selection mode:
; 1 - all; 2 - only files; 3 - only dirs
; 2) Selection position:
; 1 - begin from 1st file; 2 - from 2nd; 10 - from 10th
; 0 - begin from file under cursor
; 3) Selection range:
; 2 - each 2nd file, 3 - each third file etc
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Параметры:
; 1) Метод выделения:
; 1 - всё; 2 - только файлы; 3 - только каталоги
; 2) Позиция выделения:
; с какого файла начинать (с первого, второго и т.д...)
; 0 - начинать с файла под курсором
; 3) Порядок выделения:
; 2 - каждый второй файл, 3 - каждый третий и т.д....
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#NoEnv
#NoTrayIcon
#MaxMem 1024
#SingleInstance force
SetBatchLines, -1
Mode = %1%
First = %2%
Range = %3%
If 0 < 3
Range = 2
If 0 < 2
First = 1
If Mode not in 1,2,3
Mode = 1
If not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") )
ExitApp
ClipSaved := ClipboardAll
Clipboard := ""
WinGet, hw_TTOTAL_CMD, ID, A
ControlGetFocus, aControl, % "ahk_id " hw_TTOTAL_CMD
DllCall("LockWindowUpdate", "uint", hw_TTOTAL_CMD)
SendMessage, 0x433, 524,,, % "ahk_id " hw_TTOTAL_CMD
if ( First = 0 )
{
; FirstFile := TC_Command("0x188", aControl, 0, 0)
FirstFile := TC_SendData("SI")
if ( FirstFile = 0 )
{
FirstFileName := TC_SendData("SN")
if ( FirstFileName = ".." )
FirstFile := 1
}
else
{
SendMessage, 0x433, 2021,,, % "ahk_id " hw_TTOTAL_CMD
FirstFileName := Clipboard
}
}
else
FirstFile := First
SendMessage, 0x433, 330 . Mode,,, % "ahk_id " hw_TTOTAL_CMD
SelItems := TC_Command("0x190", aControl, 0, 0)
if ( SelItems = 0 )
Goto, Exit
Path := TC_SendData("SP")
SendMessage, 0x433, 2021,,, % "ahk_id " hw_TTOTAL_CMD
FileList := Clipboard
Clipboard := ""
if ( SelItems = 1 )
{
StringRight, Right_Simbol, FileList, 1
If ((( Right_Simbol = "\" ) && ( Mode = 2 ) ) || (( Right_Simbol != "\" ) && ( Mode = 3 )))
{
SendMessage, 0x433, 524,,, % "ahk_id " hw_TTOTAL_CMD
Goto, Exit
}
}
StringReplace, FileList, FileList, % Path, , All
StringReplace, FirstFileName, FirstFileName, % Path, , All
if ( First = 0 )
{
if ( Mode = 2 )
{
StringRight, Right_Simbol, FirstFileName, 1
If ( Right_Simbol = "\" )
FirstFile := 1
}
Loop, Parse, FileList, `n, `r
{
if ( A_LoopField = FirstFileName )
{
FirstFile := A_Index
Break
}
}
}
FileListSel := ""
Loop, Parse, FileList, `n, `r
{
if ( Mod(A_Index - FirstFile + 1,Range) = 1 )
FileListSel := FileListSel "`r`n" A_LoopField
}
Clipboard := FileListSel
SendMessage, 0x433, 2033,,, % "ahk_id " hw_TTOTAL_CMD
Exit:
Clipboard := ClipSaved
ClipSaved := ""
FileList := ""
FileListSel := ""
DllCall("LockWindowUpdate", "uint", 0)
ExitApp
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Доп. функция (автор я)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TC_Command(TCmessage, aControl, Param1, Param2)
{
global hw_TTOTAL_CMD
SendMessage, % TCmessage, % Param1, % Param2, % aControl, % "ahk_id " hw_TTOTAL_CMD
return ErrorLevel
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Доп. функция (автор artt)
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TC_SendData(Cmd, CmdType="", msg="", hwnd="")
{
Critical
global hw_TTOTAL_CMD
Static om := OnMessage(0x4a, "TC_SendData"), TC_ReceiveDataValue := "", TC_DataReceived := ""
If ( (msg=0x4A) and (hwnd=A_ScriptHwnd) )
Exit ( TC_ReceiveDataValue := StrGet(NumGet(CmdType + A_PtrSize * 2)), TC_DataReceived := "1" )
VarSetCapacity(CopyDataStruct, A_PtrSize * 3), TC_ReceiveDataValue := 1, TC_DataReceived := ""
If CmdType in LR,ST
DirType := CmdType, CmdType := "CD"
else if ( CmdType = "" )
CmdType := ( A_IsUnicode ? "GW" : "GA" ), TC_ReceiveDataValue := ""
If( A_IsUnicode )
{
VarSetCapacity(cmdA, StrPut(cmd, "cp0"), 0)
Loop, % StrLen(cmd)
NumPut( Asc(SubStr(cmd, A_Index, 1)), cmdA, A_Index - 1, "Char" )
}
NumPut( Asc(SubStr(CmdType, 1, 1)) + 256 * Asc(SubStr(CmdType, 2, 1)), CopyDataStruct, 0 )
NumPut( StrLen(cmd) + (CmdType = "CD" ? 5 : 0), CopyDataStruct, A_PtrSize )
NumPut( (A_IsUnicode ? &cmdA : &cmd), CopyDataStruct, A_PtrSize * 2 )
Loop, % ( CmdType=="CD" ? 2 : 0 )
NumPut( Asc(SubStr(DirType, A_Index, 1)), (A_IsUnicode ? cmdA : cmd), (StrLen(cmd) + A_Index), "Char" )
SendMessage, 0x4A, %A_ScriptHwnd%, &CopyDataStruct,, % "ahk_id " hw_TTOTAL_CMD
While ( TC_ReceiveDataValue = "" )
{
IfEqual, TC_DataReceived, 1, Break
IfGreaterOrEqual, A_Index, 500, Break
Sleep, 10
}
Return TC_ReceiveDataValue
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
_________________ Win11 x64 Eng | TC DreamLair eternal pre-α
Last edited by LonerD on Thu Apr 30, 2015 17:41; edited 9 times in total |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Tue Apr 28, 2015 09:06 Post subject: |
|
|
LonerD
Не, пока кривенько. Возьми 2 0 2, к примеру. Выделение начинается не понять откуда.
В подпапках архивов вообще по нулям (я уж молчу про результаты поиска в архивах - это к "любой ситуации").
Кстати, по скорости моему скрипту уступает. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Tue Apr 28, 2015 15:33 Post subject: |
|
|
Flasher
Спасибо, вижу в каких фрагментах скрипта проблема. С архивами, оказывается, не всё так просто. А с файлами - мой косяк, шёл в верном направлении, немного запутался и решил сделать "попроще" (оказалось, не учёл выделение только файлов)... _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
LonerD
Joined: 04 Jan 2011 Posts: 1168 Location: Донецк
|
(Separately) Posted: Thu Apr 30, 2015 06:11 Post subject: |
|
|
Обновил скрипт. Вроде исправил все ошибки.
Добавление выделения от курсора и борьба с нюансами Тотала - вылились в необходимость использовать WM_COPYData.
Flasher wrote: | Кстати, по скорости моему скрипту уступает. |
Не знаю механизмы работы обоих скриптовых языков и зависимости от мощности компьютера.
Засёк секундомером. На моём Core i7 в Power Saver режиме - оба варианта (твой и мой) на каталоге с 22 тысячами файлов (System32, вид без подкаталогов) отработали за 12-13 секунд, то есть можно сказать идентично.
Кстати, у тебя при параметрах %Z%V 1 1 - если курсор находится на строке [..] - выскакивает докучливое Тоталовское окошко об отсутствии выделения. _________________ Win11 x64 Eng | TC DreamLair eternal pre-α |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 30, 2015 09:01 Post subject: |
|
|
LonerD wrote: | Вроде исправил все ошибки. | Вроде, да не все. По-прежнему остаётся проблема с 2 0 2, если курсор на папках. Ну, и про поиск в архивах всё молчим. Плюс к этому у тебя в буфере остаётся путь элемента под курсором.
LonerD wrote: | Добавление выделения от курсора и борьба с нюансами Тотала - вылились в необходимость использовать WM_COPYData. | Ну, у меня почему-то не вылились, использовались вполне простые пути решения.
LonerD wrote: | оба варианта (твой и мой) на каталоге с 22 тысячами файлов (System32, вид без подкаталогов) отработали за 12-13 секунд | У меня в этом же каталоге на 14 тыс. файлов мой скрипт срабатывает в среднем за 2,36-2.5 секунды. Твой предыдущий где-то за 3.2-3.5. В папке Windows на 22691 файлов мой - за 9,849609, твой похоже. Если брать небольшое кол-во файлов, то новый твой вариант объективно быстрее предыдущего.
LonerD wrote: | Кстати, у тебя при параметрах %Z%V 1 1 - если курсор находится на строке [..] - выскакивает докучливое Тоталовское окошко об отсутствии выделения. | Ничего подобного. У меня это самый часто используемый режим. Тем более если учесть, что ряд последних правок был привязан к тестам с установкой на данном элементе. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Last edited by Flasher on Thu Apr 30, 2015 11:11; edited 2 times in total |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2569
|
(Separately) Posted: Thu Apr 30, 2015 10:26 Post subject: |
|
|
Flasher
Моё утверждение
Quote: | Заодно можешь и во всех других местах убрать | строилось на этом описании (в справке) глобального свойства Wait:
Quote: | SendMessage (при установке значения
True). При истинном значении этого свойства всегда ожидается
реакция TC на посланную команду и только при получении результата
передаётся управление в скрипт. | Проверка на объёмах в десятки тысяч файлов показала, что параметр ожидания для отдельных SendCommand всё равно почему-то востребован.
Так что возвращаюсь на шаг назад. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 30, 2015 14:00 Post subject: |
|
|
sa
Оно хоть и строилось на данном описании, но неверно.
Можно везде поубирать True после SendCommand и убедиться, что вообще ничего кроме элемента под курсором выделено не будет даже в папках, где всего 2-3 объекта.
Добавил в скрипт Option Explicit, чтобы ускорить обращение к значимому числу переменных.
С подкаталожными файлами архива в результатах поиска не стал заморачиваться, там при постановке курсора на первом элементе без WM_COPYData, увы, не обойтись. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2569
|
(Separately) Posted: Thu Apr 30, 2015 14:14 Post subject: |
|
|
Flasher wrote: | Можно везде поубирать True после SendCommand и убедиться, что вообще ничего кроме элемента под курсором выделено не будет даже в папках, где всего 2-3 объекта.
| У меня по-другому: даже в папке Windows, в виде без подкаталогов (~17000 файлов), работает. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 30, 2015 14:15 Post subject: |
|
|
С трудом верится, но тут только и остаётся пожать плечами. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2569
|
(Separately) Posted: Thu Apr 30, 2015 14:30 Post subject: |
|
|
Flasher
Я надеюсь, что глобальное .Wait = True ты сохранял при этом? |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 30, 2015 14:49 Post subject: |
|
|
sa
Я делал ровно то, что написал. Всего 4 замены. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2569
|
(Separately) Posted: Thu Apr 30, 2015 14:54 Post subject: |
|
|
Flasher
У меня 6. Интересно, мы про один скрипт говорим? Я даже 21 редакцию проверил. |
|
Back to top |
|
|
Flasher
Joined: 06 Nov 2009 Posts: 14229 Location: Москва
|
(Separately) Posted: Thu Apr 30, 2015 15:03 Post subject: |
|
|
Если 4, то выделит 1 элемент, если 5-6, то - 0. _________________ Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой. |
|
Back to top |
|
|
sa
Joined: 29 Apr 2009 Posts: 2569
|
(Separately) Posted: Thu Apr 30, 2015 15:18 Post subject: |
|
|
Flasher
Ну и ну! Вечером попробую ещё на семёрке (сейчас на XP).
Спасибо, что все три SetTextToClip стали теперь единообразными! |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|