Синхронная смена каталогов

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Синхронная смена каталогов

Сообщение ingerard »

Есть встроенная ТК команда "cm_SyncChangeDir", но она настолько немая и тугая что раздражает, она не показывает что включена или сбросилась, не показывает в какие каталоги лучше не заходить чтоб она не сбросилась. Вот это ее авто-отключение все портит, особенно когда имеешь дело с большим количеством каталогов.
Самый простой вариант решения этой проблемы - пока она включена, то в каталоги у которых нет похожих на другой панели заходить нельзя, то есть при нажатии "Enter" ничего не происходит. Или с этой функцией запускать еще "cm_CompareDirsWithSubdirs", которая хоть как-то будет отображать в какие папки не заходить. Но скорее все это реализовать сложно или невозможно, по-этому прошу скрипт, который открывает одновременно папку под курсором в активной панели и папку похожую по названию в другой панели, а если такой папки нет, то в скрипте будет две опции "ничего не делать" или "зайти в папку только в активной панели".

p.s. нашел в памяти ТК флаг состояния "cm_SyncChangeDir" по адресу "0075C4D8" размер 1 байт, можно ли его как-то использовать?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard писал(а):она не показывает что включена или сбросилась
Почему же? Показывает. Что в тулбаре, что в главном меню.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
Почему же? Показывает. Что в тулбаре, что в главном меню.
Можно ли как-то считывать ее состояние?

И что насчет скрипта, сделать возможно?
Аватара пользователя
Avada
Сообщения: 10541
Зарегистрирован: Пт авг 01, 2008 16:17
Откуда: Россия, Саратов

Сообщение Avada »

ingerard
Активность команды прекрасным образом отображается нажатым состоянием кнопки для неё на панели инструментов. Или обрамлением значка в меню. Если кнопка самопроизвольно стала отжатой, синхронизировать больше стало нечего. Вот и всё. Идею насчёт отображения "в какие папки не заходить" я, честно говоря, в изложенном виде не понял — ни со скриптом, ни без скрипта. Не говоря про то, что синхронно открываются папки не с похожими названиями, а с теми же самыми.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard писал(а):Можно ли как-то считывать ее состояние?
Теоретически. Если бы был неких стиль окна, то — без проблем.
ingerard писал(а):И что насчет скрипта, сделать возможно?
Конечно. И опять же, не похожие, а одноимённые. Сделал пока по цепочке после буквы диска:

Код: Выделить всё

'============================== VBS ==============================
' Синхронное открытие каталогов в панелях ТС за вычетом букв диска
' Параметры: %V "%P" "%T"
' Ключ запрета несинхронного открытия: /n
'=================================================================
Set A = WSH.Arguments : V = A(0) : T = A(2)
With CreateObject("Scripting.FileSystemObject")
	If .FolderExists("\\?" & V) And .FolderExists("\\?" & T) Then
    If V <> A(1) Then Fd = T & .GetFileName(V) Else _
    V = .GetParentFolderName(V) : Fd = .GetParentFolderName(T)
    If .FolderExists("\\?" & Fd) Then R = " /R=""" & Fd & """" _
    Else If A.Named.Exists("n") Then WSH.Quit
	End If
End With : If Mid(Fd, 2) = Mid(V, 2) Then _
CreateObject("WScript.Shell").Exec "%COMMANDER_EXE% /S /O /L=""" & V & """" & R
Можно сделать и как в ТС, но с учётом исходных недовольств TC-шный синхронный переход при клике на .. из размноимённых папок не смущает?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
Убрал кусок "If Mid(Fd, 2) = Mid(V, 2) Then _", просто не нужно строгое сравнение.
Теперь бы сделать скрипт на возврат к родительской папке и так чтоб сохранялась позиция курсора. И тогда будет все отлично :)
синхронный переход при клике на .. из размноимённых папок не смущает?
Было бы неплохо это учитывать.
Последний раз редактировалось ingerard Вс дек 24, 2017 13:53, всего редактировалось 1 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard
Строгое сравнение чего? Не вижу ответа на вопрос.

Позиция курсора нужна для сохранения в каком контексте?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
Если оставить ту строчку сравнение, то при таком раскладе путей синхронизация не сработает:
Левая панель - "C:\Program Files\"
Правая панель - "D:\Copy\Program Files\"
Позиция курсора нужна для сохранения в каком контексте?
Когда возвращаюсь на один каталог вверх, курсор сбрасывается на первый элемент "..", а должен стоять на папке откуда я вышел.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard писал(а):Было бы неплохо это учитывать.
Что "это"?
ingerard писал(а):Когда возвращаюсь на один каталог вверх
Назад (Alt+влево) по истории?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Что "это"?
при клике на .. из разноимённых папок не смущает?
Вы сделали скрипт для синхронного захода в папки, в нем все хорошо, только надо еще сделать условие для перехода по ".." если папки вдруг не одноименные, то синхронизацию не делать.

И так же еще нужен отдельно скрипт для синхронного выхода, только с учетом, что папки одноименные. И чтоб курсор был на этой же папке из которой вышли.

Нужно это для двух хоткеев, аналог "Enter", "Backspace"
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard писал(а):если папки вдруг не одноименные, то синхронизацию не делать
Вот теперь понятно.
ingerard писал(а):Нужно это для двух хоткеев, аналог "Enter", "Backspace"
Тогда чистой синхронности не получится. Придётся в каждой из панелей выполнять выход. Отдельный скрипт тут совсем ни к чему:

Код: Выделить всё

'••••••••••••••••••••••••• VBS •••••••••••••••••••••••••
' Синхронное открытие одноимённых каталогов в панелях ТС
' Условие: требуется TCScript.dll
' Ключ запрета несинхронного открытия:  /n
' Ключ перехода в родительский каталог: /b
'•••••••••••••••••••••••••••••••••• Автор: Flasher © •••
Option Explicit : Dim FSO, TCS, Key, SP, TP, N, i, T, Ln
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")
Set Key = WSH.Arguments.Named
With TCS .Pause = 0 : .Wait = True : SP = .GetSrcPath
  TP = .GetInfo("TP") : N = .GetInfo("SN") : .LockTC True
  If N = ".." Or Key.Exists("b") Then
    If StrComp(FN(SP), FN(TP), 1) = 0 Then
      If FSO.FileExists("\\?" & Left(SP, Len(SP) - 1)) Then
        T = TP : If .GetInfo("A") = "R" Then TP = SP : SP = T
        .SetLeftPath SP & ":" : .SetRightPath TP & ":"
      ElseIf Right(SP, 1) = "" Then Call Cm(2002)(4006)(2002)(4006) End If
    ElseIf Not Key.Exists("n") Then Cm(2002) End If
  Else : Dim REx : Set REx = New RegExp : REx.Pattern = "^\\{3}[^\\]+\"
    If   FSO.FolderExists("\\?" & REx.Replace(SP, "") & N) Then
      If FSO.FolderExists("\\?" & REx.Replace(TP, "") & N) Then _
        Cm(2003) : .SetTrgPath TP & N & "" :_
      Else If Not Key.Exists("n") Then Cm(2003)
    ElseIf FSO.FileExists("\\?" & SP & N) Then
      If   FSO.FileExists("\\?" & TP & N) Then .SetTrgPath TP & N & "" :_
      .Sleep 40 : Ln = Len(.GetInfo("TP")) - Len(TP)
      Select Case True
        Case Ln > 0 Cm(2003)
        Case Ln < 0 Call Cm(4006)(570)(4006)
        Case Ln = "0" Or Not Key.Exists("n") Cm(1001)
      End Select
    End If
  End If : .LockTC False
End With : Set FSO = Nothing : Set TCS = Nothing
Function Cm(y) TCS.SendCommand y, 1: Set Cm = GetRef("Cm") End Function
Function FN(x) FN = FSO.GetFileName(Replace(x, "\\", "")) End Function
Последний раз редактировалось Flasher Чт дек 28, 2017 00:47, всего редактировалось 9 раз.
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
Выдает ошибку:

Код: Выделить всё

Line:	9
Char:	22
Error:	Object required
Code:	800A01A8
Source: 	TCScript
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard
Какая папка в этот момент в неактивной панели?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Сообщения: 128
Зарегистрирован: Вс дек 04, 2016 21:51

Сообщение ingerard »

Flasher
C:\ и D:\213\
В любых панелях на любых папках выдает ошибку.

Ссылается именно на .GetTrgPath. Команда .GetSrcPath работает нормально.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

ingerard
После замены на .GetInfo("TP") проблема исчезает?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Ответить