购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 指定回调属性值

要将一个回调函数与一个控件关联,需将该控件的一个回调属性的值设为对该回调函数的引用。通常在定义控件时进行此设置,但也可以在代码中的任意位置更改回调属性值。

可以采用以下方法之一指定回调属性值。

(1)指定函数句柄。

函数句柄提供了一种以变量表示函数的方法。函数必须是与App代码处于同一文件内的局部或嵌套函数,也可以将其写入置于MATLAB路径上的单独文件。

要创建函数句柄,需要在函数名称前面添加@符号。例如,以下代码将Callback属性指定为函数pushbutton_callback的句柄。

b=uicontrol('Style','pushbutton','Callback',@pushbutton_callback);

以下是pushbutton_callback的函数定义。

function pushbutton_callback(src,event)
   display('Button pressed');
end

请注意,函数句柄不会显式引用任何输入参数,但函数声明中包含两个输入参数(src、event)。这两个输入参数对于所有指定为函数句柄的回调都是必需的。MATLAB会在回调函数被执行时自动传递这些参数。第一个输入参数是触发回调的控件,第二个输入参数为回调函数提供事件数据。如果没有可供回调函数使用的事件数据,则MATLAB将以空数组的形式传递第二个输入参数。表2-2列出了使用事件数据的回调属性和适用的控件。

表2-2 回调属性及适用的控件

指定回调函数为函数句柄的好处在于,MATLAB会在回调函数指定给控件时检查函数中是否存在语法错误和依赖项缺失。如果回调函数中存在问题,则MATLAB会立即返回错误,而不是等待触发回调后返回错误。此行为可帮助调试者查找代码中存在的问题,以免问题遗留到用户手中。

(2)指定元胞数组。

使用元胞数组指定回调函数,可以接收用户希望在回调函数中使用的更多输入参数。元胞数组中的第一个元素是函数句柄,元胞数组中的其他元素是用户希望使用的更多输入参数,元素之间以逗号分隔。用户指定的函数必须定义与指定函数句柄中所述的完全相同的两个输入参数。不过,用户可以在前两个输入参数之后在函数声明中定义其他输入参数。

以下代码将会创建一个普通按钮,并将Callback属性指定为元胞数组。在此示例中,函数的名称为pushbutton_callback,其他输入参数的值为5。

b=uicontrol('Style','pushbutton','Callback',{@pushbutton_callback,5});

以下是pushbutton_callback的函数定义。

function pushbutton_callback(src,event,x)
   display(x);
end

与指定回调属性值为函数句柄一样,使用元胞数组指定回调属性值时,MATLAB会在用户将回调函数指定给对象时检查回调函数中是否存在语法错误和依赖项缺失。

(3)指定匿名函数。

在为对象指定要执行的函数时,如果该函数不支持函数句柄和元胞数组所必需的两个参数,则可以将回调属性值指定为匿名函数。例如,以下代码将会创建一个普通按钮,并将Callback属性指定为匿名函数。在此示例中,函数的名称为myfun,该函数仅定义一个输入参数x。

b=uicontrol('Style','pushbutton','Callback',@(src,event) myfun(x));

(4)指定包含MATLAB命令的字符向量(不推荐)。

如果用户需要执行一些简单的命令,但回调属性值包含过多的命令可能变得难以管理,则可以将回调属性值指定为字符向量。用户所指定的字符向量必须包含有效的MATLAB表达式,其中可能包括函数参数,例如:

hb=uicontrol('Style','pushbutton',…
               'String','Plot line',…
               'Callback','plot(rand(20,3))');

字符向量'plot(rand(20,3))'是一条有效命令,并且MATLAB会在用户单击按钮时为其求值。如果字符向量包含变量,例如,'plot(x)',当用户触发回调函数时,变量x必须在基础工作区内存在,否则将会返回错误。该变量在用户指定回调属性值时不需要存在,但在用户触发回调函数时必须存在。

与指定为函数句柄或元胞数组的回调不同,MATLAB不会检查字符向量是否存在语法错误或依赖项缺失。如果MATLAB表达式存在问题,在用户触发回调函数之前,将无法检测到该问题。 N1qPjshSjYL/YgBj3+gtPf0GRfOIqXTdPIL/4QKLeSot8gEMjMxTREx6t/IHe4b1

点击中间区域
呼出菜单
上一章
目录
下一章
×