コンポーネント名?が​連番のものを、For​で回して処理したい

App Designerを使っていまして、コンポーネント名?が連番のボタンを複数設置しており、一括でEnable処理をしたいと思っています。
連番なのでforでまとめて処理できないかなと思い、以下のように書いてみましたがうまくいきませんでした。
Button_05 ~ Button_25
for i = 5:25
app.(Button_0 + i).Enable = 'on';
end
「+」がダメなのかなと思って「&」とかに変えてみたものの、うまくいきませんでした。
関数または変数 'Button_0' が認識されません。
app.Button_05.Enable = 'on';
app.Button_06.Enable = 'on';
app.Button_07.Enable = 'on';
app.Button_08.Enable = 'on';
・・・
のようにずらずら書きたくないです。
名前がバラバラだったら諦めて書くのですが、連番だったら効率化できるんじゃないかと思い質問させていただきました。
どのようになおしたら上記のことが実現可能になるか、for以外でも、上記のことを効率的に処理できる方法あれば、ご教示いただけますと幸いです。
どうぞよろしくお願いいたします。

 Réponse acceptée

Atsushi Ueno
Atsushi Ueno le 9 Mar 2023
Modifié(e) : Atsushi Ueno le 9 Mar 2023

0 votes

"Button_0"の様にString型にすれば、エラー無く期待通りに動きます。(古いリリースでは構造体のフィールドにString型が認められなかった為コメントの様にchar型を使う必要がありますが、新しいリリースではString型でも問題ありません)
for文のイテレータに"i"を使うと、iの中身(数値)がString型に変換される際に複素数(0+1i)と認識される可能性があります。他の変数名に変更する事をお勧めします。
for k = 5:25
app.("Button_0" + k).Enable = "on";
end

7 commentaires

Atsushi Ueno
Atsushi Ueno le 9 Mar 2023
Déplacé(e) : Atsushi Ueno le 9 Mar 2023
構造体のフィールドは括弧で括った文字列で動的に指定可能です。( getfield 関数と setfield 関数も参照)
Button_0 の型が string 型の場合は Button_0 + i で問題無いのですが、
Button_0 の型が char 型の場合は ['Button_0',num2str(k)] 等と文字列を連結する必要があります。
下記は、一つのチェックボックスの状態(ON/OFF)⇒複数のボタンのEnable状態に反映させる例です。
function CheckBoxValueChanged(app, event)
myValue = {'off','on'};
for k = 5:25
field_name = ['Button_',num2str(k,'%02d')]; % 'Button_05'等になる
app.(field_name).Enable = 'on'; % ↓ チェックボックスの状態で設定
app.(field_name).Enable = myValue{app.CheckBox.Value+1};
end
end
mayu
mayu le 9 Mar 2023
Modifié(e) : mayu le 9 Mar 2023
ありがとうございます、
最初に教えていただいた内容が私には難しかったので調べていたのですが、次にいただいた内容のようにして変更してみたらできました!
使いたい場面がいっぱいでてきそうなのでとてもうれしいです( ◠‿◠ )
お忙しい中ご教示いただきまして、ありがとうございました☺
mayu
mayu le 9 Mar 2023
Modifié(e) : mayu le 9 Mar 2023
もう1点すみません。
おなじforつながりでもし可能でしたらお願いいたします。。💦
ラズパイからi2cボードにコマンドを送っているのですが、同じようにfor使えないかなと思っている箇所がありまして、
以下のコード
function PWMiniFnc(i2cboard)
writeRegister(i2cboard,hex2dec('00'),hex2dec('b1'),'uint8');
writeRegister(i2cboard,hex2dec('fe'),hex2dec('0b'),'uint8');
writeRegister(i2cboard,hex2dec('00'),hex2dec('21'),'uint8');
end
PWMiniFnc(app.i2c_pwm1);
PWMiniFnc(app.i2c_pwm2);
PWMiniFnc(app.i2c_pwm3);
・・・
これの、PWMiniFnc(app.i2c_pwm1); の引数も連番なのですが、forでできないかなと思っています。
app.i2c_pwm1…は変数で、ここより前のところでi2cdevでボード情報を取得していまして、
のような感じでアドレス情報などが入っているのですが、
for num = 1:3
PWMiniFnc("app.i2c_pwm" + num);
end
としてみたら、関数内で
というエラーが出てうまく実行できませんでした。
これだとボード情報としてでなく、ただの文字としての認識になってるのかなと思いました。
この場合、無理かもしれないと思ったのですが、一応お尋ねさせていただきました。
もし可能な方法がありましたら、ご教示いただけますと幸いです。
(質問内容がよくわからなかったらすみません)
お忙しい中、何度も恐れ入りますが、どうぞよろしくお願いいたします。
Atsushi Ueno
Atsushi Ueno le 9 Mar 2023
for num = 1:3
PWMiniFnc("app.i2c_pwm" + num);
end
ではなく
for num = 1:3
PWMiniFnc(app.("i2c_pwm" + num));
end
ですよ
mayu
mayu le 10 Mar 2023
Modifié(e) : mayu le 10 Mar 2023
おはようございます、
ご指摘どおり、なおしてみたら出来ました💦
よく見たら上の"Button_0"の記述と同じことですね。。失礼しました。
度々ありがとうございました(__)
appの使い方については、よくわからなくてずっともやもやしていて・・・
  • app app オブジェクト。このオブジェクトは、アプリ内の UI コンポーネント、およびプロパティとして格納されている他の変数にアクセスするために使用します。
→ これの意味解読
マトラボについてはプロパティ定義したりコールバック関数を作成してアプリ内でグローバルな感じで使いたかったら、第一引数にappを入れること必須。
プログラムを勉強し始めて間もないのですが、私の知る限り関数を使う際の引数は使うものしか入れないと思うので違和感があります。。とりあえずマトラボでAppDesignerを使う際のルールと解釈し、まじないのように設定していました(´Д`)
お忙しい中何度もご教示いただき、ありがとうございました。
Atsushi Ueno
Atsushi Ueno le 10 Mar 2023
>appの使い方について
上記のオンラインコースでオブジェクト指向プログラミングを学べば、AppDesignerで作成したものが全てappクラス内に作られている事が分かります。
>私の知る限り関数を使う際の引数は使うものしか入れないと思うので違和感があります。。
⇒MATLABはオブジェクト自身も省略せず絶対的に示す文法を採用したのですが、私もちょっと違和感があります。
mayu
mayu le 10 Mar 2023
ありがとうございます!
オブジェクト指向についても何回も調べていろんな説明読んでもよくわからないのですが、その点意識しながらオンラインコースを周回してみようと思います('_';)
お忙しい中、度々丁寧にご教示いただき、ありがとうございましたm(__)m

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur 文字と文字列 dans Centre d'aide et File Exchange

Produits

Version

R2021b

Community Treasure Hunt

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

Start Hunting!