Выделение файлов через один
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3 ... 8, 9, 10, 11, 12  Next  :| |:
Total Commander -> Автоматизация Total Commander

#121:  Author: FlasherLocation: Москва PostPosted: Mon Apr 27, 2015 16:18
    —
sa wrote:
Разве не о том глобальном?
О нём. А что это меняет?

#122:  Author: LonerDLocation: Донецк PostPosted: Tue Apr 28, 2015 02:01
    —
Обновлённое решение на 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
}
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Last edited by LonerD on Thu Apr 30, 2015 17:41; edited 9 times in total

#123:  Author: FlasherLocation: Москва PostPosted: Tue Apr 28, 2015 09:06
    —
LonerD
Не, пока кривенько. Возьми 2 0 2, к примеру. Выделение начинается не понять откуда.
В подпапках архивов вообще по нулям (я уж молчу про результаты поиска в архивах - это к "любой ситуации").
Кстати, по скорости моему скрипту уступает.

#124:  Author: LonerDLocation: Донецк PostPosted: Tue Apr 28, 2015 15:33
    —
Flasher
Спасибо, вижу в каких фрагментах скрипта проблема. С архивами, оказывается, не всё так просто. А с файлами - мой косяк, шёл в верном направлении, немного запутался и решил сделать "попроще" (оказалось, не учёл выделение только файлов)...

#125:  Author: LonerDLocation: Донецк PostPosted: Thu Apr 30, 2015 06:11
    —
Обновил скрипт. Вроде исправил все ошибки.
Добавление выделения от курсора и борьба с нюансами Тотала - вылились в необходимость использовать WM_COPYData.

Flasher wrote:
Кстати, по скорости моему скрипту уступает.

Не знаю механизмы работы обоих скриптовых языков и зависимости от мощности компьютера.
Засёк секундомером. На моём Core i7 в Power Saver режиме - оба варианта (твой и мой) на каталоге с 22 тысячами файлов (System32, вид без подкаталогов) отработали за 12-13 секунд, то есть можно сказать идентично.

Кстати, у тебя при параметрах %Z%V 1 1 - если курсор находится на строке [..] - выскакивает докучливое Тоталовское окошко об отсутствии выделения.

#126:  Author: FlasherLocation: Москва PostPosted: Thu Apr 30, 2015 09:01
    —
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 - если курсор находится на строке [..] - выскакивает докучливое Тоталовское окошко об отсутствии выделения.
Ничего подобного. У меня это самый часто используемый режим. Тем более если учесть, что ряд последних правок был привязан к тестам с установкой на данном элементе.

Last edited by Flasher on Thu Apr 30, 2015 11:11; edited 2 times in total

#127:  Author: sa PostPosted: Thu Apr 30, 2015 10:26
    —
Flasher
Моё утверждение
Quote:
Заодно можешь и во всех других местах убрать
строилось на этом описании (в справке) глобального свойства Wait:
Quote:
SendMessage (при установке значения
True). При истинном значении этого свойства всегда ожидается
реакция TC на посланную команду и только при получении результата
передаётся управление в скрипт.
Проверка на объёмах в десятки тысяч файлов показала, что параметр ожидания для отдельных SendCommand всё равно почему-то востребован.
Так что возвращаюсь на шаг назад. Embarassed

#128:  Author: FlasherLocation: Москва PostPosted: Thu Apr 30, 2015 14:00
    —
sa
Оно хоть и строилось на данном описании, но неверно.
Можно везде поубирать True после SendCommand и убедиться, что вообще ничего кроме элемента под курсором выделено не будет даже в папках, где всего 2-3 объекта.

Добавил в скрипт Option Explicit, чтобы ускорить обращение к значимому числу переменных.
С подкаталожными файлами архива в результатах поиска не стал заморачиваться, там при постановке курсора на первом элементе без WM_COPYData, увы, не обойтись.

#129:  Author: sa PostPosted: Thu Apr 30, 2015 14:14
    —
Flasher wrote:
Можно везде поубирать True после SendCommand и убедиться, что вообще ничего кроме элемента под курсором выделено не будет даже в папках, где всего 2-3 объекта.
У меня по-другому: даже в папке Windows, в виде без подкаталогов (~17000 файлов), работает.

#130:  Author: FlasherLocation: Москва PostPosted: Thu Apr 30, 2015 14:15
    —
С трудом верится, но тут только и остаётся пожать плечами.

#131:  Author: sa PostPosted: Thu Apr 30, 2015 14:30
    —
Flasher
Я надеюсь, что глобальное .Wait = True ты сохранял при этом?

#132:  Author: FlasherLocation: Москва PostPosted: Thu Apr 30, 2015 14:49
    —
sa
Я делал ровно то, что написал. Всего 4 замены.

#133:  Author: sa PostPosted: Thu Apr 30, 2015 14:54
    —
Flasher
У меня 6. Интересно, мы про один скрипт говорим? Я даже 21 редакцию проверил.

#134:  Author: FlasherLocation: Москва PostPosted: Thu Apr 30, 2015 15:03
    —
Если 4, то выделит 1 элемент, если 5-6, то - 0.

#135:  Author: sa PostPosted: Thu Apr 30, 2015 15:18
    —
Flasher
Ну и ну! Вечером попробую ещё на семёрке (сейчас на XP).
Спасибо, что все три SetTextToClip стали теперь единообразными!



Total Commander -> Автоматизация Total Commander


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

Goto page Previous  1, 2, 3 ... 8, 9, 10, 11, 12  Next  :| |:
Page 9 of 12

Powered by phpBB © 2001, 2005 phpBB Group