サンプルプログラム/ボタンごとに違う文字列を表示する

Last-modified: 2017-01-12 (木) 00:14:09

今回は、サンプルプログラム/hello, worldを元に、データをスクリプトの外から持ってくる方法の一つを使い、テキストパネルに1つのプログラマブルブロックで複数パターンの結果を出してみましょう。


準備

電源のほかに必要なブロック

種類と数備考
前回と同じもの
Text panel×1名前を「Text panel Test」にしておく
Show text on screenをオンにしておく。
Programmable Block×1スクリプトの内容は下記
追加でいるもの
Button Panel×1設定は後で解説

元のスクリプト

このサンプルプログラム/hello, worldの完成形を元に変更していきます。

public void Main(string argument) {
    IMyTextPanel target;
    target = GridTerminalSystem.GetBlockWithName("Text panel Test") as IMyTextPanel;
    target.WritePublicText("hello, world", false);
}

第1段階:下準備

まずは同じ動作のまま、少し処理を変更する下準備です。5行目を1行下げて、5~6行目を次のように変更します。

新5行目:変数を用意する

変数の型 = 変数の中身;

string text = "hello, world";

テキストパネルを用意したときの「IMyTextPanel target」と同じように、今度はstringという型でtextという変数を作っています。また、そのままhello, worldという文字列を中に入れる処理まで同じ行で済ませました。

string型というのは、文字列を入れることができる型です。

新6行目:書き込み内容に変数の中身を使う

target.WritePublicText("hello, world", false);

target.WritePublicText(text, false);

こうすると「hello, worldと書き込む」から、「変数textの中身を書き込む」という処理に変わります。

ここでの引用符の有無についてですが、ざっくり箇条書きにすると以下のようになります。

  • WritePublicText括弧内のカンマより前は「string(文字列)型のデータ」が入る場所で、直接書く以外の方法も使える。
  • 今回はstring型の変数を指定することで、中身を読み取らせている。変数の名前なので引用符はいらない。
  • 元のスクリプトは「string型のデータ」を直接書くために二重引用符""で囲っていた。

第1段階まとめ

第1段階が済んだ状態は、以下の通りです。

public void Main(string argument) {
    IMyTextPanel target;
    target = GridTerminalSystem.GetBlockWithName("Text panel Test") as IMyTextPanel;
    string text = "hello, world";
    target.WritePublicText(text, false);
}

実行しても動作は全く変わりませんが、string型のデータの存在と、WritePublicText()に直接文字列を書かない書き方を知ることができました。では、実際に機能を変える次の段階に進みましょう。

第2段階:機能を変更

表示する文字列を、プログラムの外から持ってくるように改造します。

まずは1行目に注目してください。

public void Main(string argument) {

これはデフォルトで用意されているMainメソッドの始まりですが、括弧()の中に「string型の変数を作る」のと同じ文がありますね。

括弧()の中では、上記と同様にargumentというstring(文字列)型の変数を作り、そのうえで、引数と呼ばれる「実行の際に渡されたデータ」を受け取って変数に入れています。

ここに何処から何の文字列が送られてきているのかというと、プログラマブルブロックのメニューにある「Argument」というテキストボックスに書かれている内容が、スクリプトが実行されたときに送られてきています。

これを踏まえて、5~6行目を変更していきます。

新5行目:argumentを書き込む

string text = "hello, world";
target.WritePublicText(text, false);

target.WritePublicText(argument, false);

6行目のWritePublicTextで使う変数を、textではなくargumentに変更します。

これによって、変数textを使うところが無くなったので、それを作る5行目は削除してしまいます。

変数を変更したことで、「変数textを作って中身をhello, worldにする」+「変数textの中身を書き込む」という処理から、「変数argumentの中身を書き込む」という処理に変わりました。

完成状態は以下のようになります。

public void Main(string argument) {
    IMyTextPanel target;
    target = GridTerminalSystem.GetBlockWithName("Text panel Test") as IMyTextPanel;
    target.WritePublicText(argument, false);
}

データの入力元を変えて実行する

プログラマブルブロックのメニューからデータを入力する

プログラマブルブロックのターミナルメニューで、まずはそのままRunをクリックして実行してください。パネルには何も表示されないか、すでに何か書いてあれば消去されます。

これは、Argumentテキストボックスが空白なので、スクリプトは何もない文字列を受け取って書き込んだからです。

今度は「Argument」に「hello!」と書いて、Runをクリックして実行してみましょう。今度はhello!と表示されます。

適当な文字列を入力してまた実行すれば、それが反映されます。

これだけで見ると、内容を変える時にスクリプトを変更せずにすむだけですが、実はもうちょっと便利になっています。その点は次に解説します。

ツールバーアクションからデータを入力する

ボタンパネルのボタンを照準して、Kキーで設定画面を開いてください。


ボタン1にプログラマブルブロックをドラッグ&ドロップし、アクションは「Run with default argument」を設定してください。

ボタン2にもプログラマブルブロックをドラッグ&ドロップし、今度は「Run」を選んでください。すると、テキストボックスのあるArgumentというダイアログが出てきます。ここに、hello!以外の文字列、何でもいいですが思いつかなければ「ABC」とでも入れてください。

ボタン3にもプログラマブルブロックをドラッグ&ドロップし、同じく「Run」を選んでください。今度はボタン2と違う文章を、思いつかなければ「XYZ」とでも入れてください。


それでは、1~3のボタンを押してください。そうすると、テキストパネルの文字列が変化します。

ツールバー設定の「Run with default argument」は、メニューでのRunボタンと同じように、ブロックのArgument欄の内容をスクリプトに渡して実行するアクションです。

ツールバーでの「Run」は、Runボタンと違い、設定するときに書き込んだ内容が保存され、それをArgument欄の代わりにスクリプトに渡して実行するアクションです。また、このアクションだけは、Argumentを別にすることで同じツールバーに複数設定できるという特徴があります。


ボタンパネルだけでなく、センサータイマー、操縦席など、ツールバー設定系の画面で設定するブロックで同様の設定が可能です。

補足

文字列に何か処理して書き込む

5行目を、下記のように変更してみてください。

target.WritePublicText(argument, false);

target.WritePublicText("input:"+argument+"\n", true);

こうすると、実行するたびに、「input:設定した文字列」という文が改行して追加されていきます。


まず、消さずに追加されるのは前回少し触れたとおり、WritePublicTextのオプションで、追記するかどうかを「true」(真)にしたからです。


文字列の変化についてですが、まず、string(文字列)型のデータは「+」で足すことで繋がります。

そして、「引用符で囲んで直接書かれたinput:という文字列」+「argumentに入っている文字列」+「引用符で囲んで直接書かれた改行文字」を「計算した結果」がWritePublicTextに渡されているため、上記のような出力結果になっています。

まとめ

今回の内容では、Argument欄を使用して使う文字列を変更し、同じブロックのまま動作を変える方法、ちょっとした文字列の処理を解説しました。

例えば、複数のセンサーのそれぞれにArgumentを変えたRunを設定することで、どのセンサーに引っ掛かったのかをパネルに表示するような動作を作るときに、プログラマブルブロックを1つだけ、スクリプトを書き換えずに設定するようなことが可能になります。

また、文字列を繋げることを使って、argumentに全文を書かずに変化する部分だけ書くことができます。

コメント