2017-05-01 9 views
6

私はGUIに取り組んでいます。ハンドル構造で作成された余分なフィールドにデータを格納したい。しかし、コールバック関数が終了したときにハンドルの構造を正しく更新する方法がわかりません。アドバイスをお願いします。信号のMatlab GUI:ハンドル構造を更新するには?

私の単純化されたプログラム

  • セット番号(1-10)。各信号には3つのパラメータがあります。
  • ハンドル構造で作成された配列から選択した信号のパラメータを読み込みます。 (デフォルトはゼロ)。
  • パラメータを編集して、配列を更新します。

GUI

function simple_gui(hObject, h) 

h.fig = figure(... 
    'Units','pix',... 
    'Position',[50 50 500 400],... 
    'Visible','default',... 
    'Name','GUI',... 
    'NumberTitle','off',... 
    'Resize','on'); 

table = {'1' , '2', '3' , '4', '5', '6', '7', '8', '9', '10' }; 

h.number = uicontrol(... 
    'Units','characters',... 
    'Max',10,... 
    'Min',1,... 
    'String',table,... 
    'Style','popupmenu',... 
    'Value',1,... 
    'Position',[37.4 28.3846153846154 19.4 1.61538461538462],... 
    'BackgroundColor',[1 1 1]); 

h.edit1 = uicontrol(... 
    'Units','pix',... 
    'String','0',... 
    'Style','edit',... 
    'Position',[180 280 50 20],... 
    'BackgroundColor',[1 1 1],... 
    'FontSize',10); 

h.edit2 = uicontrol(... 
    'Units','pix',... 
    'String','0',... 
    'Style','edit',... 
    'Position',[180 255 50 20],... 
    'Children',[],... 
    'FontSize',10); 

h.edit3 = uicontrol(... 
    'Units','pix',... 
    'String','0',... 
    'Style','edit',... 
    'Position',[180 230 50 20],... 
    'FontSize',10); 

メインコード:への更新を確実にする

コールguidata(handleObject, varToStore)documentation)GUIコールバック関数の末尾:要約

h.parameter1 = zeros(1,10); 
h.parameter2 = zeros(1,10); 
h.parameter3 = zeros(1,10); 
h.signal_no = 0; 

h.number.Callback = {@number_Callback, h}; 

h.edit1.Callback = {@parameter_change_Callback, h}; 
h.edit2.Callback = {@parameter_change_Callback, h}; 
h.edit3.Callback = {@parameter_change_Callback, h}; 
guidata(h.fig, h); 

function number_Callback(hObject,eventdata, h) 
h = guidata(hObject); 
h.signal_no = hObject.Value; 
k = h.signal_no; 
h.edit1.String = h.parameter1(k); 
h.edit2.String = h.parameter2(k); 
h.edit3.String = h.parameter3(k); 
guidata(hObject,h); 

function parameter_change_Callback(hObject,eventdata, h) 
h = guidata(hObject); 
k = h.signal_no; 
h.parameter1(k) = str2double(h.edit1.String); 
h.parameter2(k) = str2double(h.edit2.String); 
h.parameter3(k) = str2double(h.edit3.String); 
guidata(hObject, h); 
+0

あなたは '関数guidataを追加する必要が簡略化されたコールバック宣言でhObjectはです、h); 'あなたの関数の最後に。 'function simple_gui(hObject、h)' – Anthony

+0

@Anthony、あなたが言ったコマンドを追加しましたが、それは助けになりませんでした。 「存在しないフィールド 'parameter1'への参照」というエラーが表示されます。しかし、私はGUIDEを使って同様のプログラムを書いてもうまく動作します。しかし、私はプログラマティックなコードを書くことを好むし、それを働かせる方法を学びたい。 –

+0

申し訳ありませんが、私の提案はひどく間違っていました。私はあなたのコードを誤解しました。私はあなたのコードをまだチェックしていません。もしまだ答えがなければ、 – Anthony

答えて

1

変更された変数が格納される。ここではhandleObjectはFigureのハンドルまたはその子で、です。varToStoreは保存したい更新済みの変数です。それはしばしば構造体です。また

handles = guidata(gcbo); % gcbo will get the callback object (instance of handle class). 
handles.propToUpdate = handles.propToUpdate+1; 
guidata(gcbo,handles); % stores the updated struct 

図形や子供handleから保存されたデータを取得するための構文を

あなたはあなたのポップアップメニューから変更が持つGUIであなたのエディットボックスに反映されません。編集ハンドルのStringフィールドに数値を割り当てているため、現在のコードです。あなたは、このフィールドの値を取るときstr2double()を呼び出すと、ちょうど逆(num2str())バックで表示値を取得するための操作を行う必要があります。ここでは、更新されたコードは(

h.number.Callback = @number_Callback; 

function number_Callback(hObject,~) 
    h = guidata(hObject); 
    h.signal_no = hObject.Value; 
    k = h.signal_no; 
    h.edit1.String = num2str(h.parameter1(k)); 
    h.edit2.String = num2str(h.parameter2(k)); 
    h.edit3.String = num2str(h.parameter3(k)); 
    guidata(hObject,h); 
end 
関連する問題