Функция обратного вызова uicontrol слишком много входных аргументов

Моя цель - получить ввод пользователя из текстового поля uicontrol, выполнить операции над вводом, а затем отобразить вывод в другое текстовое поле. MATLAB выдает ошибку:

Error using
UnitConverter/lbs2kg
Too many input arguments.

Error in
UnitConverter>@(varargin)app.lbs2kg(varargin{:})
(line 22)
                'Callback',@app.lbs2kg,'String',app.inputMass); 
Error while evaluating UIControl Callback

Вот мой код:

classdef UnitConverter < handle


    properties
        Figure                  % Graphics handles
        DispInputMass
        DispOutputMass

        inputMass               %Variables/Class Properties
        outputMass 
    end


    methods

        function app = UnitConverter
            % This is the "constructor" for the class
            % It runs when an object of this class is created
            app.Figure = figure('Name','Unit Converter') ;

            app.DispInputMass = uicontrol('Style','edit',...
                'Callback',@app.lbs2kg,'String',app.inputMass);

            app.DispOutputMass = uicontrol(app.Figure,'Style','edit','Position'...
                 ,[168 100 47 26],'String','kg');
        end



        function lbs2kg(app,evt)
            app.inputMass = get(app.DispInputMass,'string');
            app.outputMass = app.inputMass*.453;
            set(app.DispOutputMass,'string',app.outputMass);
        end


    end
end

person ih1358    schedule 13.11.2015    source источник


Ответы (1)


Метод обратного вызова на самом деле имеет 3 входа - MATLAB выдает эту ошибку, потому что он пытается отправить три входа в ваш обратный вызов, который написан так, чтобы принимать только 2. 3 входа (по порядку): основной объект (приложение), объект отправка события (uicontrol) и события (matlab.ui.eventdata.ActionData).

Вы можете изменить код на следующий, чтобы заставить его работать:

function lbs2kg(app, obj, evt)
    app.inputMass = get(app.DispInputMass,'string');
    app.outputMass = app.inputMass*.453;
    set(app.DispOutputMass,'string',app.outputMass);
end

Кроме того, вы можете изменить первую строку функции на следующую:

function lbs2kg(varargin)

Сделайте точку останова в коде на первой строке обратного вызова и исследуйте содержимое varargin. Дополнительную информацию о varargin см. здесь (http://www.mathworks.com/help/matlab/ref/varargin.html)

person John Razzano    schedule 13.11.2015
comment
Большой! Спасибо за вашу помощь! - person ih1358; 14.11.2015