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 1, 2, 3, 4, 5, 6, 7, 8  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
ingerard



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sat Dec 23, 2017 19:37    Post subject: Синхронная смена каталогов Reply with quote

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

p.s. нашел в памяти ТК флаг состояния "cm_SyncChangeDir" по адресу "0075C4D8" размер 1 байт, можно ли его как-то использовать?
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sat Dec 23, 2017 21:07    Post subject: Reply with quote

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



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sat Dec 23, 2017 22:00    Post subject: Reply with quote

Flasher
Quote:
Почему же? Показывает. Что в тулбаре, что в главном меню.

Можно ли как-то считывать ее состояние?

И что насчет скрипта, сделать возможно?
Back to top
View user's profile Send private message
Avada



Joined: 01 Aug 2008
Posts: 9023
Location: Россия, Саратов

Post (Separately) Posted: Sun Dec 24, 2017 00:32    Post subject: Reply with quote

ingerard
Активность команды прекрасным образом отображается нажатым состоянием кнопки для неё на панели инструментов. Или обрамлением значка в меню. Если кнопка самопроизвольно стала отжатой, синхронизировать больше стало нечего. Вот и всё. Идею насчёт отображения "в какие папки не заходить" я, честно говоря, в изложенном виде не понял — ни со скриптом, ни без скрипта. Не говоря про то, что синхронно открываются папки не с похожими названиями, а с теми же самыми.
_________________
Даже самая богатая фантазия
Не представит себе наши безобразия.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sun Dec 24, 2017 13:03    Post subject: Reply with quote

ingerard wrote:
Можно ли как-то считывать ее состояние?
Теоретически. Если бы был неких стиль окна, то — без проблем.
ingerard wrote:
И что насчет скрипта, сделать возможно?
Конечно. И опять же, не похожие, а одноимённые. Сделал пока по цепочке после буквы диска:
Code:
'============================== 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) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
ingerard



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sun Dec 24, 2017 14:44    Post subject: Reply with quote

Flasher
Убрал кусок "If Mid(Fd, 2) = Mid(V, 2) Then _", просто не нужно строгое сравнение.
Теперь бы сделать скрипт на возврат к родительской папке и так чтоб сохранялась позиция курсора. И тогда будет все отлично Smile

Quote:
синхронный переход при клике на .. из размноимённых папок не смущает?

Было бы неплохо это учитывать.


Last edited by ingerard on Sun Dec 24, 2017 14:53; edited 1 time in total
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sun Dec 24, 2017 14:48    Post subject: Reply with quote

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

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



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sun Dec 24, 2017 14:56    Post subject: Reply with quote

Flasher
Если оставить ту строчку сравнение, то при таком раскладе путей синхронизация не сработает:
Левая панель - "C:\Program Files\"
Правая панель - "D:\Copy\Program Files\"

Quote:
Позиция курсора нужна для сохранения в каком контексте?

Когда возвращаюсь на один каталог вверх, курсор сбрасывается на первый элемент "..", а должен стоять на папке откуда я вышел.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sun Dec 24, 2017 15:10    Post subject: Reply with quote

ingerard wrote:
Было бы неплохо это учитывать.
Что "это"?
ingerard wrote:
Когда возвращаюсь на один каталог вверх
Назад (Alt+влево) по истории?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
Back to top
View user's profile Send private message
ingerard



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sun Dec 24, 2017 15:25    Post subject: Reply with quote

Quote:
Что "это"?

Quote:
при клике на .. из разноимённых папок не смущает?


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

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

Нужно это для двух хоткеев, аналог "Enter", "Backspace"
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sun Dec 24, 2017 15:52    Post subject: Reply with quote

ingerard wrote:
если папки вдруг не одноименные, то синхронизацию не делать
Вот теперь понятно.
ingerard wrote:
Нужно это для двух хоткеев, аналог "Enter", "Backspace"
Тогда чистой синхронности не получится. Придётся в каждой из панелей выполнять выход. Отдельный скрипт тут совсем ни к чему:
Code:
'••••••••••••••••••••••••• 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

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


Last edited by Flasher on Thu Dec 28, 2017 01:47; edited 9 times in total
Back to top
View user's profile Send private message
ingerard



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sun Dec 24, 2017 18:47    Post subject: Reply with quote

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

Code:
Line:   9
Char:   22
Error:   Object required
Code:   800A01A8
Source:    TCScript
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sun Dec 24, 2017 18:50    Post subject: Reply with quote

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



Joined: 04 Dec 2016
Posts: 127

Post (Separately) Posted: Sun Dec 24, 2017 18:57    Post subject: Reply with quote

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

Ссылается именно на .GetTrgPath. Команда .GetSrcPath работает нормально.
Back to top
View user's profile Send private message
Flasher



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

Post (Separately) Posted: Sun Dec 24, 2017 19:05    Post subject: Reply with quote

ingerard
После замены на .GetInfo("TP") проблема исчезает?
_________________
Автору сборки TC Image (Andrey_A) настоятельно рекомендуется не распространять на иных ресурсах любую предоставленную мной где-либо техническую информацию по автоматизации и оптимизации в работе с ТС и системой.
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 1, 2, 3, 4, 5, 6, 7, 8  Next
Page 1 of 8

 
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