2015-02-13 2 views
0

У меня есть 2 edittext uicontrol. Я хочу включить второй, если первый вход обеспечивает условие. Однако я столкнулся с ошибкой «Ссылка на несуществующее поле». Мой код ниже:включить один uicontrol другим uicontrol MATLAB

% 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 
+0

remove '{}' in 'x_adet = str2double (get (S.eth_xadet, {'String'}))'? Кстати, не говорит ли Matlab об ошибке, в какой строке? – scmg

+0

Удалять {} это не моя проблема. Я принял x_adet как вход в тот же скрипт с той же строкой кода. Кроме того, Matlab не указывает, где проблема. Вместо этого это указывает на то, что «Ссылка на несуществующее поле« S.eth_xadet ». – kenes

+0

Вы получите дополнительную помощь, если бы опубликовали исполняемый код минимального примера, воспроизводящего вашу проблему. – thewaywewalk

ответ

0

обратные вызовы должны быть определены после того, как uicontrols определены.

% 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 
0

Ошибка на самом деле происходит из-за этой линии:

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 
+0

У меня тот же код, который вы написали выше. Единственное различие заключается в том, что «S» является синим в вашей, тогда как черный в шахте – kenes

+0

хорошо, так это работает? Извините, я только что видел ваш комментарий. –

Смежные вопросы