Appdesigner Edit Field (Numeric) won't update values.
Show older comments
Hi. I have 2 Edit Fields in my app - "Delay" and "Step". The goal is to set the step size and update the delay value. It is in principle working, but only if I change the two values every time. If I want to keep the step size at 20, I would expect that the Delay value would increase by 20 every time I hit the enter button. Moreover, this was working with the Guide, but when I transferred to Appdesigner recently (by using the migration functionality), I noticed that the Delay value would update only when I change the step size (or the Delay value itself). Here is my code. You can see the old Guide-style code lines commented, as well.
% Value changed function: pumpdelay
function pumpdelay_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% hObject handle to pumpdelay (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of pumpdelay as text
% str2double(get(hObject,'String')) returns contents of pumpdelay as a double
pumpdelay = str2num(app.pumpdelay.Value)
delaystep = str2num(app.delaystep.Value)
pumpdelay = pumpdelay + delaystep
app.pumpdelay.Value = num2str(pumpdelay); % Set
% pumpdelay = str2num(get(handles.pumpdelay, 'String'));
% delaystep = str2num(get(handles.delaystep, 'String'));
% pumpdelay = pumpdelay + delaystep;
% set(handles.pumpdelay, 'String', num2str(pumpdelay));
% guidata(hObject, handles);
% CARS_GUI_2pulse_18('calculate_Callback',handles.calculate,[],handles);
end
% Value changed function: delaystep
function delaystep_Callback(app, event)
% Create GUIDE-style callback args - Added by Migration Tool
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event); %#ok<ASGLU>
% hObject handle to delaystep (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'String') returns contents of delaystep as text
% str2double(get(hObject,'String')) returns contents of delaystep as a double
pumpdelay = str2double(app.pumpdelay.Value)
delaystep = str2double(app.delaystep.Value)
pumpdelay = pumpdelay + delaystep
app.pumpdelay.Value = num2str(pumpdelay); % Set
% pumpdelay = str2num(get(handles.pumpdelay, 'String'));
% delaystep = str2num(get(handles.delaystep, 'String'));
% pumpdelay = pumpdelay + delaystep;
% set(handles.pumpdelay, 'String', num2str(pumpdelay));
% guidata(hObject, handles);
end
7 Comments
zeytun
on 1 Nov 2020
Mario Malic
on 1 Nov 2020
Edited: Mario Malic
on 1 Nov 2020
Hello,
I forgot to reply to this one, so, I would suggest you first to get rid of str2double, num2str and so on in your App Designer code. If your Edit Field is numeric, so is your input.
Second, It is in principle working, but only if I change the two values every time. If you consider any of your callback functions, The Edit Field for the app.pumpdelay.Value is set only when you change the number, then, the callback is executed and component's property gets the value.
You can set the value for app.pumpdelay.Value in the Component Browser, or programmatically by assigning it in StartupFcn, do the first one for now.
You have also mentioned that you have an Enter button - to solve the task in the easiest way (if I understood it correctly), you can just assign component properties within the Push Button callback. Starting values for properties are still needed.
function Push_Button_Callback(app, event)
app.pumpdelay.Value = app.pumpdelay.Value + app.delaystep.Value
end
I am reading my comment now, and it seems to me that it's improperly written because there's plenty of intormations in few sentences. Once when issues are simplified, we can solve it one by one.
zeytun
on 2 Nov 2020
Mario Malic
on 2 Nov 2020
Edited: Mario Malic
on 2 Nov 2020
Hello,
Callback is the type of function that is executed under certain circumstances, in your case:
% Value changed function: DelayStepEditField
function DelayStepEditFieldValueChanged(app, event)
app.PumpDelayEditField.Value = app.PumpDelayEditField.Value + app.DelayStepEditField.Value;
end
This code will run when you change the Delay Step value (you can either press enter, or click elsewhere on the UI to finish input).
The value in the Component Browser is the default one, correct. Assume that you run your code, without having these default values. If you write a value in one of the components, let's say DelayStep, and your callback says to calculate PumpDelay = PumpDelay+DelayStep, it won't work because PumpDelay is not defined.
>> a.Value = []
a =
struct with fields:
Value: []
>> b.Value = 5
b =
struct with fields:
Value: 5
>> a.Value + b.Value
ans =
[]
There are two ways to set the default values, one is that you're familiar with, through the component browser, and second is through the StartupFcn. This function runs after components have been created and will overwrite the default values defined in component browser.
I have attached the demo application, I think this should help you, also there are few tutorial apps that cover stuff like this in minutes, so make sure you do them, as they are super helpful!
zeytun
on 2 Nov 2020
Mario Malic
on 2 Nov 2020
I have explained when are callbacks executed above. In your case, the callback is Value Changed Function which means, the callback will be executed when the value is changed. So, if you're deleting and writing the same number (without clicking anywhere else but the Edit Field), the Pump Delay value will not change.
If you would like to do the calculation using the Enter button, then you need to add another callback function called WindowKeyPressFcn, here's an example code that needs to be edited to fit this example - link.
Bonus points:
This is a simple calculation that's repeated over three callbacks, you can create a helper function and just call the function instead of code to calculate.
function Calculate(app)
app.PumpDelayEditField.Value = app.PumpDelayEditField.Value + app.DelayStepEditField.Value;
end
zeytun
on 10 Dec 2020
Accepted Answer
More Answers (0)
Categories
Find more on Desktop in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!