Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查MATLAB句柄是否有效?_Matlab_Graphics_Handle - Fatal编程技术网

如何检查MATLAB句柄是否有效?

如何检查MATLAB句柄是否有效?,matlab,graphics,handle,Matlab,Graphics,Handle,我使用绘图的句柄操作绘图上的数据: x = 1:10; y = sin(x); h1 = line(x,y); 但是,如果该图在脚本实际终止之前关闭,则执行类似操作将返回错误 >>set(h1,'Color','green') % line is green ??? Error using ==> set Invalid handle object. 在对h1进行任何操作之前,是否有方法检查其是否为有效句柄?您可以使用该功能首先检查图形句柄是否有效: if ishandle

我使用绘图的句柄操作绘图上的数据:

x = 1:10; y = sin(x);
h1 = line(x,y);
但是,如果该图在脚本实际终止之前关闭,则执行类似操作将返回错误

>>set(h1,'Color','green') % line is green
??? Error using ==> set
Invalid handle object.
在对h1进行任何操作之前,是否有方法检查其是否为有效句柄?

您可以使用该功能首先检查图形句柄是否有效:

if ishandle(h1)
  set(h1, 'Color', 'green');
end
更新:

对于较新版本的MATLAB,句柄对象是实际对象,而不仅仅是数值。更好的选择是使用处理对象的方法:

if isvalid(h1)
  set(h1, 'Color', 'green');
end

请注意,iHandle有一个缺点,它还接受常见的数值,如0(=桌面句柄)和1(=默认情况下第一个打开的数字),这两个值通常也是有效的句柄,尽管可能不是预期的句柄。如果您试图设置一个不存在的属性,您仍然会看到一个错误

要处理此类情况,只需将代码放在异常处理块中:

try
   set(myHandle,propName,propValue);
catch
   % do something useful... (recreate the GUI?)
end

try/catch块是一个很好的解决方案。但是,句柄
0
始终为根对象保留,并且打印对象或uicontrol始终具有浮点句柄。默认情况下,图形具有整数句柄,但您可以通过创建属性“IntegerHandle”设置为“off”的图形,强制MATLAB对图形使用浮点句柄。这将避免创建地物、存储整数句柄,然后删除地物并使用相同的整数句柄创建新地物的情况(因此它实际上与第一个句柄所指的地物不同)。如果知道要查找的对象类型,可以显式测试它。将if iHandle(h1)替换为if iHandle(h1)和strcmp(get(h1,'type'),'line')a=0。ishandle(a)返回true。但a不是数字,所以:答案不完整。@Pedro77:不正确。如果存储句柄(如示例中所示),然后稍后使用
ishandle
检查它们以确保它们仍然有效,则永远不会出现句柄为0的情况。只有根对象可以为零;图形句柄永远不会是。我使用的是:“if isgraphics(figHandle,'figHandle')&&ishandle(figHandle)”@Pedro77:如果需要检查句柄是否是特定类型的图形对象句柄并且是有效的,
isgraphics
就是您所需要的(它已经检查了有效性)。如果您只需要检查有效性,而不关心它是(或已经知道)什么特定类型的图形对象,
isvalid
就是您所需要的。检查句柄的另一种方法,在某些情况下可能有用,就是
设置(h1,'DeleteFcn',@delete_fcn_callback)
,其中
函数delete_fcn_callback(hObj,event)
是您定义的内容,在删除图形时将调用它。