2010-05-03 8 views
5

Ho una GUI che utilizza una selezione da un menu popup in un altro callback. C'è un modo per restituire il valore selezionato del menu popup in una sola riga senza creare alcuna variabile temporanea? Ho provato diverse soluzioni, ma sono riuscito solo due linee con una variabile temporanea:Torna alla selezione del menu popup in MATLAB utilizzando una riga di codice

Tre linee:

list=get(handles.popupmenu1,'String'); 
val=get(handles.popupmenu1,'Value'); 
str=list{val}; 

Due linee:

temp=get(handles.popupmenu1,{'String','Value'}); 
str=temp{1}{temp{2}}; 

Qualcuno può radere verso il basso per uno?

PS, È un menu dinamico, quindi non posso semplicemente usare get(handles.popupmenu1,'Value') e ignorare del tutto il componente stringa.

+4

Non sono sicuro del motivo per cui vorresti lo ritorni su una riga, a meno che tu non sia semplicemente curioso di sapere come potrebbe essere fatto. L'opzione a tre righe è la più chiara e più facile da capire, ed è quella che userei in qualsiasi codice che ho scritto. – gnovice

+1

@gnovice Mi stavo chiedendo principalmente se si può fare. Forse un misto di curiosità e fastidio a MATLAB per non avere una funzione per farlo con una chiamata. – Doresoom

risposta

11

Ecco una battuta:

str = getCurrentPopupString(handles.popupmenu1); 

Ed ecco la definizione di getCurrentPopupString

function str = getCurrentPopupString(hh) 
%# getCurrentPopupString returns the currently selected string in the popupmenu with handle hh 

%# could test input here 
if ~ishandle(hh) || strcmp(get(hh,'Type'),'popupmenu') 
error('getCurrentPopupString needs a handle to a popupmenu as input') 
end 

%# get the string - do it the readable way 
list = get(hh,'String'); 
val = get(hh,'Value'); 
if iscell(list) 
    str = list{val}; 
else 
    str = list(val,:); 
end 

io so che non è la risposta che stavate cercando, ma lo fa rispondere alla domanda che hai chiesto:)

+3

@Jonas: Touché, per avermi dato una soluzione pratica alla mia domanda OCD. – Doresoom

+0

+1: proprio quello che stavo pensando. – gnovice

+0

Devi rimuovere NOT logico da strcmp in questo modo: if ~ ishandle (hh) || strcmp (get (hh, 'Type'), 'popupmenu') – BAR

5

Per renderlo un one-liner, vorrei semplicemente creare la mia funzione (ad esempio getMenuSelection) come Jonas nella sua risposta. Se davvero vuole un vero e proprio one-liner, ecco uno con CELLFUN:

str = cellfun(@(a,b) a{b},{get(handles.popupmenu1,'String')},{get(handles.popupmenu1,'Value')}); 

Molto brutto e difficile da leggere. Sicuramente mi piacerebbe scrivere la mia funzione.

EDIT: Ed ecco un po 'più breve (ma ancora altrettanto brutto) one-liner con FEVAL:

str = feval(@(x) x{1}{x{2}},get(handles.popupmenu1,{'String','Value'})); 
+0

+1 per avermi dato la risposta che in realtà volevo, tuttavia non è pratico che sia – Doresoom

+1

+1 per rispondere alla domanda come previsto. 'cellfun' FTW! – Jonas

5

So che questo è stupido, ma non ho resistito:

list=get(handles.popupmenu1,'String'); str=list{get(handles.popupmenu1,'Value')}; 

So che non è quello che intendevi, ma come le altre risposte sopra, risponde alla tua domanda ... :-)

+0

+1 per non resistere :) – Jonas

+0

+1 Avevo la sensazione che avrei visto questo quando ho posto la domanda :) – Doresoom