Могу ли я узнать, есть ли у объекта AppleScript определенное свойство?
Я пытаюсь написать сценарий BBEdit, чтобы я чувствовал себя как дома, приходя из TextMate. Одна вещь, которую я должен уметь делать - это видеть, обладает ли объект, на который я ссылаюсь, определенным свойством.
Например:
tell application "BBEdit"
tell front window
get selected items
end tell
end tell
Это будет успешно выполнено в окне проекта, но не в окне браузера диска, поскольку последнее не имеет свойства "выбранные элементы". Как узнать, есть ли такое свойство в объекте?
Обратите внимание: я знаю, как проверить объект в редакторе сценариев (получить свойства), чтобы увидеть, какие свойства у него есть, но мне нужно знать, какие они есть во время выполнения.
4 ответа
Как насчет класса?
tell application "BBEdit"
if class of window 1 is disk browser window then
# ...
else
# ...
end if
end tell
У меня нет bbedit, поэтому я не могу проверить, но если существуют разные типы окон, и каждый тип окна имеет разные свойства, то не могли бы вы сначала просто проверить тип окна? Тогда вы будете знать, какие свойства вы можете получить. Должно быть какое-то базовое свойство окна, которое сообщает вам его тип или вид, или что-то еще, что поможет вам принять решение.
Есть разница между documents
а также windows
в BBEdit. Windows
являются элементом documents
, но только windows
иметь selection
свойство, так что вы можете сначала проверить тип окна и полностью избежать перехвата ошибок (и в результате сделать код более чистым).
Кроме того, попробуйте использовать selection
свойство, которое является жестким свойством в BBEdit, а не "выбранными элементами", потому что selection
всегда будет возвращать полезный объект, даже если только insertion point
,
Единственное решение, которое у меня есть, - это обернуть его в обработчик ошибок:
try
set sel to selected items
on error errMsg number errNum
if errNum is -1700 then
-- Code that handles no selected items attribute
return
end
error errMsg number errNum
end try
-- Code that handles when selected items attribute exists