いくつかの背景
GUIDEで作成されたFigureと、実行時に追加される手続き的に配置されたチェックボックスの組み合わせを使用してGUIを作成しました。チェックボックスは、実行時に行と列の数が決定されるマトリックス内にあります。各チェックボックスを追跡するために、マトリックス内の場所を示すcb_r1_c1
またはのようなタグ規則を使用します。cb_r7_c10
foo_cb_callback()
渡されたhObject情報を調べて、クリックしたばかりのチェックボックスのタグを判別する関数を作成しました。この情報(チェックボックスの行と列)を使用して、この関数は次に何をすべきかを認識します。これは、不明な数のチェックボックスのコールバックを処理するためのはるかにクリーンで安全な方法であることがわかりました。これまでのところ、この戦略はうまく機能しています。問題は1つだけです。
問題
関数を正しく呼び出すために、手続き的に追加されたチェックボックスのコールバックプロパティを変更するのに問題がありますfoo_cb_callback()
。
を使用して既存のコールバックで既存のチェックボックスを調べる場合get(objhandles.cb_r1_c1,'callback')
返される変数はクラス「function_handle」であり、テキストの文字列を画面に出力します
@(hObject,eventdata)testfuig('checkbox1_Callback',hObject,eventdata,guidata(hObject))
これをに変更したい
@(hObject,eventdata)testfuig('foo_cb_callback',hObject,eventdata,guidata(hObject))
私が最初に試したこと
私の最初の試みはこのようなものでした。
callbackstr = '@(hObject,eventdata)testfuig(''foo_cb_callback'',hObject,eventdata,guidata(hObject))';
set(objhandles.cb_r1_c1,'callback',callbackstr);
ただし、これは単なる文字列であり、function_handleクラスのオブジェクトではないため、機能しません。文字列またはセル配列を取得してfunction_handleクラスに変換する方法があるはずです。これは、任意のuielementのコールバックを簡単に制御できるため、最も理想的な状況です。
次に試したこと
'uicontrol()'関数を使用してチェックボックスを既に作成していたので、作成時にコールバックを追加しようとしました。
tagstr = 'cb_r1_c1';
uicontrol(objhandles.mainfig, 'Style','checkbox','Tag',tagstr,'callback', 'foo_cb_callback(''hObject''));
これによりチェックボックスが作成され、実際foo_cb_callback(hObject)
にコールバックプロパティに含まれていましたが、チェックボックスをクリックするとエラーが発生します??? Undefined function or variable 'hObject'.
だから私はあきらめて、それを回避しました
この問題を回避するための2つの非理想的な解決策を見つけました。1つ目は、タグを使用してGUIDEに非表示のチェックボックスを作成することでしたcb_hidden
。その後、次のコードを使用することができました。
callback = get(objhandles.cb_hidden, 'callback');
set(objhandles.cb_r1_c1,'callback',callback);
cb_r1_c1
これにより、のコールバックがと同じコールバックに正しく設定されcb_hidden
ます。このようにして、すべてのチェックボックスコールバックをこのダミーのチェックボックスにリダイレクトし、そこからを呼び出すことができましたfoo_cb_callback(hObject)
。
ただし、このソリューションは、GUIのどこかに非表示のチェックボックスが必要なため、理想的ではありません。
別の回避策
チェックボックスごとに実行時に一意のタグを作成していたため、タグをコールバック文字列に直接書き込むことにしました。
tagstr = 'cb_r1_c1';
uicontrol(objhandles.mainfig, 'Style','checkbox','Tag',tagstr,'callback', 'foo_cb_callback(''' tagstr '''));
これにより、文字列foo_cb_callback('cb_r1_c1')
を正しく呼び出しfoo_cb_callback()
て渡すコールバックが設定されます'cb_r1_c1'
。最初の数行は次のfoo_cb_callback()
ようになります
function foo_cb_callback(tag)
global gdata
hObject = gdata.objhandles.(tag);
そこから、理想的なソリューションを使用して実行できたであろうほとんどすべてのことを実行できます。 ただし、変数(変更されない文字列以外)を渡すことができないため、このソリューションはまだ理想的ではありません。また、これを行うための適切な方法を本当に知りたいのですが、いつかそれの用途が見つかると確信しています。