Matlab 通过另一个uicontrol启用一个uicontrol

Matlab 通过另一个uicontrol启用一个uicontrol,matlab,user-interface,uicontrol,Matlab,User Interface,Uicontrol,我有两个编辑文本。如果第一个输入确保了条件,我想启用第二个。然而,我遇到了错误“引用不存在的字段”。我的代码如下: % xadet is a number input S.eth_xadet = uicontrol(S.ph_agac,'Style','edit',... 'String','1',... 'HorizontalAlignment','right',... 'BackgroundColor','w',... 'Position',[200 68

我有两个编辑文本。如果第一个输入确保了条件,我想启用第二个。然而,我遇到了错误“引用不存在的字段”。我的代码如下:

 % xadet is a number input
 S.eth_xadet = uicontrol(S.ph_agac,'Style','edit',...
    'String','1',...
    'HorizontalAlignment','right',...
    'BackgroundColor','w',...
    'Position',[200 68 30 18],...
    'callback',{@eth_x_adet_enable,S});

% xaralik is a number input
S.eth_xaralik = uicontrol(S.ph_agac,'Style','edit',...
    'enable','off',...
    'String','0',...
    'HorizontalAlignment','right',...
    'Position',[240 68 50 18]);

function [] = eth_x_adet_enable(varargin)

S = varargin{3}

x_adet = str2double(get(S.eth_xadet,{'String'}));

if x_adet > 1 % if input is bigger than 1, enable xaralik
    set(S.eth_xaralik,'enable','on',...
        'BackgroundColor','w');
end

实际发生错误的原因是这一行:

S = varargin{3} 
您已经在回调定义中为函数提供了S作为输入参数,因此无需再次检索它

如果你去掉那条线,它就可以正常工作。正如@thewaywewalk提到的,您应该提供一个用于获取错误的完整代码的最小示例

或者,如果在编辑框回调中显示varargin,您将看到varargin{1}实际上是eth_xadet的句柄,因此您可以使用

P = varargin{1}      
x_adet = str2double(get(P,'String'));
而且它也可以很好地工作

无论如何,我只是创建了一个新函数,并添加了一个句柄为S.ph_agac的图形,它工作正常:

function EnableEdit(~)

clc
clear

S.ph_agac = figure;
% xadet is a number input
S.eth_xadet = uicontrol(S.ph_agac,'Style','edit',...
    'String','1',...
    'HorizontalAlignment','right',...
    'BackgroundColor','w',...
    'Position',[200 68 30 18],...
    'callback',{@eth_x_adet_enable,S});

% xaralik is a number input
S.eth_xaralik = uicontrol(S.ph_agac,'Style','edit',...
    'enable','off',...
    'String','0',...
    'HorizontalAlignment','right',...
    'Position',[240 68 50 18]);


    function [] = eth_x_adet_enable(varargin)
%// =================
%// Note I removed the S = varargin{3} line
%// =================
        x_adet = str2double(get(S.eth_xadet,'String'));

        if x_adet > 1 % if input is bigger than 1, enable xaralik
            set(S.eth_xaralik,'enable','on',...
                'BackgroundColor','w');
        end

    end

end

应在定义uicontrol后定义回调

 % xadet is a number input
 S.eth_xadet = uicontrol(S.ph_agac,'Style','edit',...
    'String','1',...
    'HorizontalAlignment','right',...
    'BackgroundColor','w',...
    'Position',[200 68 30 18]);

% xaralik is a number input
S.eth_xaralik = uicontrol(S.ph_agac,'Style','edit',...
    'enable','off',...
    'String','0',...
    'HorizontalAlignment','right',...
    'Position',[240 68 50 18]);

% Here this part solves the problem.
set(S.eth_xadet,'callback',{@eth_x_adet_enable,S})

function [] = eth_x_adet_enable(varargin)

S = varargin{3}

x_adet = str2double(get(S.eth_xadet,{'String'}));

if x_adet > 1 % if input is bigger than 1, enable xaralik
    set(S.eth_xaralik,'enable','on',...
        'BackgroundColor','w');
end

删除x_adet=str2doublegetS.eth_xadet中的{},{'String'}?顺便问一下,Matlab是否告诉您错误出现在哪一行?是否删除{}不是我的问题。我将x_adet作为同一脚本中的输入,使用同一行代码。同样,Matlab也不能告诉问题出在哪里。相反,它表示对不存在字段“S.eth_xadet”的引用。如果您发布一个再现您的问题的最小示例的可执行代码,您会得到更多帮助。我有与您上面编写的相同的代码。唯一的区别是你的是蓝色,而我的是黑色