LabVIEWと同様なプログラミングによってWeb Applicationを作成することができるG Web Development Software (以下GWDS)を触ったことがない方に向けて、基本的な事柄を解説していこうという試みです。なお、大部分の事柄は、GWDSの前身であるLabVIEW NXG Web Moduleと共通します。
シリーズ9回目としてプログラムの幅を増やすためのプロパティノードとタイプ定義です。
この記事は、以下のような方に向けて書いています。
- プログラムを作るのに必要な他の要素って?
- 動的にプロパティを変える方法はあるの?
- タイプ定義の例が知りたい
もし上記のことに興味があるよ、という方には参考にして頂けるかもしれません。
なお、前回の記事はこちらです。
ステートマシンを目指して
前回の記事では、効率のいいプログラムを構築するための手段としてイベントストラクチャを紹介しました。
指定した特定のイベントが発生したときに実行されるため、ループの余計な空回りが起きず効率のよいプログラムが作れます。
ところが、イベントストラクチャを使うとうまく動かなくなるプログラムもあることを紹介しました。例えば、場合に応じて連続的にループが回る必要があるプログラムです。しかし、イベントストラクチャはイベントが起こらないと次のループには進めません。
実はそういった場合でも意図したとおりに動かせるようになるうまい組み方があります。
こういったうまい組み方は「デザインテンプレート」として知られ、プログラムのテンプレートになります。あるお決まりの型があり、そこに当てはめればプログラムが作れてしまう、といった代物です。
「そんな型通りにやってうまくプログラム作れるの?」と思われるかもしれないですが、結構色々なことができるようになります。もちろん、テンプレートの種類もいくつかあり、実はGWDSにはそのうちの一つである「キューメッセージハンドラ(QMH)」がプロジェクトテンプレートとして存在しています。
ただ、このQMHは初心者には少しハードルが高く、いきなりこれを習得するのは時間がかかると思います。すると、やっているうちに興味が薄れプログラムを作ること自体が面倒になりやがてやる気が失われてしまう・・・という悪影響となってしまいかねないので、まずは初心者でも扱いやすい「ステートマシン」というテンプレートを使えるようになるのがいいと思います。
そんなステートマシンの内容は次回紹介するのですが、その組み方の説明に入る前に、ステートマシンでも使うことのある二つの事柄について今回は紹介していきます。
プロパティノード
まずはプロパティノードです。
プロパティノードは、オブジェクトの持つプロパティに対しプログラム的にアクセスする方法です。
もう少し簡単に言うと、制御器や表示器の見た目や性質をプログラム的に変更するために使用するノードです。
もしLabVIEWを触ったことがある方であればこんな方法を知っていると思います。(別に知らなくても構いません)
これと同じく、GWDSの環境ではプロパティを変更したい対象のリファレンス定数を用意し、これをプロパティノードにつなげて処理をさせます。
LabVIEWと比べると、イベントストラクチャの時もそうでしたが、かなりやれることは限られてきます。
リファレンス、とは、「このオブジェクトに対するプロパティの変更を行いますよ」という時の「このオブジェクト」を指し示す指定用の情報です。こうしたリファレンスは、それぞれのオブジェクト(ざっくり、制御器や表示器のこと)に存在し、作成することができます。
プロパティノードに特定のリファレンスを入力することで、プロパティノードはそのリファレンスに応じた適切なプロパティの選択肢を出してくれるので、あとはどのプロパティを変更するかあるいは確認したいかを指定するだけです。
使用するときには、読み取り状態か書き込み状態とします。ダイアグラムに置いた状態では読み取り状態になっていて、選択したプロパティの現在の値を取得することができます。右クリックして表示器(Indicator)を作成すると、そのプロパティのデータタイプにあった表示器が自動的に生成されます。
もしそのプロパティを変更したいのであれば、書き込み状態にしてやります。
一つのプロパティノードで複数のプロパティの読み書きが行えます。プロパティノードを上下に引き伸ばせば別の項目が表れ、また好きなものを選択すればいいのですが、一部は読み取りしかできない(プログラム中に動的に変更できない)ものもあるので注意します。
実例をいくつか紹介します。
例えば、ブールデータの制御器であるボタンがパネル上に置かれていたとして、ユーザーがこれを押すとある一定期間このボタンを再度押すことができなくなるような仕組みを作ることができます。
また、文字列制御器に対して、「プログラム実行時に最初に文字を入力させたい」という場合には、キーフォーカスプロパティを使用することができます。
通常文字列制御器には、ユーザーがその制御器をクリックしてフォーカス状態にしないと文字を入力できません。しかしプログラム的にKeyFocusをTRUEにすることで、入力可能状態にすることができます。
数値に対しては、ユーザーが入力する値の最大値、最小値、そして間隔を動的に決めることができます。これは、プログラム実行前に制御器に対して設定をすることもできますが、プログラムの実行中に入力値に対する制限を変えるときに便利です。
他のデータタイプに対しても様々な(LabVIEWよりは圧倒的に少ないですが)プロパティが設定できるので色々試してみてください。
タイプ定義
続いてタイプ定義です。
これは、プログラムの方法というより知っていると便利な機能のような感覚で覚えておけばいいと思います。ただ実際、ステートマシンという組み方をする場合には重要な知識になります。
GWDSの環境では、(LabVIEWとは異なり)どうやら制御器や表示器として適用はできないようなので、タイプ定義をしたくなる場面は限定的になり、主に(ステートマシンを組む場合の)列挙体がタイプ定義の中心になると思います。
列挙体については以前紹介したように、ユーザーが選べるように項目を列挙するように表示できる制御器/表示器になっています。
ケースストラクチャの部分で紹介したように、列挙体を使用することでケースを簡単に分けることができます。
ステートマシンというテンプレートを使用する場合には、このケースストラクチャで「ステート」を分けるようにプログラムを組みます。このステートとは結局各ケースストラクチャ(の中身)のことなのですが、プログラムを組むうえでステートを増やす必要があることがあります。
その際に複数使用している列挙体の情報をまとめて変更するようにできる、それがタイプ定義の機能です。
・・・何を言っているか分からないと思うので、タイプ定義を実際に以下の要領で作ってみます。
この今作ったタイプ定義の列挙体を、index.gviwebの中で使用します。使用するには、タイプ定義(拡張子gtype)をドラッグアンドドロップでダイアグラム上に配置します(パネルでは使えず、ダイアグラムでしか使えないことに注意します)。
また、効果を確かめるために、タイプ定義ではない列挙体もあわせて用意します。
では、タイプ定義されていない列挙体とされている列挙体をそれぞれコピペで増やします。以下は3つずつにしていますが、別に2つずつでも構いません。
タイプ定義されていない列挙体について、コピペしたどれかに対して項目を増やしたとします。すると、編集を行った列挙体は当然項目名が増えた状態となりますが、同じ「タイプ定義ではなく列挙体」からコピペされた他の列挙体は、元の項目名を維持したままになっています。
一方で、タイプ定義された列挙体の項目名を増やすことを考えます。タイプ定義された列挙体はプロジェクト上のタイプ定義の中身でしか項目名を編集できないのですが、これを編集して保存します。
その後プログラムのダイアグラムを見ると、タイプ定義された列挙体には全て同じ項目名が反映されているのがわかります。
つまり、タイプ定義されていない場合には、たとえコピペした大元が全て同じ列挙体であったとしても、コピペしたうちの一つを編集しても、コピペした他の列挙体の項目は変わらず、あくまで編集した列挙体にしか編集が反映されません。
しかし、タイプ定義されてしまえば、そのタイプ定義の列挙体さえ編集すれば、同じタイプ定義からコピペしたすべてにその編集の影響をおよぼすことができます。もし反映されない場合には恐らくタイプ定義を保存していないと思われるので、タイプ定義の列挙体を編集後保存してから確認してみてください。
これが何の役に立つのかよくイメージできない、と思われる方もいるかしれませんが、次回紹介するステートマシンでより具体的に使用場面を紹介するので、とりあえずはこういう機能があるんだということを覚えておけばいいと思います。
なお、タイプ定義は列挙体に限らず他のデータタイプに対しても定義できます。が、列挙体以外で意味があるのは実質クラスタくらいなもので、数値や文字列などに対してタイプ定義をする「うまみ」はほぼありません。
本記事ではプロパティノードとタイプ定義を扱いました。それぞれは別々のトピックですが、これらの内容を駆使することでより柔軟なプログラムを書くことができるようになります。
さて、今までもさんざん書いてきましたが、次回はプログラムのテンプレートの一つであるステートマシンを扱おうと思います。
これさえマスターしてしまえば、ある決まった型に当てはまるプログラムはそれなりに自由に書くことができるようになります。実例として具体的なプログラム作りを交えながらステートマシンの便利さを紹介できればと思います。
もしよろしければ次の記事も見ていってもらえると嬉しいです。
ここまで読んでいただきありがとうございました。
コメント