0

コードにサブルーチンがあり、ユーザーが分析の種類を選択するための GUI を作成します。

    %% Gives user the choice of replacement method

figure('Units','Normalized','Color','w','Position',[.3 .6 .4 .15],...
    'NumberTitle','off','Name','Analysis choice','MenuBar','none');
uicontrol('Style','text','Units','Normalized',...
    'Position',[.1 .7 .8 .2],'BackgroundColor','w','String','What replacement method do you want to use?');
uicontrol('Style','pushbutton','Units','Normalized',...
    'Position',[.05 .3 .3 .3],'String','Cubic interpolation 24 points',...
    'CallBack','cubic_choice'); % cubic_choice.m rotine must be on current folder
uicontrol('Style','pushbutton','Units','Normalized',...
    'Position',[.4 .3 .3 .3],'String','Last good data value',...
    'CallBack','lgv_choice'); % lgv_choice.m rotine must be on current folder
uicontrol('Style','pushbutton','Units','Normalized',...
    'Position',[.75 .3 .2 .3],'String','Linear interpolation',...
    'CallBack','li_choice'); % li_choice.m rotine must be on current folder
uiwait;
close;

さらにコードには、ユーザーが行った選択を分析する if ループがあります。

if strcmp(inp,'cubic') ...

問題は、[3 次補間 24 ポイント] ボタンを押したときに、コールバック関数が変数を与えないことですinp。つまり、変数がワークスペースに表示されません。コールバック関数は次のようなものです。

%% Callback script for replacement method

% Cubic interpolation with 24 points method

function [inp] = cubic_choice

inp = 'cubic';
uiresume(gcbf); % resumes the button call

私はおそらく setappdata と getappdata を使用する必要があることを知っています。これは、他のスレッドで既に読んでいるが、動作させることができないためです。

誰でも私を助けることができますか?

前もって感謝します。

よろしく、 ペドロ・サンチェス

4

2 に答える 2

1

グローバル変数を使用するのではなく、関数getappdatasetappdataおよび/またはをチェックする必要がありますguidata

基本的に、コールバックから、残りのコードでアクセスできる場所に選択を設定する必要があります。1つの可能性は、例えばset/getappdata次のように使用することです:

function cubic_choice()
   figHandle = ancestor(gcbf, 'figure');
   setappdata(figHandle, 'choice', 'cubic');
   uiresume(gcbf);
end

呼び出しの直後に、例の最初の行にあるフィギュア呼び出しの戻り値からuiwait取得して、このプロパティを取得できます。figHandle

inp = getappdata(figHandle, 'choice');
于 2013-11-05T19:10:39.460 に答える
0

これは可変範囲と設計の問題です。inpコールバック関数の外では見えません。また、あなたを呼び戻しているのはGUIであるため、「ワークスペースに戻す」こともありません。ワークスペースでは割り当ては行われません。

次のように、ワークスペースとコールバック関数のglobal inp両方で宣言できます。

function [inp] = cubic_choice
global inp
inp = 'cubic';

ただし、コールバック ハンドラ内から直接選択に応答することを検討することもできます。これは、if-statement に含まれるコードが何であれ、コールバック関数に直接入れることができることを意味します。

あるいは、本当に選択肢が必要な場合は、ラジオ ボタンを使用してみませんか? h次に、によって返されたハンドルを保持しuicontrol、後でいつでもその状態を照会できますget(h, 'value')

于 2013-11-05T18:50:16.787 に答える