0

これは基本的な質問ですが、私は苦労しています。

基本的に、GUI のポップアップ メニューの選択肢にコールバック関数を割り当てています。コードは次のとおりです。

uicontrol(mainfigure, 'Style', 'popup',...
    'String', 'A|B|C',...
    'Position',[850 190 200 30],...
    'Callback', @blockset);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [block] = blockset(hObj,evnt) %#ok<INUSD>

blockval = get(hObj,'Value');

if blockval == 1
   block = 'A';
elseif blockval == 2
   block = 'B';
elseif blockval == 3
   block = 'C';
end

end

ご覧のとおり、ポップアップ メニューのさまざまな選択肢に文字列値を割り当てているだけです。これらの文字列を、スクリプトの後半で別の関数への入力値として使用したいと考えています (uicontrol コールバックにも埋め込まれています)。

uicontrol(mainscreen, 'Style', 'pushbutton',...
    'Position',[855 300 150 50],...
    'String', 'START',...
    'FontSize',10,'FontWeight','bold',...
    'BackgroundColor', [.9 .9 .9],...
    'CallBack', {@START_Callback, block});

コードはそのままでは機能しません。しかし、uicontrol コールバックの出力を定義する方法がわかりません。ブロックセット関数の出力として "block" を既に定義していますが、START_Callback にそれを入力として認識させるにはどうすればよいですか? 試行するたびに、「ブロック」が未定義の関数または変数であることがわかります。

関数からの出力を認識させるために、コードの「 'Callback', @blockset」行で何かする必要がありますか?

編集:大まかなインターネット検索では、おそらく setappdata/getappdata のようなもの、または別の回避策を使用する必要があることが示されています。ただし、それらに関するドキュメントを完全には理解していません。この状況でそれらをどのように使用しますか?

4

1 に答える 1

2

その場合、変数ブロックはワークスペースに存在する必要があります

uicontrol(mainscreen, 'Style', 'pushbutton',...
    'Position',[855 300 150 50],...
    'String', 'START',...
    'FontSize',10,'FontWeight','bold',...
    'BackgroundColor', [.9 .9 .9],...
    'CallBack', {@START_Callback, block});

しかし、それはポップアップメニューのコールバックからの戻り値であるため、それを行うことはできないため、matlab エラーが発生します。

setappdata と getappdata を使用するには、ポップアップ メニューのコールバック関数の 'block' 変数に、両方のコールバック関数に表示される Figure の appdata プロパティを格納する必要があります。遅延したい場合は、ルート Figure に格納する必要があります。例えば

function [block] = blockset(hObj,evnt) %#ok<INUSD>
    blockval = get(hObj,'Value');

    if blockval == 1
       block = 'A';
    elseif blockval == 2
       block = 'B';
    elseif blockval == 3
       block = 'C';
    end

    setappdata(0, 'block', block);
end

これにより、ブロック変数がルート Figure (つまり、0 で示されるメインの MATLAB ウィンドウ) に保存されますが、これは何かによって変更される可能性があるため、実際には良いことではありません。代わりに、GUI フィギュアなど、両方のコールバックに表示されるハンドル グラフィックス オブジェクトに格納してみてください。ただし、あなたの質問には、あなたが何を使用できるかを推測するのに十分な情報がないため、説明のためにルート図を使用しています。

GUI オブジェクトのタグ プロパティを設定すると、それに基づいてそれらのハンドルを検索できh = findobj('Tag','my_tag')ますsetappdata(h, 'var_name', var);。ルート フィギュアにはカプセル化がないため、ルート フィギュア ハンドルの代わりにこれを使用することをお勧めします。

そうは言っても、関数では、入力パラメーターとして受け取るSTART_Callback代わりに、コールバック関数で設定したルート Figure のブロック変数を取得するために使用します。したがって、プッシュボタンの宣言は次のようになりますblockblock = getappdata(0, 'block');blockset

uicontrol(mainscreen, 'Style', 'pushbutton',...
    'Position',[855 300 150 50],...
    'String', 'START',...
    'FontSize',10,'FontWeight','bold',...
    'BackgroundColor', [.9 .9 .9],...
    'CallBack', @START_Callback);

START_Callback 内:

function START_Callback(hObj,evnt)
    block = getappdata(0, 'block');
    %... other stuff
end
于 2013-02-28T20:22:26.537 に答える