Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Prompting Error for user input

Asked by T on 14 Feb 2013

Suppose I have a input box that requires an entry greater than zero before attempting to load a file.

function test_Callback(hObject, eventdata, handles)
  test = str2double(get(hObject, 'String'));
if isnan(test)
    set(hObject, 'String', 0);
    errordlg('Input must be a number','Error');
end
handles.backup.test= test;
guidata(hObject,handles)
function loaddata_Callback(hObject, eventdata, handles)
      test_Callback(hObject, eventdata, handles)
[filename, pathname, Index] = ...
     uigetfile({'*.txt';},['Select the File to load'],...
        '\\MyDocuments\User');

This prompts the error "'Input must be a number','Error'' and allows the user to open and search for this file. What am I doing wrong?

6 Comments

per isakson on 19 Feb 2013

I insist that it is a good thing to first specify how the code should work. And it is easier to read code that is properly formatted; use [Smart Intent] in the editor. See code in my answer.

per isakson on 19 Feb 2013

Yes, but what does the code that I added to my answer do?

per isakson on 20 Feb 2013

Change

    for ii = 1 : 10

to

    while true
T

Tags

Products

No products are associated with this question.

1 Answer

Answer by per isakson on 14 Feb 2013
Edited by per isakson on 19 Feb 2013
Accepted answer

You need to put this

    test = str2double(get(hObject, 'String'));
    if isnan(test)
        set(hObject, 'String', 0);
        errordlg('Input must be a number','Error');
    end

in a loop and not leave the loop until you have a legal value from the user.

BTW: I think it is a good habit to close functions with "end".

.

A detail: change

    set(hObject, 'String', 0);

to

    set(hObject, 'String', '0' );

.

An example according to my originally answer. This code gives the user ten chances to enter a correct value.

    function test_Callback(hObject, eventdata, handles)
        for ii = 1 : 10
            test = str2double(get(hObject, 'String'));
            if isnan(test)
                set(hObject, 'String', 0);
                errordlg('Input must be a number','Error');
            elseif gt(test,1)
                handles.backup.test = test;
                guidata(hObject,handles);
                break
            elseif  gt(1,test)
                set(hObject, 'String', '0');
                errordlg('Input must be greater than 0','Error');
            end
        end
    end

3 Comments

Sean de Wolski on 15 Feb 2013

@Per, I agree with using "end"s as a best practice but it is true that in GUIDE it creates all of the functions without them so adding end to one means you have to add it to all which takes time and makes it harder to add/change functionality.

Of course my best practice is to just write the GUI as a class or function anyway..

per isakson on 20 Feb 2013

How do you want the program to behave?

per isakson on 21 Feb 2013
  • one way would be to make errordlg non-modal and hope that the user sets a legal before before responding to errordlg - might confuse the user (not tested)
  • a better way would be to let test_Callback return a logical value is_ok and
    if is_ok
      [filename, pathname, Index] = ...
           uigetfile({'*.txt';},['Select the File to load'],...
              '\\MyDocuments\User');
    else
       some_dialog('enter a positive integer and try again')
    end
per isakson

Contact us