View previous topic :: View next topic |
Author |
Message |
Andry
Joined: 14 Jun 2006 Posts: 4
|
(Separately) Posted: Wed Jun 14, 2006 20:58 Post subject: Перенос кнопки иконбара в меню запуск |
|
|
Все вы прекрасно знаете как быстро и мгновенно можно создать кнопку в иконбаре, и как долго и мучительно пункт в меню "запуск". По этому случаю у меня просьба к скриптописателям написать скрипт который копирует кнопку и вставляет её в меню запуск.
Что-бы не усложнять процесс можно копировать последнюю кнопку из бара в конец меню запуск а потом уже руками передвинуть куда надо. Хотелось что-бы это был "чистый" .vbs (виндовый).
Заранее спасибо.
[/list] |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2220 Location: Москва, Россия
|
(Separately) Posted: Thu Jun 15, 2006 15:56 Post subject: |
|
|
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 |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Thu Jun 15, 2006 23:03 Post subject: |
|
|
Классный скрипт! Поздравляю. Must have, в натуре!
Ни на что не претендуя, хочу просто упростить его, скажем так, чисто визуально. Алгоритм не изменен.
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 |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2220 Location: Москва, Россия
|
(Separately) Posted: Fri Jun 16, 2006 10:15 Post subject: |
|
|
Volniy
Вообще, хорошая мысль - сразу сделать массив строк.
А в остальном, не со всем согласен.
1. Чем For лучше, чем Do While?
Кстати, количество пунктов меню максимально может быть 200 - команды с номерами от 700 до 899.
2. У тебя получается, что строки "param", "path" и "iconic" добавляются всегда. А нафига? Или метод INIWrite твоего Хэлпера не добавляет ключ с пустым значением?
3. Объясни еще раз, нафига всё же нужен LockTC? Почему ты его не включил? |
|
Back to top |
|
|
Andry
Joined: 14 Jun 2006 Posts: 4
|
(Separately) Posted: Fri Jun 16, 2006 12:28 Post subject: |
|
|
Оба скрипта работают, но только "не туда". Я сначала не мог понять почему не добавляются менюшки, потом по старой памяти нашел файл c:\WINDOWS\wincmd.ini, все пишется туда. Можно ли указать полный путь к ini файлу или есть команда с помощью которой скрипт сам может найти нужный ini файл (их может быть несколько). |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2220 Location: Москва, Россия
|
(Separately) Posted: Fri Jun 16, 2006 12:42 Post subject: |
|
|
Andry wrote: | Можно ли указать полный путь к ini файлу или есть команда с помощью которой скрипт сам может найти нужный ini файл (их может быть несколько). |
Можно и то, и другое. Только странно, почему подхватился другой инишник. Ты, случаем, в ярлыке TC его не прописываешь?
И что значит "их может быть несколько"? TC может быть запущен только с один инишником.
Volniy
Почему MainINI отработал неверно? |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2220 Location: Москва, Россия
|
(Separately) Posted: Fri Jun 16, 2006 13:25 Post subject: |
|
|
Вот новый вариант скрипта с учетом предложения от 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 |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Fri Jun 16, 2006 18:02 Post subject: |
|
|
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 |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2220 Location: Москва, Россия
|
(Separately) Posted: Fri Jun 16, 2006 18:49 Post subject: |
|
|
Volniy
ОК. Спасибо!
Преределал предыдущий пост с учетом замечаний. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sat Jun 17, 2006 02:24 Post subject: |
|
|
Batya wrote: | Почему MainINI отработал неверно? |
Потому что у человека неопределяемый обычными способами путь к инишнику прописан. Для этого случая спец-метод есть (GetIniFiles). Конечно, его можно было бы интегрировать в иниткод объекта, но оно ведь не всегда нужно, а окно About при этом неприятно мелькать будет при старте. |
|
Back to top |
|
|
Andry
Joined: 14 Jun 2006 Posts: 4
|
(Separately) Posted: Sat Jun 17, 2006 10:18 Post subject: |
|
|
Путь к инишнику у меня прописан в ярлыке. Так уже давно делается и я думал что стало нормой жизни. Третий вариант от Batya работает так как надо, даже когда запущено два командера одновременно (с разными инишниками). При запуске скрипта командер вставляет пункт меню к себе в ini, а не в чужой. Не обошлось без приколов. На одном компе скрипт работает отлично, на другом не работает. Вроде совт одинаковый, винда, командер, хэлпер (версии одни). Там где строка TCS.GetIniFiles выдёт ошибку. Я эту строку отключил, вместо следующей строки написал IniFile = "C:\Program Files\TotCom\Prof\Main.ini" и всё заработало. Пользуюсь этим скриптом, спасибо! |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sat Jun 17, 2006 19:19 Post subject: |
|
|
Andry wrote: | Там где строка TCS.GetIniFiles выдёт ошибку. |
Что за ошибка-то? Наверное "Метод GetIniFiles не найден"? Допиши-ка лучше строчку TCS.About и скажи, что за версия в мессаге написана. Должна быть beta10. |
|
Back to top |
|
|
Andry
Joined: 14 Jun 2006 Posts: 4
|
(Separately) Posted: Mon Jun 19, 2006 19:39 Post subject: |
|
|
Ошибка такая - Ошибка: Invalid procedure call or argument. Код: 800A0005. Источник: TCScript. На трёх компах работает, на одном нехочет. Строка TCS.About выдёт - Version: Beta10. Я скачивал его недавно.
И ещё, строка if StrComp(Data(0), "TOTALCMD#BAR#DATA", 1) = 0 then выдаёт ошибку если в буфере обмена не текстовые данные или пусто. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Tue Jun 20, 2006 00:42 Post subject: |
|
|
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 |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2220 Location: Москва, Россия
|
(Separately) Posted: Tue Jun 20, 2006 11:04 Post subject: |
|
|
Volniy
ОК. Поправлю последний пост со скриптом.
Только...
Quote: | If UBound(Data) <> 8 |
не совсем верно. Раз уж мы делаем защиту от дурака, то... В буфере может быть не вся информация о кнопке. Для панели работает, даже если всего две строки - заголовок и команда. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
|
|
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
|