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

enable one uicontrol by another uicontrol MATLAB

我有 2 个 edittext uicontrol。如果第一个输入确保条件,我想启用第二个。但是,我遇到了错误 'Reference to non-existing field'。我的代码如下:

 % 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