调用子例程的应用程序范围问题

wid*_*pil 1 applescript

我有一个简短的子程序如下:

\n\n
on show_Dialog(msg)\n  tell application "Script Debugger Demo"\n    display dialog msg\n  end tell\nend show_Dialog\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我从没有告诉语句拥有它的脚本中调用它,例如:

\n\n
show_Dialog("well this works")\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有问题。如果我从调用另一个应用程序的代码块中调用它,我会收到一个(未指定的)错误(-1708),例如:

\n\n
tell application Mail\n  show_Dialog("this will not work for sure")\nend tell\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,在脚本块中,我可以将告诉应用程序“Excel”命令放入告诉应用程序“邮件”代码块中。

\n\n

如何拥有一个始终在特定应用程序中生成对话框的通用对话框子例程?问题是我将我的应用程序分配到不同的空间,当它跳离脚本调试器时会很痛苦。有许多(OS X Spaces 和/或脚本调试器)解决方法,但我想知道为什么此代码失败以及如何正确执行它。

\n\n

编辑->即使当我从子例程中删除“tell application\xe2\x80\xa6\”和“endtell\”行时,我也会收到错误。

\n

dj *_*zie 5

发生错误是因为您当前的目标是应用程序邮件。这意味着一切都以邮件为目标。Mail 不知道处理程序 show_Dialog() 并返回错误。要将目标设置回当前脚本,您可以在处理程序调用前面添加单词my ,将me添加到处理程序调用的末尾,或者在处理程序调用周围包裹一个tell块。

tell application "Mail"
  my show_Dialog("this will work for sure")
end tell
Run Code Online (Sandbox Code Playgroud)

或者

tell application "Mail"
  show_Dialog("this will work for sure") of me
end tell
Run Code Online (Sandbox Code Playgroud)

或者

tell application "Mail"
   tell me
      show_Dialog("this will work for sure")
   end tell
end tell
Run Code Online (Sandbox Code Playgroud)