グラフィックオブジェ​クトのコールバック関​数内における、qui​verオブジェクト取​り扱い

次のようなコールバック関数を作成しましたが、left clickのVoに対して、center clickのVoが別のオブジェクトになってしまいます。ifを用いずCaseを用いた場合も同様でした。どこが間違っているのかご教示をいただければ幸いです。(なお、function getaxPos(src,~,x,y)を削除すると、同じオブジェクトとして認識されます。)
function getaxPos(src,~,x,y)
last_seltype = src.SelectionType; % key click
id = x;
iq = y;
if strcmp(last_seltype,'normal') % left click
Vo(1) = quiver(0,0,id,iq,AutoScale="off",Color="#FFCC00",LineWidth=2)
Vo(2) = quiver(0,0,2*id,iq,AutoScale="off",Color="#FFCC00",LineWidth=2)
Vo(3) = quiver(0,0,id,2*iq,AutoScale="off",Color="#FFCC00",LineWidth=2)
Vo(4) = quiver(0,0,2*id,2*iq,AutoScale="off",Color="#FFCC00",LineWidth=2)
elseif strcmp(last_seletype,'extend') % center click
delete(Vo)
end
end

1 件のコメント

高木 範明
高木 範明 2023 年 10 月 2 日
すみません。一部転記ミスがありました。修正いたします。
転記ミスのみで、症状に変化はありません。
 elseif strcmp(last_seletype,'extend') % center click
         ↓
 elseif strcmp(last_seltype,'extend') % center click

サインインしてコメントする。

回答 (1 件)

Kojiro Saito
Kojiro Saito 2023 年 10 月 2 日
編集済み: Kojiro Saito 2023 年 10 月 2 日

1 投票

上記のコードだとVoが関数の中のワークスペース(ローカル変数)で定義され、getaxPos実行後にクリアされてしまいます。
「関数ワークスペースに固有の変数は "ローカル" 変数と呼ばれます。一般に、ローカル変数はその関数呼び出しが終了するとメモリから削除されます。」
App Designerのコードビューから[プライベート プロパティ] または [パブリック プロパティ] を追加します。
properties (Access = private)
Vo
end
そしてgetaxPos関数の中で下記のように、Vo(1)~Vo(4)をapp.Vo(1)~app.Vo(4)にしてみてください。
app.Vo(1) = quiver(0,0,id,iq,AutoScale="off",Color="#FFCC00",LineWidth=2)
そして削除するところもapp.Voにしてみたらいかがでしょうか。
delete(app.Vo)

1 件のコメント

高木 範明
高木 範明 2023 年 10 月 2 日
移動済み: Atsushi Ueno 2023 年 10 月 16 日
早々のご教示をありがとうございました。MATLABでのローカル変数とグローバル変数の取扱いが理解できておらず、申し訳ありませんでした。.mlsファイルでMATLABソフトを作成していたため、Functionルーチンに
  persistent Vo
を追加したら、うまくいきました。
一方、同じソフトをApp Designerでも作成しているため、そちらは今回ご教示頂いた方法で対応いたします。
本当に、助かりました。

サインインしてコメントする。

カテゴリ

ヘルプ センター および File Exchangeアプリの作成 についてさらに検索

製品

リリース

R2023a

質問済み:

2023 年 10 月 2 日

移動済み:

2023 年 10 月 16 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!