Appdesigner Edit Field (Numeric) won't update values.

34 vues (au cours des 30 derniers jours)
zeytun
zeytun le 30 Oct 2020
Commenté : zeytun le 10 Déc 2020
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 commentaires
Mario Malic
Mario Malic le 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
zeytun le 10 Déc 2020
Hello Mario,
I decided to go with a "Push Botton" and that worked nicely. Can you please copy-paste your following comment as a separate answer, so I can accept it?
function Push_Button_Callback(app, event)
app.pumpdelay.Value = app.pumpdelay.Value + app.delaystep.Value
end
I have a follow-up question though :) Every time I hit this new Push Button, I want it to change the value of app.pumpdelay (which it does now), and in addition to that, I want to activate the functionality of another old Push Button (called "Calculate"), which mainly does some plotting. In the old Guide I was implementing this throught the following lines:
guidata(hObject, handles);
mycodename('calculate_Callback',handles.calculate,[],handles);

Connectez-vous pour commenter.

Réponse acceptée

Mario Malic
Mario Malic le 10 Déc 2020
Hello,
Based on the comment section, callback should be written this way
function Push_Button_Callback(app, event)
app.pumpdelay.Value = app.pumpdelay.Value + app.delaystep.Value
CalculateSmth(app)
end
If you create a helper function in your app, just call it, there's no need for another callback in App Designer. Just a reminder that you can not use variables that are defined in another callbacks. Reference the values from app components, or create a property to get around it.
function CalculateSmth(app)
% code
end
  2 commentaires
zeytun
zeytun le 10 Déc 2020
Thanks!
calculate_Callback(app) did not work though, I am guessing because my app was converted from Guide. I am not using helper functions, need to spend some time to learn how to implement them in my code (looks very useful). Here is the error message...
Not enough input arguments.
Error in ultifemto/calculate_Callback (line 389)
[hObject, eventdata, handles] = convertToGUIDECallbackArguments(app, event);
%#ok<ASGLU>
Error in ultifemto/StepButtonPushed (line 2337)
calculate_Callback(app)
Error using matlab.ui.control.internal.controller.ComponentController/executeUserCallback (line 386)
Error while evaluating Button PrivateButtonPushedFcn.
zeytun
zeytun le 10 Déc 2020
Now it worked!!! I had to write calculate_Callback(app, event). Learning is fun :)

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Sparse Matrices dans Help Center et File Exchange

Produits


Version

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by