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  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
LonerD



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

Post (Separately) Posted: Thu Jun 13, 2013 22:14    Post subject: Reply with quote

MVV wrote:
Думаю, гораздо проще послать команду сохранения выделения в файл и перехватить диалог выбора файла

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



Joined: 29 Apr 2009
Posts: 2567

Post (Separately) Posted: Thu Jun 13, 2013 23:24    Post subject: Reply with quote

Когда-то применял функцию определения наличия выделения (SelectYes), посылая нажатия в диалог настройки списка исключений:
Code:
Dim FSO, TCS, S
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")
S = TCS.INIRead (TCS.MainINI, "Configuration", "IgnoreListFile", 0)
If SelectYes Then
  TCS.INIWrite TCS.MainINI, "Configuration", "IgnoreListFile", S
  MsgBox "Выделение есть!", vbSystemModal
Else
  MsgBox "Нет выделения!", vbSystemModal
End If
Set FSO = Nothing
Set TCS = Nothing
Wscript.Quit

Function SelectYes()
  TCS.SendCommand 480 'cm_IgnoreConfig
  TCS.Pause = 0
  TCS.SendKeystroke "+{TAB 6}{ENTER}010{ENTER}{LEFT}{TAB 4}{ENTER}"
  TCS.Pause = 50
  If FSO.GetBaseName(TCS.INIRead (TCS.MainINI, "Configuration", "IgnoreListFile", 0)) = "010" Then
    SelectYes = 1
  Else
    SelectYes = 0
  End If   
End Function
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Thu Jun 13, 2013 23:29    Post subject: Reply with quote

LonerD wrote:
В частности пока не могу понять и воспроизвести алгоритм работы восстановления выделения по нажатию Esc в плагине TwinKey
Что именно в описанном в справке алгоритме не соответствует текущему поведению (обращаю внимание на последние 3 пункта)?
LonerD wrote:
И только связка команд 530-529 может отличить реальное выделение
Не только.
_________________
Автору сборки 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: Fri Jun 14, 2013 02:23    Post subject: Reply with quote

sa
Спасибо. Мудрёные манипуляции, но приму к сведению как вариант.

Flasher
Quote:
Что именно в описанном в справке алгоритме не соответствует текущему поведению (обращаю внимание на последние 3 пункта)?

Текущему поведению соответствует всё, что описано в справке относительно этой команды.
Цель - понять каким образом это всё работает (алгоритм работы) и, если возможно, воспроизвести на скриптовых языках. В первую очередь - каким образом можно проверить наличие выделения в панели и сохранить первоначальное выделение если таковое имеется.

Quote:
Не только.

Честно говоря - совсем не могу понять как работает твой скрипт (точнее как работает ключевой фрагмент с проверкой выделения в случае одного файла).

Например, имеем файлы 1, 2 и 3. Курсор на файле 1. Выполняем твой скрипт (имена выделенных файлов отправляются в переменные).
Если файл 1 выделен, то N1 = 2,3 а N2 = 1
Если файл 1 не выделен (то есть в панели нет выделения), то N1 = 1,2,3 а N2 = 1
(не через запятую, разумеется, а каждый с новой строки, но суть думаю понятна).
В обоих случаях (если есть выделение и если его нет) - переменные будут ведь различаться! Так что даёт сравнение N1 и N2 ?
_________________
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: Fri Jun 14, 2013 03:09    Post subject: Reply with quote

LonerD wrote:
В первую очередь - каким образом можно проверить наличие выделения в панели и сохранить первоначальное выделение если таковое имеется.
Если ты внимательно читал, то там нет отслеживания выделения одного файла.

LonerD wrote:
то N1 = 2,3 а N2 = 1
...
то N1 = 1,2,3 а N2 = 1
Нет. Там сравнивается только первый элемент массива > (0)(0) при условии If C = 3 And P1 = P2.

LonerD wrote:
не через запятую, разумеется, а каждый с новой строки
Почему с новой?

Вообще-то там неверный алгоритм. Почему-то раньше работало (особо не тестировал тогда). Лучше так:
Code:
If C = 3 And P1 = P2 Then
  If FSO.FileExists(P2) Then
    With CreateObject("TCScript.Helper")
      .LockTC True : .SendCommand(525)
      For Each i in .GetSrcSelectedFiles(0)
        If i = FSO.GetFileName(P1) Then
          Test = 1 : Exit For
        End If
      Next : .SendCommand(525) : .LockTC False
    End With : If Test Then WSH.Exec Ed Else WSH.Exec Ed & " " & P1
  Else WSH.Exec Ed
  End If
  Quit
End If
Один минус - если файл в папке один, то выделение ничего не даст.
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.


Last edited by Flasher on Fri Jun 14, 2013 11:11; edited 1 time in total
Back to top
View user's profile Send private message
LonerD



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

Post (Separately) Posted: Fri Jun 14, 2013 04:15    Post subject: Reply with quote

Quote:
Там сравнивается только первый элемент массива > (0)(0).

Тогда понятно. Smile
Хотя проще от этого не стало...

Quote:
Почему с новой?

Чтобы короче было. При копировании имён каждое имя помещается в списке с новой строки, я для краткости записал всё через запятую

_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
Back to top
View user's profile Send private message
sa



Joined: 29 Apr 2009
Posts: 2567

Post (Separately) Posted: Fri Jun 14, 2013 09:09    Post subject: Reply with quote

LonerD wrote:
Мудрёные манипуляции

Вся мудрёность сводится к тому, что при наличии выделения, кнопки диалога “Добавить все выделенные с путями” и “Добавить все выделенные” активированы и нажатия приводят к появлению в ключе IgnoreListFile wincmd.ini нового имени файла (010) для списка исключений, а при отсутствии выделения те же нажатия приводят на кнопку отмены диалога и ключ IgnoreListFile не изменяется.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Fri Jun 14, 2013 11:17    Post subject: Reply with quote

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



Joined: 17 Aug 2014
Posts: 663

Post (Separately) Posted: Sat Sep 20, 2014 14:03    Post subject: Reply with quote

Есть ли какой-нить скриптик, аналог комманды cm_CopyNamesToClip, только чтоб без расширения копировалось
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sat Sep 20, 2014 14:12    Post subject: Reply with quote

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



Joined: 17 Aug 2014
Posts: 663

Post (Separately) Posted: Sat Sep 20, 2014 15:59    Post subject: Reply with quote

Ломается периодически, вместе с сайтом. Вообще не могу зайти ни на этот, ни на родственный, который англоязычный
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sat Sep 20, 2014 16:18    Post subject: Reply with quote

А так?
_________________
Автору сборки 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 01:40    Post subject: Reply with quote

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

В общем, вот такое манюнькое решение получилось на AHK.

Code:
; Copy to clipboard list of only selected files and directories.
; Копирование в буфер обмена списка только выделенных файлов и каталогов.
#NoEnv
#NoTrayIcon
#MaxMem 1024
#SingleInstance force
SetBatchLines, -1

If not ( WinExist("ahk_class TTOTAL_CMD") || WinActive("ahk_class TTOTAL_CMD") )
  ExitApp

Clipboard := ""

WinGet, hw_TTOTAL_CMD, ID, A
ControlGetFocus, aControl, % "ahk_id " hw_TTOTAL_CMD
SendMessage, 0x190, , , % aControl, % "ahk_id " hw_TTOTAL_CMD
CountItems = %ErrorLevel%
SendMessage, 0x187, 0, , % aControl, % "ahk_id " hw_TTOTAL_CMD
UpLevel = %ErrorLevel%

if (( CountItems > 1 ) || ( ( CountItems = 1 ) && ( UpLevel != 1 )))
  SendMessage, 0x433, 2021,,, % "ahk_id " hw_TTOTAL_CMD

ExitApp


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

Также подозреваю, что есть решение через LB_GETSELITEMS без задействования буфера обмена, но пока не знаю как это сделать.
_________________
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: Tue Apr 28, 2015 09:32    Post subject: Reply with quote

LonerD
Пытаюсь найти хотя бы один повод, когда бы такой скрипт понадобился и не могу. Confused Поэтому и задавал вопросы (1, 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 14:22    Post subject: Reply with quote

Flasher wrote:
LonerD
Пытаюсь найти хотя бы один повод, когда бы такой скрипт понадобился и не могу.

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

Сейчас мне это понадобилось для скрипта выделения зеброй. На самом деле (как выяснилось уже в процессе) - проблема решилась "в обратную сторону".
То есть я думал, что нужно получить список файлов, а потом посчитать количество строк в этом списке. А в реальности количество строк можно считать напрямую через LB_GETSELCOUNT (а уж зная LB_GETSELCOUNT можно получить список файлов).
_________________
Win11 x64 Eng | TC DreamLair eternal pre-α
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  Next
Page 2 of 3

 
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