2010-05-03 56 views
5

Tôi có GUI sử dụng lựa chọn từ trình đơn bật lên trong một cuộc gọi lại khác. Có cách nào để trả về giá trị đã chọn của popupmenu chỉ trong một dòng mà không tạo bất kỳ biến tạm thời nào không? Tôi đã thử một số giải pháp, nhưng tôi đã chỉ được quản lý hai dòng với một biến tạm thời:Trả lại lựa chọn popupmenu trong MATLAB bằng một dòng mã

Ba dòng:

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

Hai dòng:

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

bất cứ ai có thể cạo nó xuống một?

PS, Đây là một menu động, vì vậy tôi không thể chỉ sử dụng get(handles.popupmenu1,'Value') và bỏ qua thành phần chuỗi hoàn toàn.

+4

Tôi không chắc chắn tại sao bạn muốn sho rten nó vào một dòng, trừ khi bạn chỉ đơn giản là tò mò làm thế nào nó có thể được thực hiện. Các tùy chọn ba dòng là rõ ràng nhất và dễ hiểu nhất, và là một trong những tôi sẽ sử dụng trong bất kỳ mã tôi đã viết. – gnovice

+1

@gnovice Tôi chủ yếu tự hỏi nếu nó có thể được thực hiện. Có lẽ một sự pha trộn của sự tò mò và phiền toái tại MATLAB vì không có một tính năng để làm điều đó với một cuộc gọi nhận được. – Doresoom

Trả lời

11

Dưới đây là một lớp lót:

str = getCurrentPopupString(handles.popupmenu1); 

Và đây là định nghĩa của 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 

Tôi biết đó không phải là câu trả lời bạn đang tìm kiếm, nhưng nó trả lời các câu hỏi mà bạn hỏi:)

+3

@ Jason: Touché, đã cho tôi một giải pháp thiết thực cho câu hỏi OCD của tôi. – Doresoom

+0

+1: Chỉ là những gì tôi đang nghĩ. – gnovice

+0

Bạn phải loại bỏ NOT hợp lý khỏi strcmp như sau: if ~ ishandle (hh) || strcmp (get (hh, 'Type'), 'popupmenu') – BAR

5

Để làm cho nó một lớp lót, tôi sẽ chỉ cần tạo chức năng của riêng tôi (ví dụ: getMenuSelection) như Jonas minh họa trong câu trả lời của mình. Nếu bạn thực sự muốn có một sự thật một lót, đây là một cách sử dụng CELLFUN:

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

Rất xấu xí và khó đọc. Tôi chắc chắn sẽ đi với viết chức năng của riêng tôi.

EDIT: Và đây là một chút ngắn hơn (nhưng vẫn không kém phần xấu xí) one-liner sử dụng FEVAL:

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

+1 cho tôi câu trả lời mà tôi thực sự muốn, tuy nhiên không thực tế nó có thể là – Doresoom

+1

+1 để trả lời câu hỏi như dự định. 'cellfun' FTW! – Jonas

5

Tôi biết điều này là ngu ngốc, nhưng tôi không thể cưỡng lại:

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

Tôi biết đó không phải là ý của bạn, nhưng cũng giống như các câu trả lời khác ở trên, nó trả lời câu hỏi của bạn ... :-)

+0

+1 vì không chống lại :) – Jonas

+0

+1 Tôi có cảm giác tôi sẽ thấy điều này khi tôi hỏi câu hỏi :) – Doresoom