2010-05-03 15 views
5

Tengo una GUI que utiliza una selección de un popupmenu en otra devolución de llamada. ¿Hay alguna manera de devolver el valor seleccionado del menú emergente en una sola línea sin crear variables temporales? He intentado varias soluciones, pero sólo he conseguido dos líneas con una variable temporal:Retorno popupmenu selección en MATLAB utilizando una línea de código

tres líneas:

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

dos líneas:

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

Puede alguien afeitarse hasta ¿uno?

PD, es un menú dinámico, así que no puedo usar get(handles.popupmenu1,'Value') e ignorar el componente de cadena por completo.

+4

No estoy seguro de por qué querría sho Úselo en una línea, a menos que simplemente tenga curiosidad de cómo se podría hacer. La opción de tres líneas es la más clara y fácil de entender, y es la que usaría en cualquier código que escribiera. – gnovice

+1

@gnovice Me preguntaba si se puede hacer. Tal vez una mezcla de curiosidad y molestia en MATLAB por no tener una característica para hacerlo con una llamada de obtener. – Doresoom

Respuesta

11

Aquí hay una sola línea:

str = getCurrentPopupString(handles.popupmenu1); 

Y aquí es la definición de 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 

Sé que no es la respuesta que estabas buscando, pero lo hace responder a la pregunta que hizo:)

+3

@Jonas: Touché, por darme una solución práctica a mi pregunta TOC. – Doresoom

+0

+1: Justo lo que estaba pensando. – gnovice

+0

Tienes que eliminar el NOT lógico de strcmp como tal: if ~ ishandle (hh) || strcmp (get (hh, 'Type'), 'popupmenu') – BAR

5

Para que sea un trazador de líneas, simplemente crearía mi propia función (es decir, getMenuSelection) como Jonas ilustra en su respuesta. Si realmente desea una verdadera de una sola línea, aquí está uno usando CELLFUN:

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

muy feo y difícil de leer. Definitivamente voy a escribir mi propia función.

EDIT: Y aquí es un poco más corto (y aún así igual de feo) de una sola línea usando FEVAL:

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

+1 por darme la respuesta que realmente quería, por poco práctico que sea – Doresoom

+1

+1 por responder la pregunta como estaba previsto. 'cellfun' FTW! – Jonas

5

Sé que esto es estúpido, pero no pude resistir:

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

Sé que eso no es lo que quiso decir, pero al igual que las otras respuestas anteriores, responde a su pregunta ... :-)

+0

+1 para no resistir :) – Jonas

+0

+1 Tenía la sensación de que vería esto cuando le hice la pregunta :) – Doresoom

Cuestiones relacionadas