2010-05-03 7 views
5

Ich habe eine GUI, die eine Auswahl aus einem Popupmenü in einem anderen Rückruf verwendet. Gibt es eine Möglichkeit, den ausgewählten Wert des Popupmenüs in nur einer Zeile zurückzugeben, ohne temporäre Variablen zu erstellen? Ich habe mehrere Lösungen ausprobiert, aber ich habe es geschafft, nur zwei Anschlüsse mit einer temporären Variablen:Geben Sie die Popupmenüauswahl in MATLAB mit einer Codezeile zurück

Drei Linien:

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

Zwei Linien:

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

Kann es jemand rasieren unten zu ein?

PS, es ist ein dynamisches Menü, so kann ich nicht einfach get(handles.popupmenu1,'Value') verwenden und die String-Komponente insgesamt ignorieren.

+4

Ich bin mir nicht sicher, warum du sho willst rten Sie es auf eine Zeile, es sei denn, Sie sind einfach neugierig, wie es gemacht werden könnte. Die dreizeilige Option ist am klarsten und am einfachsten zu verstehen und ist diejenige, die ich in jedem von mir geschriebenen Code verwenden würde. – gnovice

+1

@gnovice Ich habe mich hauptsächlich gefragt, ob es gemacht werden kann. Vielleicht eine Mischung aus Neugier und Ärger bei MATLAB dafür, dass man kein Feature hat, um es mit einem Anruf zu tun. – Doresoom

Antwort

11

Hier ist ein Einzeiler:

str = getCurrentPopupString(handles.popupmenu1); 

Und hier ist die Definition von 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 

Ich weiß, das ist nicht die Antwort, die Sie gesucht haben, aber es stellt sich die Frage beantworten, die Sie gefragt:)

+3

@Jonas: Touché, um mir eine praktische Lösung für meine OCD-Frage zu geben. – Doresoom

+0

+1: Genau, was ich dachte. – gnovice

+0

Sie müssen das logische NOT von strcmp wie folgt entfernen: if ~ ishandle (hh) || strcmp (get (hh, 'Typ'), 'popupmenu') – BAR

5

Um es zu einem Einzeiler zu machen, würde ich einfach meine eigene Funktion erstellen (zB getMenuSelection) wie Jonas in seiner Antwort veranschaulicht. Wenn Sie wirklich einen echten Einzeiler wollen, hier ist man mit CELLFUN:

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

Sehr hässlich und schwer zu lesen. Ich würde definitiv mit dem Schreiben meiner eigenen Funktion gehen.

EDIT: Und hier ist ein wenig kürzer (aber immer noch genauso hässlich) Einzeiler mit FEVAL:

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

+1 für die Antwort, die ich eigentlich wollte, aber unpraktisch – Doresoom

+1

+1 für die Beantwortung der Frage wie vorgesehen. 'cellfun'' FTW! – Jonas

5

Ich weiß, das ist dumm, aber ich konnte nicht widerstehen:

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

Ich weiß, das ist nicht, was du meintest, aber wie die anderen Antworten oben beantwortet es deine Frage ... :-)

+0

+1 für nicht widerstehen :) – Jonas

+0

+1 Ich hatte das Gefühl, ich würde das sehen, wenn ich die Frage gestellt :) – Doresoom

Verwandte Themen