Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Выделение файлов через один
Goto page Previous  1, 2, 3 ... 8, 9, 10, 11, 12  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Mon Apr 27, 2015 16:18    Post subject: Reply with quote

sa wrote:
Разве не о том глобальном?
О нём. А что это меняет?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Tue Apr 28, 2015 02:01    Post subject: Reply with quote

Обновлённое решение на 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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Tue Apr 28, 2015 09:06    Post subject: Reply with quote

LonerD
Не, пока кривенько. Возьми 2 0 2, к примеру. Выделение начинается не понять откуда.
В подпапках архивов вообще по нулям (я уж молчу про результаты поиска в архивах - это к "любой ситуации").
Кстати, по скорости моему скрипту уступает.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Tue Apr 28, 2015 15:33    Post subject: Reply with quote

Flasher
Спасибо, вижу в каких фрагментах скрипта проблема. С архивами, оказывается, не всё так просто. А с файлами - мой косяк, шёл в верном направлении, немного запутался и решил сделать "попроще" (оказалось, не учёл выделение только файлов)...
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
LonerD



Joined: 04 Jan 2011
Posts: 1168
Location: Донецк

Post (Separately) Posted: Thu Apr 30, 2015 06:11    Post subject: Reply with quote

Обновил скрипт. Вроде исправил все ошибки.
Добавление выделения от курсора и борьба с нюансами Тотала - вылились в необходимость использовать 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
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 30, 2015 09:01    Post subject: Reply with quote

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
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2563

Post (Separately) Posted: Thu Apr 30, 2015 10:26    Post subject: Reply with quote

Flasher
Моё утверждение
Quote:
Заодно можешь и во всех других местах убрать
строилось на этом описании (в справке) глобального свойства Wait:
Quote:
SendMessage (при установке значения
True). При истинном значении этого свойства всегда ожидается
реакция TC на посланную команду и только при получении результата
передаётся управление в скрипт.
Проверка на объёмах в десятки тысяч файлов показала, что параметр ожидания для отдельных SendCommand всё равно почему-то востребован.
Так что возвращаюсь на шаг назад. Embarassed
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 30, 2015 14:00    Post subject: Reply with quote

sa
Оно хоть и строилось на данном описании, но неверно.
Можно везде поубирать True после SendCommand и убедиться, что вообще ничего кроме элемента под курсором выделено не будет даже в папках, где всего 2-3 объекта.

Добавил в скрипт Option Explicit, чтобы ускорить обращение к значимому числу переменных.
С подкаталожными файлами архива в результатах поиска не стал заморачиваться, там при постановке курсора на первом элементе без WM_COPYData, увы, не обойтись.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2563

Post (Separately) Posted: Thu Apr 30, 2015 14:14    Post subject: Reply with quote

Flasher wrote:
Можно везде поубирать True после SendCommand и убедиться, что вообще ничего кроме элемента под курсором выделено не будет даже в папках, где всего 2-3 объекта.
У меня по-другому: даже в папке Windows, в виде без подкаталогов (~17000 файлов), работает.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 30, 2015 14:15    Post subject: Reply with quote

С трудом верится, но тут только и остаётся пожать плечами.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2563

Post (Separately) Posted: Thu Apr 30, 2015 14:30    Post subject: Reply with quote

Flasher
Я надеюсь, что глобальное .Wait = True ты сохранял при этом?
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 30, 2015 14:49    Post subject: Reply with quote

sa
Я делал ровно то, что написал. Всего 4 замены.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2563

Post (Separately) Posted: Thu Apr 30, 2015 14:54    Post subject: Reply with quote

Flasher
У меня 6. Интересно, мы про один скрипт говорим? Я даже 21 редакцию проверил.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Thu Apr 30, 2015 15:03    Post subject: Reply with quote

Если 4, то выделит 1 элемент, если 5-6, то - 0.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2563

Post (Separately) Posted: Thu Apr 30, 2015 15:18    Post subject: Reply with quote

Flasher
Ну и ну! Вечером попробую ещё на семёрке (сейчас на XP).
Спасибо, что все три SetTextToClip стали теперь единообразными!
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3 ... 8, 9, 10, 11, 12  Next
Page 9 of 12

 
Jump to:  
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