如何指定同一个 class 的多个 AppleScript 子元素?
How do you specify multiple AppleScript child elements of the same class?
我正在将 Apple 事件脚本添加到我的应用程序中。我希望能够在其上使用以下两个语句:
-- Every instance of MyObject in the app
every MyObject
-- Only the instances of MyObject the user has selected
selected MyObjects
这些是我的 sdef
文件的相关摘录:
<dictionary>
<suite ...>
<class name="application" code="capp" description="Top-level scripting object" plural="applications" inherits="application">
<cocoa class="MyAppClass" />
<element type="MyObject" access="r">
<cocoa key="myobjects" />
</element>
<element name="selected MyObjects" code="ABCD" type="MyObject" access="rw">
<cocoa key="selectedMyObjects" />
</element>
</class>
<class name="MyObject" code="ABcd" inherits="item" plural="MyObjects">
...
</class>
</suite>
</dictionary>
当我调用 every MyObject
时,它 returns 一个对象列表,正如预期的那样。但是当我调用 selected MyObjects
时,脚本编辑器选择了 "MyObjects" 部分并抱怨:
Syntax Error
Expected end of line, etc. but found plural class name.
我怎样才能实现我想要做的事情?
你的设计是错误的。请参阅 Scripting Interface Guidelines 了解良好用户体验实践的略微薄但胜于无的概述。
正确的用法是定义一个selection
属性,通常是在application
and/or document
上。这可能是读写或只读的,具体取决于适合您的应用程序的内容。
selection
属性 的值为:
一个单独的定制对象说明符,标识所有当前 selected 对象,例如:
selection of application "Foo"
或
selection of document X of application "Foo"
一些更好的基于 Carbon 的应用程序和偶尔出现的 Cocoa 应用程序使用这种方法,它允许用户执行强大的查询,例如:
get (name of every MyObject of selection of document X)
delete (every job whose status is completed)
但您需要做更多工作才能实施。
单对象说明符列表,每个说明一个 selected 项目,例如:
{thing B of document X of application "Foo",
thing E of document X of application "Foo",...}
这不太强大,因为用户无法在单个命令中操作所有 selected 项目,而是必须迭代列表,一次处理一个项目,但实现起来更便宜。 Cocoa 即使在最好的情况下,脚本也有些蹩脚和不灵活,并且在一次 moving/duplicating/deleting 多个对象时非常绝望,这是基于 Cocoa 的最常见方法应用程序。
使用此 属性 更新您的 sdef
文件:
<property name="selection" code="ABCD">
<cocoa key="selectedMyObjects" />
<type type="MyObject" list="yes" />
</property>
有关第一种(更好的)设计方法的示例,请查看脚本编辑器自己的词典。有关第二个示例,请参阅 Mail 的字典。
(提示:要在脚本编辑器中查看词典,请选择“文件”>“打开词典”,然后 select 从列表中选择适当的项目。要将该词典导出为 SDEF 文件,只需确保词典查看器 window 最前面并选择文件>另存为。)
我正在将 Apple 事件脚本添加到我的应用程序中。我希望能够在其上使用以下两个语句:
-- Every instance of MyObject in the app
every MyObject
-- Only the instances of MyObject the user has selected
selected MyObjects
这些是我的 sdef
文件的相关摘录:
<dictionary>
<suite ...>
<class name="application" code="capp" description="Top-level scripting object" plural="applications" inherits="application">
<cocoa class="MyAppClass" />
<element type="MyObject" access="r">
<cocoa key="myobjects" />
</element>
<element name="selected MyObjects" code="ABCD" type="MyObject" access="rw">
<cocoa key="selectedMyObjects" />
</element>
</class>
<class name="MyObject" code="ABcd" inherits="item" plural="MyObjects">
...
</class>
</suite>
</dictionary>
当我调用 every MyObject
时,它 returns 一个对象列表,正如预期的那样。但是当我调用 selected MyObjects
时,脚本编辑器选择了 "MyObjects" 部分并抱怨:
Syntax Error
Expected end of line, etc. but found plural class name.
我怎样才能实现我想要做的事情?
你的设计是错误的。请参阅 Scripting Interface Guidelines 了解良好用户体验实践的略微薄但胜于无的概述。
正确的用法是定义一个selection
属性,通常是在application
and/or document
上。这可能是读写或只读的,具体取决于适合您的应用程序的内容。
selection
属性 的值为:
一个单独的定制对象说明符,标识所有当前 selected 对象,例如:
selection of application "Foo"
或
selection of document X of application "Foo"
一些更好的基于 Carbon 的应用程序和偶尔出现的 Cocoa 应用程序使用这种方法,它允许用户执行强大的查询,例如:
get (name of every MyObject of selection of document X) delete (every job whose status is completed)
但您需要做更多工作才能实施。
单对象说明符列表,每个说明一个 selected 项目,例如:
{thing B of document X of application "Foo", thing E of document X of application "Foo",...}
这不太强大,因为用户无法在单个命令中操作所有 selected 项目,而是必须迭代列表,一次处理一个项目,但实现起来更便宜。 Cocoa 即使在最好的情况下,脚本也有些蹩脚和不灵活,并且在一次 moving/duplicating/deleting 多个对象时非常绝望,这是基于 Cocoa 的最常见方法应用程序。
使用此 属性 更新您的
sdef
文件:<property name="selection" code="ABCD"> <cocoa key="selectedMyObjects" /> <type type="MyObject" list="yes" /> </property>
有关第一种(更好的)设计方法的示例,请查看脚本编辑器自己的词典。有关第二个示例,请参阅 Mail 的字典。
(提示:要在脚本编辑器中查看词典,请选择“文件”>“打开词典”,然后 select 从列表中选择适当的项目。要将该词典导出为 SDEF 文件,只需确保词典查看器 window 最前面并选择文件>另存为。)