Кнопка вкл\выкл "внутренние ассоциации"

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

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

Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

без перезапуска ничего сделать нельзя?
Flasher точно подметил. Я когда читал тему, увидел слово перезапуск, и замкнуло на нём, а про обновление значков не подумал.
Если после строки End If и перед Set TCS=Nothing вставить это

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

TCS.SendCommand "cm_InternalAssociate"
TCS.Pause = 100
TCS.SendKeystroke "{Enter}" 
то перезагрузки Тотала не надо
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Andrey_A
Ну с появлением окна Внутр. ассоциаций достаточно тривиальное решение. Вот без бы..
Andrey_A писал(а):TCS.Pause = 100
Кстати без паузы тоже нормально работает.
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Вот без бы..
наверно можно, после праздников профессионалы отойдут от праздников...
Кстати без паузы тоже нормально работает
Кому надо паузу могут убрать. У меня на одной машине срабатывает без паузы идеально, на другой 80\20. Наверно это зависит от быстроты процессов...
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Andrey_A писал(а):Кому надо паузу могут убрать.
Я еще раз напоминаю про существенную разницу между Sleep и Pause
http://forum.wincmd.ru/viewpost.php?p=61263
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

Andrey_A писал(а):Если что подправите
Парочка незначительных советов:
1. Строки "With WScript" и "End With" совершенно не нужны.
2. Одинаковые конструкции лучше вынести за пределы "If ... End If":

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

Text = FSO.OpenTextFile(F, 1).ReadAll 
If bCheck Then 
  Text = Replace(Text, Str2, Str1, 1, -1, 1) 
Else 
  Text = Replace(Text, Str1, Str2, 1, -1, 1) 
End If
FSO.OpenTextFile(F, 2).Write Text
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Andrey_A
Сообщения: 394
Зарегистрирован: Пт апр 10, 2009 06:28
Откуда: Сочи
Контактная информация:

Сообщение Andrey_A »

Подправил скрипт с учётом советов

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

' Переименование секции [Associations] в [-Associations] с обновленим значков и обратно
' Кнопка вкл\выкл внутренних ассоциаций
Option Explicit 
Dim FSO, F, Str1, Str2, Text, TCS
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set TCS = CreateObject("TCScript.Helper") 
With WScript 
  F    = "%COMMANDER_PATH%\WinCmd.ini"
  Str1 = "[Associations]"
  Str2 = "[-Associations]"
End With 

F = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F)) 

Text = FSO.OpenTextFile(F, 1).ReadAll 
If bCheck Then 
  Text = Replace(Text, Str2, Str1, 1, -1, 1) 
Else 
  Text = Replace(Text, Str1, Str2, 1, -1, 1) 
End If 
FSO.OpenTextFile(F, 2).Write Text

TCS.SendCommand "cm_InternalAssociate"
TCS.Pause = 100
TCS.SendKeystroke "{Enter}" 

Set TCS=Nothing 
WScript.Quit 

Function bCheck() 
   Dim sFile 
   sFile=WScript.ScriptFullName 
   bCheck=TCS.INIRead(sFile, "Ass", "Line", 0) 
   TCS.INIWrite sFile, "Ass", "Line", Not bCheck 
End Function

[Ass] 
Line =0
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Спасибо всё отлично работает. Теперь для идеала хочется сделать так чтобы кнопка "вкл\выкл внутр ассоциации TC" менялась при нажатии, чтоб было видно вкл или выкл она, то есть сделать аналог например кнопки cm_SwitchHidSys.

Я пошёл таким путём -
Сделал по подобию скрипт меняющий иконку при нажатии

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

Option Explicit 
Dim FSO, F, Str1, Str2, Text, TCS 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set TCS = CreateObject("TCScript.Helper") 
With WScript 
  F    = "%COMMANDER_PATH%\Bars\1.bar" 
  Str1 = "button19=wcmicons.dll,80" 
  Str2 = "button19=wcmicons.dll,81" 
End With 

F = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F)) 

Text = FSO.OpenTextFile(F, 1).ReadAll 
If bCheck Then 
  Text = Replace(Text, Str2, Str1, 1, -1, 1) 
Else 
  Text = Replace(Text, Str1, Str2, 1, -1, 1) 
End If 
FSO.OpenTextFile(F, 2).Write Text 

TCS.SendCommand "cm_ButtonConfig" 
TCS.Pause = 100 
TCS.SendKeystroke "{Tab}" 
TCS.SendKeystroke "{Enter}" 


Set TCS=Nothing 
WScript.Quit 

Function bCheck() 
   Dim sFile 
   sFile=WScript.ScriptFullName 
   bCheck=TCS.INIRead(sFile, "Ass", "Line", 0) 
   TCS.INIWrite sFile, "Ass", "Line", Not bCheck 
End Function 

[Ass] 
Line =-1
Как теперь соединить эти два скрипта в один? Батником естественно не рационально запускать скрипты поочерёдно.
Или может есть др способы решить мою задачу?
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HA3APET
Думаю тут стоит ещё покапать.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Спасибо покопал, но не нашёл там решения своей задачи, тем более в скриптах совершенно не разбираюсь, поэтому и прошу тут помощи.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HA3APET
Что-то я эдакое пытался соорудить - не получилось, не знаю как в таком случае с секциями работать. На крайний случай можно создать в ТС пользовательскую команду em_ со скриптом, редактирующим Bar-файл и обновляющим панель инструментов, а в скрипте Andrey_A потом добавить строку TCS.UserCmd "em_Имя" под TCS.SendKeystroke "{Enter}"
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

HA3APET писал(а):Как теперь соединить эти два скрипта в один?
Не мудрствуя лукаво, можно просто слить:

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

Option Explicit
Dim FSO, TCS, F1, F2, Str1, Str2, Str3, Str4, Text1, Text2
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")
F1   = "%COMMANDER_PATH%\Bars\1.bar"
Str1 = "button19=wcmicons.dll,80"
Str2 = "button19=wcmicons.dll,81"
F2   = "%COMMANDER_PATH%\WinCmd.ini"
Str3 = "[Associations]"
Str4 = "[-Associations]"

F1 = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F1))
F2 = FSO.GetAbsolutePathName(CreateObject("WScript.Shell").ExpandEnvironmentStrings(F2))

Text1 = FSO.OpenTextFile(F1, 1).ReadAll
Text2 = FSO.OpenTextFile(F2, 1).ReadAll
If bCheck Then
  Text1 = Replace(Text1, Str2, Str1, 1, -1, 1)
  Text2 = Replace(Text2, Str4, Str3, 1, -1, 1)
Else
  Text1 = Replace(Text1, Str1, Str2, 1, -1, 1)
  Text2 = Replace(Text2, Str3, Str4, 1, -1, 1)
End If
FSO.OpenTextFile(F1, 2).Write Text1
FSO.OpenTextFile(F2, 2).Write Text2

With TCS
  .LockTC True
  .Pause = 100
  .SendCommand   "cm_ButtonConfig"
  .SendKeystroke "{Tab}"
  .SendKeystroke "{Enter}"
  .SendCommand   "cm_InternalAssociate"
  .SendKeystroke "{Enter}"
End With

Set TCS = Nothing
Set FSO = Nothing
WScript.Quit

Function bCheck()
   Dim sFile
   sFile=WScript.ScriptFullName
   bCheck=TCS.INIRead(sFile, "Ass", "Line", 0)
   TCS.INIWrite sFile, "Ass", "Line", Not bCheck
End Function

[Ass]
Line =-1
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Batya писал(а):Не мудрствуя лукаво
Хм. О банальной склейке с дублированием даже не подумал. Не там рыл.) Скрипт работает. Хотя мне такая кнопка не нужна по большому счёту; в меню место нашлось только подретушированному скрипту Andrey_A.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Batya
Скрипт работает.. но зависат где-то на 2 сек после
.SendCommand "cm_ButtonConfig"
.SendKeystroke "{Tab}"

то есть появляется Button Config, фокус ставится на OK.. затем двух секундная пауза... затем продолжает работать.

Если осуществить батником запуск этих двух скриптов, то проблемы нет. Можно ли убрать эту задержку?

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

  .LockTC True 
  .Pause = 100
Это не влияет на задержку.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

HA3APET писал(а):Можно ли убрать эту задержку?
Пауза нужна по естественным причинам: Появление диалога "Настройка панели инструментов" + диалога "Внутренние ассоциации". Строка LockTC True наоборот требуется для ускорения работы скрипта, хотя применяется в основном при перерисовке и переключении панелей.
HA3APET
Сообщения: 151
Зарегистрирован: Пн фев 22, 2010 05:43

Сообщение HA3APET »

Flasher
Это не пауза.. это задержка которой не было и нет если выполнять эти два скрипта по отдельности.
Описываю подробнее:
Запускается Настройка панели инструментов, фокус ставится на OK, то есть выполняется

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

.SendKeystroke "{Tab}"
а затем двух (!) секундная пауза...

Разобрался - "виноват" Dr.Web

Batya, спасибо за скрипт, всё отлично.
Ответить