Синхронная смена каталогов
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
Синхронная смена каталогов
Есть встроенная ТК команда "cm_SyncChangeDir", но она настолько немая и тугая что раздражает, она не показывает что включена или сбросилась, не показывает в какие каталоги лучше не заходить чтоб она не сбросилась. Вот это ее авто-отключение все портит, особенно когда имеешь дело с большим количеством каталогов.
Самый простой вариант решения этой проблемы - пока она включена, то в каталоги у которых нет похожих на другой панели заходить нельзя, то есть при нажатии "Enter" ничего не происходит. Или с этой функцией запускать еще "cm_CompareDirsWithSubdirs", которая хоть как-то будет отображать в какие папки не заходить. Но скорее все это реализовать сложно или невозможно, по-этому прошу скрипт, который открывает одновременно папку под курсором в активной панели и папку похожую по названию в другой панели, а если такой папки нет, то в скрипте будет две опции "ничего не делать" или "зайти в папку только в активной панели".
p.s. нашел в памяти ТК флаг состояния "cm_SyncChangeDir" по адресу "0075C4D8" размер 1 байт, можно ли его как-то использовать?
Самый простой вариант решения этой проблемы - пока она включена, то в каталоги у которых нет похожих на другой панели заходить нельзя, то есть при нажатии "Enter" ничего не происходит. Или с этой функцией запускать еще "cm_CompareDirsWithSubdirs", которая хоть как-то будет отображать в какие папки не заходить. Но скорее все это реализовать сложно или невозможно, по-этому прошу скрипт, который открывает одновременно папку под курсором в активной панели и папку похожую по названию в другой панели, а если такой папки нет, то в скрипте будет две опции "ничего не делать" или "зайти в папку только в активной панели".
p.s. нашел в памяти ТК флаг состояния "cm_SyncChangeDir" по адресу "0075C4D8" размер 1 байт, можно ли его как-то использовать?
Почему же? Показывает. Что в тулбаре, что в главном меню.ingerard писал(а):она не показывает что включена или сбросилась
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
ingerard
Активность команды прекрасным образом отображается нажатым состоянием кнопки для неё на панели инструментов. Или обрамлением значка в меню. Если кнопка самопроизвольно стала отжатой, синхронизировать больше стало нечего. Вот и всё. Идею насчёт отображения "в какие папки не заходить" я, честно говоря, в изложенном виде не понял — ни со скриптом, ни без скрипта. Не говоря про то, что синхронно открываются папки не с похожими названиями, а с теми же самыми.
Активность команды прекрасным образом отображается нажатым состоянием кнопки для неё на панели инструментов. Или обрамлением значка в меню. Если кнопка самопроизвольно стала отжатой, синхронизировать больше стало нечего. Вот и всё. Идею насчёт отображения "в какие папки не заходить" я, честно говоря, в изложенном виде не понял — ни со скриптом, ни без скрипта. Не говоря про то, что синхронно открываются папки не с похожими названиями, а с теми же самыми.
Даже самая богатая фантазия
Не представит себе наши безобразия.
Не представит себе наши безобразия.
Теоретически. Если бы был неких стиль окна, то — без проблем.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 Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Flasher
Убрал кусок "If Mid(Fd, 2) = Mid(V, 2) Then _", просто не нужно строгое сравнение.
Теперь бы сделать скрипт на возврат к родительской папке и так чтоб сохранялась позиция курсора. И тогда будет все отлично
Убрал кусок "If Mid(Fd, 2) = Mid(V, 2) Then _", просто не нужно строгое сравнение.
Теперь бы сделать скрипт на возврат к родительской папке и так чтоб сохранялась позиция курсора. И тогда будет все отлично
Было бы неплохо это учитывать.синхронный переход при клике на .. из размноимённых папок не смущает?
Последний раз редактировалось ingerard Вс дек 24, 2017 13:53, всего редактировалось 1 раз.
ingerard
Строгое сравнение чего? Не вижу ответа на вопрос.
Позиция курсора нужна для сохранения в каком контексте?
Строгое сравнение чего? Не вижу ответа на вопрос.
Позиция курсора нужна для сохранения в каком контексте?
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Flasher
Если оставить ту строчку сравнение, то при таком раскладе путей синхронизация не сработает:
Левая панель - "C:\Program Files\"
Правая панель - "D:\Copy\Program Files\"
Если оставить ту строчку сравнение, то при таком раскладе путей синхронизация не сработает:
Левая панель - "C:\Program Files\"
Правая панель - "D:\Copy\Program Files\"
Когда возвращаюсь на один каталог вверх, курсор сбрасывается на первый элемент "..", а должен стоять на папке откуда я вышел.Позиция курсора нужна для сохранения в каком контексте?
Что "это"?ingerard писал(а):Было бы неплохо это учитывать.
Назад (Alt+влево) по истории?ingerard писал(а):Когда возвращаюсь на один каталог вверх
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Что "это"?
Вы сделали скрипт для синхронного захода в папки, в нем все хорошо, только надо еще сделать условие для перехода по ".." если папки вдруг не одноименные, то синхронизацию не делать.при клике на .. из разноимённых папок не смущает?
И так же еще нужен отдельно скрипт для синхронного выхода, только с учетом, что папки одноименные. И чтоб курсор был на этой же папке из которой вышли.
Нужно это для двух хоткеев, аналог "Enter", "Backspace"
Вот теперь понятно.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) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Flasher
Выдает ошибку:
Выдает ошибку:
Код: Выделить всё
Line: 9
Char: 22
Error: Object required
Code: 800A01A8
Source: TCScript