Share one callback with multiple elements and pass on the respectively number in the callback

2 visualizzazioni (ultimi 30 giorni)
Hi everyone,
is there a way to refer multiple elements with systematical names (e.g. Dropdown_Ydata1, Dropdown_Ydata2, Dropdown_Ydata3) with a identical function to one callback, then read the number (1,2 or 3) and pass on this number to the following code?
%for example:
%shared variables through the app : y1, y2, y3
% ValueChanged function: Dropwdown_Ydata1, Dropwdown_Ydata2, Dropwdown_Ydata3
%% read number (1 ... 3) and save it as "i" (I had the idea to read the tag of the
% respectively App and then get the number with regexp)
source = event.Source.Tag;
i = regexp(source,'\d+','match')
x = ... % doesn't matter
%% write the number (i) in the following code
% im not sure how to do this because i read that dynamically changing variables are "wrong".
% Maybe store them in a string/matrix - i dont know
y = app.y(i).(app.Dropwdown_Ydata(i).Value);
plot(app.UIAxes, x, y);
This would save me a ton of code because i have multiple elements(40 to 50) with the exact same callback. The only part that is changing is the name of the element (e.g. app.name(x)). I started working with matlab just a few weeks ago so please forgive me some obviously mistakes.
edit 15.06.21:
i found a way to do it, maybe one of u can tell me if this is a good idea or just mixing "wrong" things. Im open to a better/faster way.
%shared variables through the app : y1, y2, y3
% ValueChanged function: Dropwdown_Ydata1, Dropwdown_Ydata2, Dropwdown_Ydata3
source = event.Source.Tag; %get the Tag of the source
i = regexp(source,'\d+','match'); %get the number out of the tag (outputs a cell array)
i = str2double(i); %outputs a number
y = app.(sprintf('y%d', i)).(app.(sprintf('Dropwdown_Ydata%d',i)).Value); %sets the name of the apps (e.g. app.y1.(app.Dropwdown_Ydata1.Value));
plot(app.UIAxes, y);
the sprintf-thing makes the code a little bit messy but as mentioned it saves me a ton of code.

Risposta accettata

Mohammad Sami
Mohammad Sami il 15 Giu 2021
Yes you can assign the same callback to multiple objects. The above code you shared is fine.
However you can access the value of the dropdown directly since its passed in to you inside the event object.
Also if you make the variable y as an array of struct you will not need to use sprintf.
source = event.Source.Tag; %get the Tag of the source
i = regexp(source,'\d+','match'); %get the number out of the tag (outputs a cell array)
i = str2double(i); %outputs a number
y = app.y(i).(event.Value); %sets the name of the apps (e.g. app.y(1).(app.Dropwdown_Ydata1.Value));
plot(app.UIAxes, y);

Più risposte (0)

Categorie

Scopri di più su Develop Apps Using App Designer in Help Center e File Exchange

Prodotti


Release

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by