Перенос кнопки иконбара в меню запуск
Select messages from
# through # FAQ
[/[Print]\]
Goto page 1, 2  Next  :| |:
Total Commander -> Автоматизация Total Commander

#1: Перенос кнопки иконбара в меню запуск Author: Andry PostPosted: Wed Jun 14, 2006 20:58
    —
Все вы прекрасно знаете как быстро и мгновенно можно создать кнопку в иконбаре, и как долго и мучительно пункт в меню "запуск". По этому случаю у меня просьба к скриптописателям написать скрипт который копирует кнопку и вставляет её в меню запуск.
Что-бы не усложнять процесс можно копировать последнюю кнопку из бара в конец меню запуск а потом уже руками передвинуть куда надо. Хотелось что-бы это был "чистый" .vbs (виндовый).
Заранее спасибо.
[/list]

#2:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Jun 15, 2006 15:56
    —
vbs-скрипт, использующий Script Helper:
Code:
'========================================================
' Копирование кнопки из панели TC в меню "Запуск"
' Предварительно на кнопке надо выполнить "Копировать"
'========================================================
Option Explicit
Dim TCS, i, ClipB, PosCr, PosCrNext, Name, Cmd, Params, ExecPath, Iconic
Set TCS = CreateObject("TCScript.Helper")
i = 1
ClipB = TCS.GetTextFromClip
' Ищем перенос строки
PosCr = InStr(ClipB, vbCr)
if PosCr > 0 then
  ' Если перевая строка соответствует синтаксису кнопки
  if StrComp(Left(ClipB, PosCr - 1), "TOTALCMD#BAR#DATA", 1) = 0 then
    ' Ищем следующий номер для пункта меню
    Do While TCS.INIRead(TCS.MainINI, "user", "menu" & i, "") <> ""
      i = i + 1
    Loop
    ' Ищем строку команды
    PosCrNext = InStr(PosCr + 1, ClipB, vbCr)
    Cmd = Mid(ClipB, PosCr + 2, PosCrNext - PosCr - 2)
    PosCr = PosCrNext
    ' Ищем строку параметров
    PosCrNext = InStr(PosCr + 1, ClipB, vbCr)
    Params = Mid(ClipB, PosCr + 2, PosCrNext - PosCr - 2)
    PosCr = PosCrNext
    ' Ищем пропускаем строку
    PosCrNext = InStr(PosCr + 1, ClipB, vbCr)
    PosCr = PosCrNext
    ' Ищем наименование
    PosCrNext = InStr(PosCr + 1, ClipB, vbCr)
    Name = Mid(ClipB, PosCr + 2, PosCrNext - PosCr - 2)
    PosCr = PosCrNext
    ' Ищем путь запуска
    PosCrNext = InStr(PosCr + 1, ClipB, vbCr)
    ExecPath = Mid(ClipB, PosCr + 2, PosCrNext - PosCr - 2)
    PosCr = PosCrNext
    ' Ищем флажки
    PosCrNext = InStr(PosCr + 1, ClipB, vbCr)
    Iconic = Mid(ClipB, PosCr + 2, PosCrNext - PosCr - 2)
    if Cmd <> "" then
      if Name <> "" then
        TCS.INIWrite TCS.MainINI, "user", "menu" & i, Name
      else
        TCS.INIWrite TCS.MainINI, "user", "menu" & i, Cmd
      end if
      TCS.INIWrite TCS.MainINI, "user", "cmd" & i, Cmd
      if Params <> "" then
        TCS.INIWrite TCS.MainINI, "user", "param" & i, Params
      end if
      if ExecPath <> "" then
        TCS.INIWrite TCS.MainINI, "user", "path" & i, ExecPath
      end if
      if Iconic <> "" then
        TCS.INIWrite TCS.MainINI, "user", "iconic" & i, Iconic
      end if
      ' Перечитаем меню
      TCS.LockTC True
      TCS.SendCommand "cm_ChangeStartMenu"
      TCS.SendKeystroke "{Enter}"
      TCS.LockTC False
    end if
  end if
end if
Set TCS = Nothing
Wscript.Quit

#3:  Author: VolniyLocation: Местный PostPosted: Thu Jun 15, 2006 23:03
    —
Классный скрипт! Поздравляю. Must have, в натуре! Smile

Ни на что не претендуя, хочу просто упростить его, скажем так, чисто визуально. Алгоритм не изменен.
Code:
'=========================[ Start of file ]=========================
Option Explicit
Dim TCS, i, Name, Cmd, Data
Set TCS = CreateObject("TCScript.Helper")
Data = Split(TCS.GetTextFromClip(), vbCrLf)
' Если первая строка соответствует синтаксису кнопки
If Data(0) = "TOTALCMD#BAR#DATA" Then
' Ищем следующий номер для пункта меню
   For i = 1 To 1111 ' :-)
      If Len(TCS.INIRead(TCS.MainINI, "user", "menu" & i, ""))=0 _
         Then Exit For
   Next
    ' Cтрока команды
    Cmd = Data(1)
    ' Наименование
    Name = Data(4)
    If Len(Cmd) > 0 Then
      If Len(Name) > 0 Then
         TCS.INIWrite TCS.MainINI, "user", "menu" & i, Name
      Else
         TCS.INIWrite TCS.MainINI, "user", "menu" & i, Cmd
      End If
      TCS.INIWrite TCS.MainINI, "user", "cmd" & i, Cmd
      TCS.INIWrite TCS.MainINI, "user", "param" & i, Data(2)
      TCS.INIWrite TCS.MainINI, "user", "path" & i, Data(5)
      TCS.INIWrite TCS.MainINI, "user", "iconic" & i, Data(6)
   '  Перечитаем меню
      TCS.SendCommand "cm_ChangeStartMenu"
      TCS.SendKeystroke "{Enter}"
   End If
End If
Set TCS = Nothing
Wscript.Quit
'=========================[  End of file  ]=========================

#4:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Jun 16, 2006 10:15
    —
Volniy
Вообще, хорошая мысль - сразу сделать массив строк.
А в остальном, не со всем согласен.
1. Чем For лучше, чем Do While?
Кстати, количество пунктов меню максимально может быть 200 - команды с номерами от 700 до 899.
2. У тебя получается, что строки "param", "path" и "iconic" добавляются всегда. А нафига? Или метод INIWrite твоего Хэлпера не добавляет ключ с пустым значением?
3. Объясни еще раз, нафига всё же нужен LockTC? Почему ты его не включил?

#5:  Author: Andry PostPosted: Fri Jun 16, 2006 12:28
    —
Оба скрипта работают, но только "не туда". Я сначала не мог понять почему не добавляются менюшки, потом по старой памяти нашел файл c:\WINDOWS\wincmd.ini, все пишется туда. Можно ли указать полный путь к ini файлу или есть команда с помощью которой скрипт сам может найти нужный ini файл (их может быть несколько).

#6:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Jun 16, 2006 12:42
    —
Andry wrote:
Можно ли указать полный путь к ini файлу или есть команда с помощью которой скрипт сам может найти нужный ini файл (их может быть несколько).

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

Volniy
Почему MainINI отработал неверно?

#7:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Jun 16, 2006 13:25
    —
Вот новый вариант скрипта с учетом предложения от Volniy и возможных ошибок при определении инишника:
Code:
'========================================================
' Копирование кнопки из панели TC в меню "Запуск"
' Предварительно на кнопке надо выполнить "Копировать"
'========================================================
Option Explicit
Dim TCS, IniFile, i, ClipB, Data, MenuLimit, LenData
Dim Name, Cmd, Params, ExecPath, Iconic
Set TCS = CreateObject("TCScript.Helper")
ClipB   = TCS.GetTextFromClip
' Если перевая строка соответствует синтаксису кнопки
If UCase(Left(ClipB, 17)) = "TOTALCMD#BAR#DATA" Then
  Data = Split(ClipB, vbCrLf)
Else
  Set TCS = Nothing
  Wscript.Quit
End If
LenData = UBound(Data)
If LenData = 0 Then
  Set TCS = Nothing
  Wscript.Quit
End If
' Получаем пути ини-файлов TC
TCS.GetIniFiles
IniFile   = TCS.MainINI
MenuLimit = 200
Cmd       = ""
' Ищем свободный номер для пункта меню
For i = 1 To MenuLimit
  If Len(TCS.INIRead(IniFile, "user", "menu" & i, "")) = 0 Then
    Cmd = Data(1)
    Exit For
  End If
Next
' Добавляем меню, если есть свободный номер не больше MenuLimit
If Cmd <> "" Then
  Params   = ""
  Name     = ""
  ExecPath = ""
  Iconic   = ""
  If LenData >= 2 Then Params   = Data(2)
  If LenData >= 4 Then Name     = Data(4)
  If LenData >= 5 Then ExecPath = Data(5)
  If LenData >= 6 Then Iconic   = Data(6)
  If Name <> "" Then
    TCS.INIWrite IniFile, "user", "menu" & i, Name
  Else
    TCS.INIWrite IniFile, "user", "menu" & i, Cmd
  End If
  TCS.INIWrite IniFile, "user", "cmd"    & i, Cmd
  TCS.INIWrite IniFile, "user", "param"  & i, Params
  TCS.INIWrite IniFile, "user", "path"   & i, ExecPath
  TCS.INIWrite IniFile, "user", "iconic" & i, Iconic
  ' Перечитаем меню
  TCS.SendCommand "cm_ChangeStartMenu"
  TCS.SendKeystroke "{Enter}"
End If
Set TCS = Nothing
Wscript.Quit


Last edited by Batya on Tue Jun 20, 2006 17:39; edited 9 times in total

#8:  Author: VolniyLocation: Местный PostPosted: Fri Jun 16, 2006 18:02
    —
Batya wrote:

1. Чем For лучше, чем Do While?
Кстати, количество пунктов меню максимально может быть 200 - команды с номерами от 700 до 899.

Бесконечный цикл это всегда не очень хорошо. А For/Next сам производит инкремент счетчика и, к тому же никогда не выйдет за указанные пределы (надо было, конечно, написать for i=1 To 200)
Batya wrote:

2. У тебя получается, что строки "param", "path" и "iconic" добавляются всегда. А нафига? Или метод INIWrite твоего Хэлпера не добавляет ключ с пустым значением?

Пустые ключи, конечно же не добавляются..
Batya wrote:
3. Объясни еще раз, нафига всё же нужен LockTC? Почему ты его не включил?

Не включил, потому как не заметил существенного эффекта при его использовании. Этот метод пока что (может додумаю еще его расширение) влияет только на блокировку прорисовки главного окна TC. Диалоговые окна под это дело не подпадают.

#9:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Jun 16, 2006 18:49
    —
Volniy
ОК. Спасибо!

Преределал предыдущий пост с учетом замечаний.

#10:  Author: VolniyLocation: Местный PostPosted: Sat Jun 17, 2006 02:24
    —
Batya wrote:
Почему MainINI отработал неверно?

Потому что у человека неопределяемый обычными способами путь к инишнику прописан. Для этого случая спец-метод есть (GetIniFiles). Конечно, его можно было бы интегрировать в иниткод объекта, но оно ведь не всегда нужно, а окно About при этом неприятно мелькать будет при старте.

#11:  Author: Andry PostPosted: Sat Jun 17, 2006 10:18
    —
Путь к инишнику у меня прописан в ярлыке. Так уже давно делается и я думал что стало нормой жизни. Третий вариант от Batya работает так как надо, даже когда запущено два командера одновременно (с разными инишниками). При запуске скрипта командер вставляет пункт меню к себе в ini, а не в чужой. Не обошлось без приколов. На одном компе скрипт работает отлично, на другом не работает. Вроде совт одинаковый, винда, командер, хэлпер (версии одни). Там где строка TCS.GetIniFiles выдёт ошибку. Я эту строку отключил, вместо следующей строки написал IniFile = "C:\Program Files\TotCom\Prof\Main.ini" и всё заработало. Пользуюсь этим скриптом, спасибо!

#12:  Author: VolniyLocation: Местный PostPosted: Sat Jun 17, 2006 19:19
    —
Andry wrote:
Там где строка TCS.GetIniFiles выдёт ошибку.

Что за ошибка-то? Наверное "Метод GetIniFiles не найден"? Допиши-ка лучше строчку TCS.About и скажи, что за версия в мессаге написана. Должна быть beta10.

#13:  Author: Andry PostPosted: Mon Jun 19, 2006 19:39
    —
Ошибка такая - Ошибка: Invalid procedure call or argument. Код: 800A0005. Источник: TCScript. На трёх компах работает, на одном нехочет. Строка TCS.About выдёт - Version: Beta10. Я скачивал его недавно.
И ещё, строка if StrComp(Data(0), "TOTALCMD#BAR#DATA", 1) = 0 then выдаёт ошибку если в буфере обмена не текстовые данные или пусто.

#14:  Author: VolniyLocation: Местный PostPosted: Tue Jun 20, 2006 00:42
    —
Andry wrote:
Ошибка такая - Ошибка: Invalid procedure call or argument. Код: 800A0005. Источник: TCScript. На трёх компах работает, на одном нехочет.

Пока не могу у себя на 2 компах (4 винды) вопроизвести. Как-нибудь похожу по чужим компам на работе, может поймаю багу. А что за версия Тотала на том компе? Пришли мне скриншот тоталовского окошка About. Два экземпляра там, часом, не запущены?

Andry wrote:
И ещё, строка if StrComp(Data(0), "TOTALCMD#BAR#DATA", 1) = 0 then выдаёт ошибку если в буфере обмена не текстовые данные или пусто.

Да, в этом месте нет "защиты от дурака". А чего запускать скрипт-то, если в буфере нет нужных данных? Ладно, добавим проверку. Вместо строк
Code:
ClipB = TCS.GetTextFromClip
Data    = Split(TCS.GetTextFromClip(), vbCrLf)
' Если перевая строка соответствует синтаксису кнопки
if StrComp(Data(0), "TOTALCMD#BAR#DATA", 1) = 0 Then

запиши вот такой блок
Code:
ClipB = TCS.GetTextFromClip
' Если первая строка соответствует синтаксису кнопки
if InStr(1, ClipB, "TOTALCMD#BAR#DATA" & vbCrLf, 1) > 0 then
  Data = Split(TCS.GetTextFromClip(), vbCrLf)
  If UBound(Data) <> 8 Then Set TCS = Nothing: WScript.Quit


#15:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Jun 20, 2006 11:04
    —
Volniy
ОК. Поправлю последний пост со скриптом.
Только...
Quote:
If UBound(Data) <> 8

не совсем верно. Раз уж мы делаем защиту от дурака, то... В буфере может быть не вся информация о кнопке. Для панели работает, даже если всего две строки - заголовок и команда.



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page 1, 2  Next  :| |:
Page 1 of 2

Powered by phpBB © 2001, 2005 phpBB Group