0

SCADA という名前の GUI を作成し、StatusData というブール変数を追加しました。これは、GUI の起動時に false に設定されるフラグです。

handles.StatusData=false;
guidata(handles.output,handles);

ボタンを押すと、連続して実行される関数が呼び出されます (関数には無限ループがあります)。しばらくして、StatusData を true に設定する別のボタンを押します。

handles.StatusData=true;
guidata(handles.output,handles);

StatusDataここで、コールバック関数 (上記と同じ関数) からアクセスする必要があります。これを実現するために、その関数を呼び出したときにハンドルをパラメーターとして送信しました。ここで、StatusData を変更するボタンを押すと、実際のハンドルのデータが変更されますが、関数が既に呼び出されているため、更新された StatusData にアクセスできません。

パラメータとして送信せずに、GUI の更新されたハンドルにアクセスするにはどうすればよいですか。

ありがとう

4

1 に答える 1

0

代わりにパラメーターを関数に渡すだけで、hObject必要なときに値を取得できますguidata。つまり、

function some_callback(hObject, handles, ...)
    myLoopingFunction(hObject, ...);

function myLoopingFunction(hObject, ...)
    for someVar = something
        % Update handles structure
        handles = guidata(hObject);
    end

または、ハンドル オブジェクトを作成し、それを handles 構造体に配置することもできます。例えば、

% In a separate file:
classdef uiState < handle
    % Probably should give this class a less general name...
    properties
        StatusData
    end
end

% In your UI file:
function some_callback(hObject, handles, ...)
    handles.state = uiState();
    handles.state.StatusData = false;
    % Now, when you modify handles.StatusData, the version used by
    % myLoopingFunction will also be updated, because they point to
    % the same object!
    myLoopingFunction(handles.state);

function myLoopingFunction(state, ...)
    for someVar = something
        % Now you just have to check state.StatusData
    end

単純なケースでは、最初の方法を使用します。いくつかのパラメーターを追跡する必要があり、それらが複雑な方法で相互作用する、より複雑な状況では、2 番目のパラメーターを使用します。2 番目の方法は、変数に大量のデータがあり、UI へのすべての呼び出しにコピーされるのを防ぎたい場合にも役立ちます。

個人的には、複雑な UI の場合、通常はユーザー インターフェイスを追跡するアプリケーション クラスを作成し (コマンド ライン インターフェイスを提供する)、UI で常に使用できるようにしますが、これは、このシンプルなケースでジャムの瓶を開ける大ハンマー。

于 2013-04-14T09:34:24.290 に答える