elseif strcmp(switch, 'set)% Execute the Callback He all -get(gcf, 'User Data): %retrieve the object handles He az= Hc all(1) Hc cur=Hc all (2) str=num2str(get(Hc az, 'Value)): newview=[get(Hc az, 'Value')vw(2)] set(Hc cur,'String,str) 句柄存储于' startup’末端,图形属性' UserData’中,在回调被执行前对此进行检索。 如果有许多回调,如下面的程序片断所示,' UserData'只需检索一次。 if strcmp(switch, 'startup)% Define the controls and tag them %<The 'startupcode is here> set(gcf,'User Data,(Hc az Hc cur)): Store the object handles else This must be a Callback He all=get(gcf,'User Data); Retrieve the object handles Hc azHe all(1): He cur=Hc all (2): %<The 'set Call back code is here> Seif strcmp(switch,'close ') %o<The close Callback code is here> %<Any other Callback code uses additional elseif clauses> 调试GUM文件 回调字符串在命令窗口工作空间中计算并执行的,这个情况对编写和调试GUI函数和脚本 文件有某种隐含意义。回调字符串可以很复杂,尤其是在脚本文件中,这为句法错提供了许多 机会,记录单引号、逗号、括号是令人头痛的事。如果出现了句法错误, MATLAB给出提 示;只要对象的· Callback’属性值是一个真正的文本串, MATLAB就认可了。只有当对象被 激活并将回调字符串传给eval时,才检查回调字符串内部的句法错误 这样让用户定义回调字符串,它涉及还未曾定义过的对象句柄和变量,这使编写相互参照 的程序变得更容易,但是每个回调函数必须分别测试,保证回调字符串是合法的 MATLA B命 令,并且回调字符中涉及的所有变量可在命令窗口工作空间中是可利用的 将回调象函数M文件一样编程或象GU函数本身内的开关一样编程,就可以不运行整个 GU函数而对各个回调进行改变或测试
elseif strcmp(switch, ' set ' ) % Execute the Callback Hc_all = get(gcf, ' UserData ' ); % retrieve the object handles Hc_az = Hc_all(1); Hc_cur = Hc_all(2); str = num2str(get(Hc_az, ' Value ' )); newview = [get(Hc_az, ' Value ' ) vw(2)]; set(Hc_cur, ' String ' ,str) set(gca, ' View ' ,newview) end 句柄存储于 ' startup ' 末端,图形 属性' UserData ' 中,在回调被执行前对此进行检索。 如果有许多回调,如下面的程序片断所示, ' UserData ' 只需检索一次。 if strcmp(switch, ' startup ' ) % Define the controls and tag them % <The ' startup ' code is here> set(gcf, ' UserData ' ,[Hc_az Hc_cur]); % Store the object handles else % This must be a Callback Hc_all=get(gcf, ' UserData ' ); % Retrieve the object handles Hc_az=Hc_all(1); Hc_cur=Hc_all(2); if strcmp(switch, ' set ' ) % <The ' set ' Callback code is here> elseif strcmp (switch, ' close ' ) %<The ' close ' Callback code is here> % <Any other Callback code uses additional elseif clauses> end end 调试GUI M文件 回调字符串在命令窗口工作空间中计算并执行的,这个情况对编写和调试GUI函数和脚本 文件有某种隐含意义。回调字符串可以很复杂,尤其是在脚本文件中,这为句法错提供了许多 机会,记录单引号、逗号、括号是令人头痛的事。如果出现了句法错误,MATLAB给出提 示;只要对象的 ' Callback ' 属性值是一个真正的文本串,MATLAB就认可了。只有当对象被 激活并将回调字符串传给eval时,才检查回调字符串内部的句法错误。 这样让用户定义回调字符串,它涉及还未曾定义过的对象句柄和变量,这使编写相互参照 的程序变得更容易,但是每个回调函数必须分别测试,保证回调字符串是合法的MATLAB命 令,并且回调字符中涉及的所有变量可在命令窗口工作空间中是可利用的。 将回调象函数M文件一样编程或象GUI函数本身内的开关一样编程,就可以不运行整个 GUI函数而对各个回调进行改变或测试
因为回调字符串是在命令窗工作空间中而不在函数本身内计算,在函数与各回调之间传递 数据就变得十分复杂。例如,函数tst包含如下程序: function testO post=[20205020] tpos2=20805020 He text-uicontrol( Style,'text,'String,'Hello,'Position,tposl) Hc-push=uncontrol('Style,' push,'String, Move Text Position',[155010025], Callback,'set(Hc-text, Position,tpos2)): 所有语句都是有效的 MATLAB命令,且回调字符串也对有效的 MATLAB语句估值。文本 对象和按钮出现在图形上,但当激活按钮键时,MA∏LAB就出示错误。 > test 99? Undefined functiion or variable hc text ??? Error while evaluating Callback string 如果test是个脚本文件,就不会出现这样问题,因为所有变量可在命令窗口工作空间中使 用,因为test是个函数, He text和tpos2在命令窗口工作空间中均未定义,回调字符串执行失 种解决方法是使用各个字符串元素来建立回调,该字符串元素由数值而非变量建立,例 如,改变回调字符串如下: Callback,['set9, sprintf(& 15g, Hc text ' Position'',’, sprintf('%.15g %.15g %.15g %.15g,, tpos2) )"]) 建立了包括Hc_text对象句柄值的一个字符串,该值变换成具有15位精度的字符串,而tpos2变 量转换成矩阵表示的字符串。在函数内计算 sprin语句,然后将所得的字符串用在回调中。在 命令窗工作空间执行的实际命令如下所示 eval('set(87.000244140625, Position'',[208050100j)') 将一个对象句柄转换为字符串,必须保持全精度。上例中的变换,使用了小数点后15位的 数字的精度。在 MATLAB中句柄对象转换应使用这样的精度 要记住,变量随后的变换不会改变回调字符串。在前面的例子中,在控制框定义之后改变 tpos2的值,就无效果。例如,在函数结尾处加命令 tpos2=[202005020]
因为回调字符串是在命令窗工作空间中而不在函数本身内计算,在函数与各回调之间传递 数据就变得十分复杂。例如,函数test包含如下程序: function test() tpos1=[20 20 50 20]; tpos2=[20 80 50 20]; Hc_text=uicontrol( ' Style ' , ' text ' , ' String ' , ' Hello ' , ' Position ' ,tposl); Hc-push=uicontrol( ' Style ' , ' push ' , ' String ' , ' Move Text ' ,... ' Position ' ,[15 50 100 25],... ' Callback ' , ' set(Hc-text,"Position",tpos2) ' ); 所有语句都是有效的MATLAB命令,且回调字符串也对有效的MATLAB语句估值。文本 对象和按钮出现在图形上,但当激活按钮键时,MATLAB就出示错误。 >> test >> ??? Undefined functiion or variable Hc_text. ??? Error while evaluating Callback string. 如果test是个脚本文件,就不会出现这样问题,因为所有变量可在命令窗口工作空间中使 用,因为test是个函数,Hc_text和tpos2在命令窗口工作空间中均未定义,回调字符串执行失 败。 一种解决方法是使用各个字符串元素来建立回调,该字符串元素由数值而非变量建立,例 如,改变回调字符串如下: ' Callback ' ,[ ' set9 ' ,... sprintf( ' &.15g ' ,Hc_text),... ' , ' ' Position ' ' , ' ,... sprintf( ' [%.15g %.15g %.15g %.15g] ' ,tpos2),... ' ) ' ]); 建立了包括Hc_text对象句柄值的一个字符串,该值变换成具有15位精度的字符串,而tpos2变 量转换成矩阵表示的字符串。在函数内计算sprinf语句,然后将所得的字符串用在回调中。在 命令窗工作空间执行的实际命令如下所示 eval( ' set(87.000244140625, ' ' Position ' ' ,[20 80 50 100]) ' ) 将一个对象句柄转换为字符串,必须保持全精度。上例中的变换,使用了小数点后15位的 数字的精度。在MATLAB中句柄对象转换应使用这样的精度。 要记住,变量随后的变换不会改变回调字符串。在前面的例子中,在控制框定义之后改变 tpos2的值,就无效果。例如,在函数结尾处加命令 tpos2=[20 200 50 20 ]