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  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Andry



Joined: 14 Jun 2006
Posts: 4

Post (Separately) Posted: Wed Jun 14, 2006 20:58    Post subject: Перенос кнопки иконбара в меню запуск Reply with quote

Все вы прекрасно знаете как быстро и мгновенно можно создать кнопку в иконбаре, и как долго и мучительно пункт в меню "запуск". По этому случаю у меня просьба к скриптописателям написать скрипт который копирует кнопку и вставляет её в меню запуск.
Что-бы не усложнять процесс можно копировать последнюю кнопку из бара в конец меню запуск а потом уже руками передвинуть куда надо. Хотелось что-бы это был "чистый" .vbs (виндовый).
Заранее спасибо.
[/list]
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Thu Jun 15, 2006 15:56    Post subject: Reply with quote

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
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Thu Jun 15, 2006 23:03    Post subject: Reply with quote

Классный скрипт! Поздравляю. 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  ]=========================
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Jun 16, 2006 10:15    Post subject: Reply with quote

Volniy
Вообще, хорошая мысль - сразу сделать массив строк.
А в остальном, не со всем согласен.
1. Чем For лучше, чем Do While?
Кстати, количество пунктов меню максимально может быть 200 - команды с номерами от 700 до 899.
2. У тебя получается, что строки "param", "path" и "iconic" добавляются всегда. А нафига? Или метод INIWrite твоего Хэлпера не добавляет ключ с пустым значением?
3. Объясни еще раз, нафига всё же нужен LockTC? Почему ты его не включил?
Back to top
View user's profile Send private message
Andry



Joined: 14 Jun 2006
Posts: 4

Post (Separately) Posted: Fri Jun 16, 2006 12:28    Post subject: Reply with quote

Оба скрипта работают, но только "не туда". Я сначала не мог понять почему не добавляются менюшки, потом по старой памяти нашел файл c:\WINDOWS\wincmd.ini, все пишется туда. Можно ли указать полный путь к ini файлу или есть команда с помощью которой скрипт сам может найти нужный ini файл (их может быть несколько).
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Jun 16, 2006 12:42    Post subject: Reply with quote

Andry wrote:
Можно ли указать полный путь к ini файлу или есть команда с помощью которой скрипт сам может найти нужный ini файл (их может быть несколько).

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

Volniy
Почему MainINI отработал неверно?
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Jun 16, 2006 13:25    Post subject: Reply with quote

Вот новый вариант скрипта с учетом предложения от 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
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Fri Jun 16, 2006 18:02    Post subject: Reply with quote

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. Диалоговые окна под это дело не подпадают.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Fri Jun 16, 2006 18:49    Post subject: Reply with quote

Volniy
ОК. Спасибо!

Преределал предыдущий пост с учетом замечаний.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sat Jun 17, 2006 02:24    Post subject: Reply with quote

Batya wrote:
Почему MainINI отработал неверно?

Потому что у человека неопределяемый обычными способами путь к инишнику прописан. Для этого случая спец-метод есть (GetIniFiles). Конечно, его можно было бы интегрировать в иниткод объекта, но оно ведь не всегда нужно, а окно About при этом неприятно мелькать будет при старте.
Back to top
View user's profile Send private message
Andry



Joined: 14 Jun 2006
Posts: 4

Post (Separately) Posted: Sat Jun 17, 2006 10:18    Post subject: Reply with quote

Путь к инишнику у меня прописан в ярлыке. Так уже давно делается и я думал что стало нормой жизни. Третий вариант от Batya работает так как надо, даже когда запущено два командера одновременно (с разными инишниками). При запуске скрипта командер вставляет пункт меню к себе в ini, а не в чужой. Не обошлось без приколов. На одном компе скрипт работает отлично, на другом не работает. Вроде совт одинаковый, винда, командер, хэлпер (версии одни). Там где строка TCS.GetIniFiles выдёт ошибку. Я эту строку отключил, вместо следующей строки написал IniFile = "C:\Program Files\TotCom\Prof\Main.ini" и всё заработало. Пользуюсь этим скриптом, спасибо!
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Sat Jun 17, 2006 19:19    Post subject: Reply with quote

Andry wrote:
Там где строка TCS.GetIniFiles выдёт ошибку.

Что за ошибка-то? Наверное "Метод GetIniFiles не найден"? Допиши-ка лучше строчку TCS.About и скажи, что за версия в мессаге написана. Должна быть beta10.
Back to top
View user's profile Send private message
Andry



Joined: 14 Jun 2006
Posts: 4

Post (Separately) Posted: Mon Jun 19, 2006 19:39    Post subject: Reply with quote

Ошибка такая - Ошибка: Invalid procedure call or argument. Код: 800A0005. Источник: TCScript. На трёх компах работает, на одном нехочет. Строка TCS.About выдёт - Version: Beta10. Я скачивал его недавно.
И ещё, строка if StrComp(Data(0), "TOTALCMD#BAR#DATA", 1) = 0 then выдаёт ошибку если в буфере обмена не текстовые данные или пусто.
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Tue Jun 20, 2006 00:42    Post subject: Reply with quote

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

Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2218
Location: Москва, Россия

Post (Separately) Posted: Tue Jun 20, 2006 11:04    Post subject: Reply with quote

Volniy
ОК. Поправлю последний пост со скриптом.
Только...
Quote:
If UBound(Data) <> 8

не совсем верно. Раз уж мы делаем защиту от дурака, то... В буфере может быть не вся информация о кнопке. Для панели работает, даже если всего две строки - заголовок и команда.
_________________
Нет, я не сплю. Я просто медленно моргаю.
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  Next
Page 1 of 2

 
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