2015-03-03 9 views
0

Я создал пользовательский интерфейс со многими edit text коробки, созданные в цикле, теперь я хочу сохранить пользовательские входы в переменной с callback.Управление несколькими обратными вызовами

Для примера рассмотрим этот код,

function p = myfun() 
f = figure; 
set(f,'Position',[200 350 250 150],'Color',[.4 .6 .4],'MenuBar','none',... 
    'Visible','off'); 
bc = [.4 .6 .4]; 
uicontrol('Style','text','Position',[50 80 80 30],... 
     'String','X','BackgroundColor',bc,'ForegroundColor','w'); 
uicontrol('Style','text','Position',[50 40 80 30],... 
     'String','Y','BackgroundColor',bc,'ForegroundColor','w'); 
uicontrol('style','edit','Position', [120 80 80 30],... 
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback}); 
uicontrol('style','edit','Position', [120 40 80 30],... 
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback}); 
uicontrol('Style', 'pushbutton', 'String', 'Ok',... 
    'Position', [100 5 60 30],'Callback', 'close'); 
movegui(f,'center') 
set(f,'Visible','on') 

function My_Callback(hObject,eventdata) 
    p = str2double(get(hObject,'string')); 
end 
end 

enter image description here

Теперь My_Callback будет называться два раза, но последний из них будет храниться только в p.

Но я хочу, чтобы они хранились как p.x и p.y.

Я думаю, что я должен использовать Tag, он говорит:

Tag

string (GUIDE sets this property)

User-specified object label. The Tag property provides a means to identify graphics objects with a user-specified label. This is particularly useful when constructing interactive graphics programs that would otherwise need to define object handles as global variables or pass them as arguments between callback routines. You can define Tag as any string.

Но я не знаю, как (у меня есть около 16 редактируемых коробки),

Спасибо за любую помощь.

+0

Когда вы хотите читать значения из editbox, сразу после их ввода или после нажатия кнопки «Ok»? –

+0

@MikhailGenkin, после нажатия 'ok', потому что пользователь может их изменить. Спасибо – Rashid

ответ

2

Если я понял ваш вопрос правильно, вы можете использовать UserData свойства uicontrols хранить содержание поля редактирования, как вы вводите его, таким образом, было бы очень легко восстановить их в любом месте в пределах графического интерфейса пользователя или в другом месте.

Кроме того, чтобы облегчить вещи, вы можете назначать имена uicontrols во время их создания, поэтому, когда вам нужно получить одно или много их свойств, вы можете вызвать дескрипторы с его именем вместо аргумента hObject.

Например, предположим, что вы называете окно с данными X x1, то вы можете создать и сохранить его в структуре ручки графического интерфейса следующим образом:

handles.x1 = uicontrol(...) 

так, когда вам нужно получить свойство можно использовать

get(handles.x1,'Some Property'); 

Так, чтобы вернуться к вашему вопросу, вы могли бы использовать этот синтаксис, чтобы установить UserData свойство всех коробок внутри My_Callback. После этого вы можете восстановить их в любом обратном вызове, который вы хотите. Конечно, простой способ - получить свойство String для полей редактирования вместо их UserData, но с последним вы можете хранить все, что захотите, что может пригодиться.

В следующем графическом интерфейсе я изменил ваш код для изменения обратного вызова для кнопки «ОК» для функции с именем , которая получает UserData из каждого окна редактирования и отображает его. Выход

function p = myfun() 
clear 
clc 

f = figure; 
set(f,'Position',[200 350 250 150],'Color',[.4 .6 .4],'MenuBar','none',... 
    'Visible','off'); 
bc = [.4 .6 .4]; 
%//=============== 
uicontrol('Style','text','Position',[50 80 80 30],... 
    'String','X','BackgroundColor',bc,'ForegroundColor','w'); 

uicontrol('Style','text','Position',[50 40 80 30],... 
    'String','Y','BackgroundColor',bc,'ForegroundColor','w'); 
%//=============== 

handles.x1 = uicontrol('style','edit's,'Position', [120 80 80 30],... 
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback}); 

handles.y1 = uicontrol('style','edit','Position', [120 40 80 30],... 
    'BackgroundColor',bc,'ForegroundColor','w','Callback',{@My_Callback}); 
%//=============== 
uicontrol('Style', 'pushbutton', 'String', 'Ok',... 
    'Position', [100 5 60 30],'Callback', @(s,e) DisplayData); 

movegui(f,'center') 
set(f,'Visible','on') 

guidata(f,handles); %// Updata guidata 

    function My_Callback(hObject,eventdata) 

     p = str2double(get(hObject,'string')); 

     %// Assign the content of the box to its "UserData" property 
     set(hObject,'UserData',p) 
     guidata(f,handles) 
    end 

    function DisplayData(~,~) 


     %// You could do it for all the boxes in your GUI. 
     x1Data = get(handles.x1,'UserData'); 
     y1Data = get(handles.y1,'UserData'); 

     fprintf('The number in box 1 is %0.2f and the number in box 2 is %0.2f\n',x1Data,y1Data); 

     guidata(f,handles) 
    end 
end 

Пример:

enter image description here

И после нажатия кнопки "OK", эта строка отображается в окне команд:

The number in box 1 is 2.00 and the number in box 2 is 4.00 

Надежда, что помогает!

+0

Да, это очень помогает! Благодарю. – Rashid

+0

Удивительный, тогда рад помочь! –

+0

Каковы входные данные для 'DisplayData'? – Rashid

2

Как вы упомянули в комментариях, вы хотите прочитать свои значения из editbox после нажатия кнопки «Ok». Для того, чтобы сделать это, вы должны присвоить функцию обратного вызова на кнопку «ОК», а не редактировать коробки:

uicontrol('Style', 'pushbutton', 'String', 'Ok',... 
'Position', [100 5 60 30],'Callback', {@My_Callback}); 

В функции обратного вызова следует читать значения из всех полей редактирования.

Я предлагаю вам использовать ручки, когда вы определили ваши окна редактирования (и лучше использовать его для всех объектов):

e1=uicontrol('style','edit','Position', [120 80 80 30],... 
'BackgroundColor',bc,'ForegroundColor','w'); 
e2=uicontrol('style','edit','Position', [120 40 80 30],... 
'BackgroundColor',bc,'ForegroundColor','w'); 

Теперь для того, чтобы прочитать значения, вы просто использовать ручки соответствующего .

function My_Callback(hObject,eventdata) 
    p1 = str2double(get(e1,'string')); 
    p2 = str2double(get(e2,'string')); 
end 

Примечание: это ручки (e1, e2) будет иметь голубой цвет в вашем коде, это значит, что они являются «глобальные» переменные, т.е. используются в основном коде и функции обратного вызова.

Если вы не хотите использовать глобальные дескрипторы, вы можете передать их в функцию обратного вызова. Таким образом, ваша функция обратного вызова будет иметь больше аргументов.

uicontrol('Style', 'pushbutton', 'String', 'Ok',... 
'Position', [100 5 60 30],'Callback', {@My_Callback(e1,e2)}); 

function My_Callback(hObject,eventdata,e1,e2) 
    p1 = str2double(get(e1,'string')); 
    p2 = str2double(get(e2,'string')); 
end 
+0

Я только что отредактировал свой ответ: вы не должны использовать функции обратного вызова для полей редактирования. –

+0

Спасибо, хорошая точка в определении обратного вызова для кнопки. У меня есть поля, определенные в цикле, и я вижу, могу ли я это обработать. – Rashid

Смежные вопросы