И так в меню любого элемента bbInterface - Global Options - Desctop OnDrop Command пишем:
@Script [@BBInterface Control Create Button|@tcl confIcon $$LastControl$$ {$$DroppedFile$$} $$Mouse.X$$ $$Mouse.Y$$]
И добавляем tcl-команду следующего содержания:
set iCount 0
Код
proc confIcon {icon file x y} {
broam "@BBInterface Control SetWindowProperty $icon Width 38"
broam "@BBInterface Control SetWindowProperty $icon Height 38"
broam "@BBInterface Control SetWindowProperty $icon X $x"
broam "@BBInterface Control SetWindowProperty $icon Y $y"
broam "@BBInterface Control SetAgent $icon Image Icon \"$file\""
broam "@BBInterface Control SetAgent $icon LeftMouseDown Run \"$file\""
if {[string trim $icon Button]>$::iCount} {incr ::iCount}
} |
Разбор полётов. В первых двух способах мы использовали для создания иконок независимые способы. Сейчас всё немного по другому:
@Script [@BBInterface Control Create Button|@tcl confIcon $$LastControl$$ {$$DroppedFile$$} $$Mouse.X$$ $$Mouse.Y$$]
Конструкция @Script нам знакома. @BBInterface Control Create Button также (см способ создания иконок через bbInterface).
А как же работает наша процедура? Четыре параметра отвечают за передачу TCL четырёх переменных bbInterface:
icon - $$LastControl$$ - имя последнего созданного элемента.
file - $$DroppedFile$$ - путь к перенесённому на рабочий стол файлу.
x y - $$Mouse.X$$ $$Mouse.Y$$ - координаты X и Y мыши во время срабатывания скрипта.
Я думаю что вызов всех Bro@m в коде процедуры ясен. Разберём только строчку:
if {[string trim $icon Button]>$::iCount} {incr ::iCount}
оператор if - оператор сравнения. Простой (есть ещё и сложный) формат оператора if:
if {выражение} {действие}. Сначала вычисляется выражение, если оно истинно (=1) то выполняется действие, иначе ничего и скрипт продолжает выполняться дальше.
string trim $icon Button - команда string trim позволяет "обрезать" в строке начальные и конечные символы. Формат такой: string trim строка символы. В нашем случае из строки $icon вырезаются символы Button. Когда bbInterface создаёт кнопку командой @BBInterface Control Create Button то он присваивает ей имя ButtonX где Х первое свободное число. Вырезав из строки ButtonX символы Button мы оставляем только число X.
Далее мы сравниваем это число X с параметром iCount и если X больше то увеличиваем iCount на 1. Для чего это делается мы увидим чуть позже.
Здесь также необходимо пояснить использование ::iCount. Мы объявили iCount вне текста нашей процедуры (как в примере с TCL вариантом создания иконок). Значит если мы хотим использовать переменную внутри процедуры нам необходимо выполнить команду global. Но есть и второй вариант: использовать пространства имён. Объясню подробно. Всё что написано вне процедур выполняется в основном пространстве имён (оно обозначается :: ). Переменные заданные внутри тела процедуры (например её параметры) составляют другое пространство имён. Это позволяет использовать переменные с одинаковыми именами в процедуре и в основном коде, т.е. мы вполне могли бы задать в коде процедуры confIcon переменную iCount (set iCount 0 например) и она не совпадала бы по значению с переменной iCount заданной в основном коде. Если в теле процедуры необходимо использовать переменную из основного кода то можно получить к ней доступ через команду global или через указание её полного имени (включая пространство имён), что мы и делаем (::iCount). Попробуйте убрать в TCL варианте команду global и заменить iCount на ::iCount. Процедура будет работать точно также. Всё это выглядит немного заумно, но впоследствии я попробую на более ярких примерах показать варианты использования пространств имён.











