Q1:Lesson.5のStep.2「内部処理を設定する」で「数値のボタン」と「数値入力フィールド」を接続したとき起動メソッドを複数ある選択肢の中から何故「表示したい文字列を設定する(String)」を選ぶのでしょうか?
Q1-1:
Tutrialの基礎編Lesson.5のStep.2「内部処理を設定する」で「数値のボタン」と「数値入力フィールド」を接続したとき起動メソッドを複数ある選択肢の中から何故「表示したい文字列を設定する(String)」を選ぶのでしょうか?
Tutrialの他のページでも起動メソッドにおいて複数ある選択肢の中から何故それを選べばプログラムとして機能するようになるのか知りたいです。このような質問が生じた場合、何を参照すれば良いのでしょうか?参考書のようなものは無いのでしょうか?私は、Javaについてはまったくの無知なのですが、Javaをある程度理解できれば、上記の質問は解決できるのでしょうか?
A1-1:
[数値入力フィールド]は数字を入力し、Enterキーを押した時あるいはフォーカスを失った時に、初めて値が確定されるため、フィールド上に表示されている数字と確定済みの値とが違う場合があります。
また、不正な値をフィールド上に入力した場合には、(デフォルトでは)フォーカスを失った時に表示が確定済みの値に戻るのですが、フォーカスが[数値入力フィールド]上にある限り表示が変わりません。
Lesson5電卓のアプリケーションの場合、通常キーボードからの入力はなく、ボタンを押すと決まった数字をフィールド上に表示し計算をすることが目的なので、「表示されている文字列を取得する()」「表示したい文字列を設定する(String)」を使用しています。
「表示したい文字列を設定し、その文字列で値を確定する(String)」を使って頂いても差支えありません。
「数値を設定する(Object)」は引数がObjectですので、厳密な意味での「数値」を設定します。[加算]コンポーネントに繋がっている[数値入力フィールド]の処理には「取得方法:イベント内包」で数値が入りますので、「数値を設定する(Object)」でも差支えありません。
上記のメソッドを処理に応じて使い分けて頂くことになります。
[数値入力フィールド]の挙動は確かにJavaの仕様に沿ったものもあるのですが、完全に同じという訳ではありません。
MZPlatformではメソッドの選択が一番難しい部分かと存じます。
会員の皆様のなさりたい処理は様々で、網羅し切れないものも多く、ご不便をお掛けしておりますが、お手数でもチュートリアルだけではご不明な点はメールでお問い合わせを頂くのが一番近道かと存じます。
ご連絡頂く内容に応じて、簡単なサンプルプログラムをお送りすることもございます。
Q1-2:
> [数値入力フィールド]は数字を入力し、Enterキーを押した時あるいはフォーカスを失った時に、初めて値が確定されるため、フィールド上に表示されている数字と確定済みの値とが違う場合があります。
ここでの「フォーカス」とは、どのような意味でしょうか?この数値入力フィールドの起動メソッドに「入力フォーカスを設定する()」とありますが、これの意味と併せてご説明頂ければ幸いです。また、上記で「確定済みの値」とありますが、フィールド上に表示されている数字と確定済みの値とは性質上どのような違いがあるのでしょうか?
> Lesson5電卓のアプリケーションの場合、通常キーボードからの入力はなく、ボタンを押すと決まった数字をフィールド上に表示し計算をすることが目的なので、「表示されている文字列を取得する()」「表示したい文字列を設定する(String)」を使用しています。
起動メソッドの後の「()」は何を意味しているのでしょうか?また(String)と(Object)とは、それぞれどのような場合に使用すべきなのでしょうか?MZでは「文字列」と「数値」とは、明確に使い分けておられるのでしょうか?その場合、「文字列」はどのような処理をすれば数値になるのでしょうか?また、上記で「取得する」と「設定する」とありますが、どのような場合に「取得」になり、どのような場合に「設定」になるのでしょうか?
> 「数値を設定する(Object)」は引数がObjectですので、厳密な意味での「数値」を設定します。[加算]コンポーネントに繋がっている[数値入力フィールド]の処理には「取得方法:イベント内包」で数値が入りますので、「数値を設定する(Object)」でも差支えありません。
上記で引数が「Object」となっています。引数の意味はわかりますが、ここでの「Object」とはどのような意味なのでしょうか?「イベント内包」と「メソッド戻り値」とはどのように使い分けるべきなのでしょうか?
A1-2:
1)フォーカスについて
「フォーカス」がある状態とはフィールドの中でカーソルが点滅していたり、選択されている状態です。マウスでクリックするかTabキーを押すとフォーカス(選択状態)が移動します。
「入力フォーカスを設定する()」を実行すると、フィールドの場合、入力カーソルが中で点滅する状態になるので、マウスでクリックせず入力をスムーズに行いたい時などに設定します。
2)確定済みの値について
[数値入力フィールド]はキーボードから、入力だけなら数字以外の文字も入るようになっています。例えば
@[数値入力フィールド]に数字を入力します。まだ値は確定されていません。
Enterキーを押してください。値が確定されます。
A続けて数字以外のアルファベットなど入力してください。
B他の部品をマウスでクリックすると、フォーカスが移動します。
値を確定しようとしますが、不正な値(アルファベット)のため確定されません。
表示は先に確定されていた数字が表示されます。
このように表示されている文字と確定済みの値は同じでない場合があります。
表示されている数字はあくまで「文字」で、確定済みの値は「数値」です。
3)演算の際の値設定について
一般的なプログラミングではデータ型を非常に意識し、型指定、型変換指定を逐一書いておく必要があるかと思います。MZPlatformではユーザーが特に型を意識しなくても、数字の数値への変換や数値から数字への変換などのデータ型変換を自動的に行って処理ができるように設計しております。
特に演算のためのコンポーネント([加算]、[乗算]、[比較演算]など)には「数値変換/左右オペランド設定後、演算を行う(String,String)」といったメソッドが用意してあります。引数設定の際「取得方法:固定値」で「メソッド/値」欄に数字を入れると、この数字はString(文字列)ですが、上記メソッドで自動的に数値に変換されるため、問題なく計算できます。
他に「左右オペランド設定後、演算を行う(Object,Object)」もあります。
Objectは汎用的なデータ型で、文字列や数値を含む様々なデータを割り当てることができます。そのために、データ型の自動変換が行われません。「取得方法:固定値」で値を指定するとその値は文字列となりますので、「加算」や「乗算」の実行に失敗します。
引数が(Object)のメソッドを使用する際には、引数として指定したデータが適合する型か意識する必要があります。
4)メソッドの設定(引数、「設定すると取得する」、取得方法)について
「()」の中にメソッドを実行する際に必要な引数のデータの「型」が書いてあります。何も書いていない場合は、引数指定は必要ありません。
実はメソッド名は英語名を基本とし、使用頻度が高いものだけ日本語名を付けてメソッド一覧に表示されるようになっています。(英語名のままのメソッドを探すには、起動メソッド情報設定の窓で「全メソッド対象」のチェックマークを外してください)
「設定する」と「取得する」は英語名で考えて頂くと、むしろ分かり易く、「set○○」と「get○○」の違いです。
例えば[テキストフィールド]がA,B2つあり、[テキストフィールド]Aに[テキストフィールド]Bと同じ文字を設定したい場合は、[テキストフィールド]Aの起動メソッド情報設定の窓で、メソッドに「テキストを設定する(String)」を選び、下側の引数設定で「取得方法:メソッド戻り値、コンポーネント:テキストフィールドB、 メソッド/値:テキストを取得する()」を選びます。
コンポーネントはそれぞれ内部にデータを持っています。例えば、[テキストフィールド]が持っているデータは、表示されている文字列になります。
「設定する(set○○)」とは、コンポーネントが持つ内部のデータを外部から割り当てることを意味します。一方、「取得する(get○○)」は、コンポーネントが内部に持っているデータを外部で利用(参照)するときに使います。
取得方法:イベント内包の場合、イベントに含まれる情報を取得できます。
例えば[テーブル]のデータ更新イベントには「更新後のテーブルデータ」等が含まれます。各コンポーネントのイベント内包データについてはドキュメントインデックス>『コンポーネントリファレンス』で概要を確認できます。
取得方法:メソッド戻り値では、上でご説明した「取得する(get○○)」メソッドでコンポーネントからデータを得ることができます。
多くの場合、「イベント内包」を使わなくても「メソッド戻り値」で取得できるデータも多いので、無理にイベント内包を使わなくてはいけないということではありません。
Q1-3:
詳しいご返答ありがとうございます。大変良くわかりました。ただ、StringとObjectの違いについて少々わからないことがありますので再度ご質問させて頂きます。
電卓を作成する場合は、文字列から数値型に変換の可能なStringを使用すれば、問題は生じないと考えて宜しいのでしょうか?StringとObjectはそれぞれどのようなケースで使い分けられるのでしょうか?MZプラットフォームで、これら2種の型を設定した理由を教えて下さい。また、StringからObjectまたはその逆の変換は可能なのでしょうか?電卓の「ボタン」から入力できるのは文字列とのことですが、ボタンから数値を入力させることはできないのでしょうか?
電卓の作成で「ボタン」を接続元とし「数値入力フィールド」を接続先とした場合の起動メソッドの設定で
・「文字列を設定した後、その文字列で値を確定する(String)」とは、「ボタンがもつ文字列を数値入力フィールドに設定し、数値として確定させる」と読み変えても宜しいのでしょうか?
・「現在表示されている文字列で値を確定する()」の表示とはボタンではなく数値入力フィールドに表示されているという意味でしょうか?
この表示がボタンに表示されていることを示す場合、この選択肢を選んでもプログラムとして機能すると考えられますが、この判断で正しいでしょうか?
・「表示されている文字列を取得する()」 は、ボタンに表示されている文字列を数値入力フィールドのデータとして取得すると読み替えて宜しいのでしょうか?
・「表示したい文字列を設定する(String)」は、ボタンの文字列のデータを数値入力フィールドに表示する文字列として設定すると読み替えて宜しいのでしょうか?
起動メソッドの「取得方法」についてお伺いします。
「イベント内包」はイベントに含まれる情報を取得でき、「メソッド戻り値」はコンポーネントが保持しているデータを取得できるとご説明頂きました。取得方法にはその他に、「イベント」と「コンポーネント」の選択肢があります。「イベント内包」と 「イベント」の違いと「メソッド戻り値」と「コンポーネント」の違いを教えて下さいますようよろしくお願い申し上げます。
A1-3:
1)アプリケーションビルダーの設計画面の考え方についてご説明します。
(一部極端なご説明になっていますが、ご容赦下さい)
画面上では左側に接続元コンポーネントとイベント、右側に接続先コンポーネントとがありますが、切り離してお考え下さい。
真に行いたいことは右側のコンポーネントの処理に全て書いてあります。
ただし右側の処理を単独で描くことはできませんので、何らかの適切なタイミング(=左側コンポーネントのイベント)を見つけて、接続することになります。
左側のコンポーネントは、使う分だけ呼び出し、並べてあります。
各コンポーネントのイベントは、どんな条件(=タイミング)でどんなイベントが発生するか、予め決められています。
例えば[ボタン]を押すと「アクションイベント」が発生します。[フレーム]は閉ると「アクションイベント」が発生します。
右側に接続処理が設定されれば、処理を行える状態になっています。右側に接続先が無ければ何も行われません。
電卓の場合は、画面上にボタンが沢山あり、ボタンを押すことに処理のタイミングを求めるのが自然なので、ボタンのアクションイベントの先にそれぞれ処理が接続されています。
[加算]コンポーネントにも接続処理が描いてありますが、[加算]は「演算が行われた」時に「処理完了イベント」が発生するようになっています。ここに[数値入力フィールド]の「表示したい文字列を設定する」の処理を設定すると、『計算が行われる度、フィールドに文字を表示』という設定になります。
イベントと同じく、メソッドも各コンポーネントでどんなものが実行できるか予め決められています。引数指定が無いメソッドは他のコンポーネントの情報は使わず実行されると考えて下さい。「表示されている文字列を取得する()」の文字列は『[数値入力フィールド]に表示されている文字列』を指します。
引数のあるメソッドを実行する際には、引数に指定すると他のコンポーネントの情報(戻り値)を利用できるということになります。
電卓の設定では、[ボタン]に繋がった「表示したい文字列を設定する(String)」の処理は、「取得方法:固定値」なので、[ボタン]の情報は利用していません。「取得方法:メソッド戻り値、コンポーネント:[ボタン]、メソッド/値:ボタンのテキストを取得する()」に変更すると、ボタンの表示を利用した処理になります。
2)「取得方法」については『アプリケーションビルダー操作説明書』の「2. 用語説明」に説明がございますので、こちらもどうぞご覧下さい。
「取得方法:イベント」はイベントそのものを指定します。
例えば[サブルーチン]にメソッド「イベントを渡して処理を呼び出す(PFEvent)」があります。これには引数に「取得方法:イベント」を指定します。
「データ更新イベント」に繋がっていた場合は、渡されるイベントは「データ更新イベント」です。
「取得方法:コンポーネント」はコンポーネントそのものを指定し、引き渡します。
3)StringやObject等のデータ型に関しては、java言語の情報もご参考になると思います。市販の参考書等でObject型やキャスト(型変換)の項をご覧下さい。
[加算]コンポーネントの演算のメソッドの例に限定して考えますと、
@引数設定の窓で「固定値」で「メソッド/値」の欄に入力した場合は引数が(String)のメソッドを選びます。
A「メソッド戻り値」や「イベント内包」では、他のコンポーネントから取得したデータの型に依ります
・メソッド/値の欄で「数値を取得する()」としたり、イベント内包で数値を取得した場合は引数が(Object)のメソッドでも(String)のメソッドでも可。
・メソッド/値の欄で「表示されている文字列を取得する()」とした場合には、引数が(Object)のメソッドは不可。(Stirng)の方を選びます。
MZPlatformではユーザーが型を意識しなくても数字の数値への変換や数値から数字への変換などのデータ型変換を自動的に行って処理ができるように設計しております。引数(String)の演算のメソッドはMZPlatformで使い易さを考え、特に設けたものとお考え頂ければ幸いです。
ボタンからは「表示されている文字列を取得()」しかできませんが、これをどうしても「数値」にしたい場合はどうするかということですが、例えば
@[任意精度実数(BigDecimal)格納変数]あるいは[任意精度整数格納変数(BigInteger)]で「メソッド:数値を文字列で設定する(Stirng)」を行い、引数を「取得方法:メソッド戻り値、コンポーネント:ボタン、メソッド/値:表示されている文字列を取得する()」とします。
A上記変数から「メソッド:数値を取得する()」で数値が得られます。
Q1-4:
丁寧なご返答ありがとうございます。大変よくわかりました。
電卓の作成でわかないところがありますので質問致します。お手数ですがご回答頂けるとありがたいです。Tutrialの基礎編Lesson.5のStep.3「機能を拡張する」のあたりで、メソッドでオペランドに設定する前に数値に変換となっていますが、オペランドには、数値のデータしか入らないことになっているのでしょうか?
接続元が「加算コンポーネント」で接続先が「数値入力フィールド」に設定されている場合、メソッドのデータ取得方法は「イベント内包」になっています。この場合、データ自体はどこに保持されているのでしょうか?「加算コンポーネント」でしょうか?もし、そうだとすると、取得方法は「メソッド戻り値」でも可能だと思いますが、いかがでしょうか?また、「加算コンポーネント」での処理は「数値」でおこなうのでメソッドは、数値を取得する()や数値を設定する(Object)でも可能だと思いますが、この考え方は正しいのでしょうか?
基礎編のLesson.5のStep.3「機能を拡張する」の「2)連続計算」では、左オペランドを設定せずに先に右オペランドを設定しています。この場合の左オペランドには何が入っているのでしょうか?この左オペランドは初期化しておかなくて良いのでしょうか?
接続先のコンポーネントが複数ある場合は、プログラムは上のコンポーネントから順番に実行されると考えて良いのでしょうか?
A1-4:
> オペランドには、数値のデータしか入らないことになっているのでしょうか?
実際のところオペランドには数値以外も入ります。例えば[等価演算(=)]には数値以外のデータ(論理型など)をオペランドに入れ演算することもできます。
引数を「取得方法:固定値」や「表示している文字列を取得する()」で設定した場合には、引数が(Object)のメソッドを使うと型変換は無いので、「数字」を入れても文字列型のデータを設定したことになっています。『文字+文字=』の計算をしている形となり、計算は正しく行われません。[加算]や[乗算」に限っては数値でないと正しく演算はできません。
> メソッドのデータ取得方法は「イベント内包」になっています。この場合、データ自体はどこに保持されているのでしょうか?「加算コンポーネント」でしょうか?もし、そうだとすると、取得方法は「メソッド戻り値」でも可能だと思いますが、いかがでしょうか?また、「加算コンポーネント」での処理は「数値」でおこなうのでメソッドは、数値を取得する()や数値を設定する(Object)でも可能だと思いますが、この考え方は正しいのでしょうか?
ご指摘の通り、取得方法はメソッド戻り値でも可能です。
メソッドも「数値を取得/設定」で問題ありません。
> テキストでは、左オペランドを設定せずに先に右オペランドを設定しています。この場合の左オペランドには何が入っているのでしょうか?この左オペランドは初期化しておかなくて良いのでしょうか?
[加算]コンポーネントは一度でもオペランドに値を設定すると、以後その値が残るようになっています。ビルダー編集画面上に追加直後はオペランドはNULLですが、チュートリアル通りに進めて行った場合、最初は別々な処理で右オペランド、左オペランドを設定しているので、NULLはその時点で解消されています。
同じイベントに繋がっている処理は、原則として上から順番に行われるとお考え下さい。但しコンポーネントで何かイベントが発生した場合には、そのイベントの接続先の処理を行ってから、次の処理が行われる場合もあります。
「+ボタン」を押した時は
@[加算]の右オペランド設定される
A演算を行う→
(演算後に処理完了イベントが発生、加算コンポーネントの接続処理へ)
B表示したい文字列を[数値入力フィールド]に設定
C[加算]の左右オペランドに「0」が設定される→(「+ボタン」処理へ戻る)
D[加算]の左オペランド設定される となります。
実はLesson5の完成アプリケーションと同じものを一度も「実行」ボタンを押さずに作り、初めて「+ボタン」を押した場合には、Aのところで「NULL+数値」の計算になってしまい上手く演算ができないのですが、Cで解消されますので、以降は演算可能ということになります。保存して再ロード後もオペランドの設定値は残っています。(「Lesson5電卓」では演算が終わる度「0」が設定されているので、「0」が残っています)
この部分はチュートリアルの説明が足りず判り難く、申し訳ございません。
Q1-5:
親切なご説明ありがとうございました。
良くわかりました。幾つか疑問が生じましたので申し訳ありませんが再度ご質問させて頂きます。
> 実はLesson5の完成アプリケーションと同じものを一度も「実行」ボタンを押さずに作り、初めて「+ボタン」を押した場合には、Aのところで「NULL+数値」の計算になってしまい上手く演算ができないのですが、Cで解消されますので、以降は演算可能ということになります。保存して再ロード後もオペランドの設定値は残っています。(「Lesson5電卓」では演算が終わる度「0」が設定されているので、「0」が残っています)
ここでの「Null」とは、どのような状態をイメージすれば良いのでしょうか?
左オペランドには全く何もない状態でしょうか?Null+数値は、数値にならないと考えて宜しいのでしょうか?では、妥当な計算をおこなうには、初期化は必ず必要であると考えて宜しいのでしょうか?
上記のように一度も実行ボタンを押さずに電卓を完成させて計算をおこないました。
しかし、Null+数値となっているためか、計算結果が表示されません。
ここで、アプリケーションのボタンにある「デバッガ」で左オペランドがNullになっているのかどうかを調べようと思い、デバッガを起動させてみました。しかし、その起動方法はわかるのですが、どの部分をみればバグのある箇所がわかるのか「操作説明書」を読んでみても良くわかりません。また、この場合のバグは操作説明書のp10にある「イベントの発生しないメソッド」に相当するのかもわかりません。
A1-5:
> ここでの「Null」とは、どのような状態をイメージすれば良いのでしょうか?左オペランドには全く何もない状態でしょうか?Null+数値は、数値にならないと考えて宜しいのでしょうか?では、妥当な計算をおこなうには、初期化は必ず必要であると考えて宜しいのでしょうか?
データも何も入っていない状態と考えて頂いて結構です。「NULL+数値」は「0+数値」とは違うので上手く計算できず結果がNULLになります。
「Lesson5電卓」のチュートリアルではタイミング良く左右のオペランドを「0」にすることで、連続して計算を行うことを実現しています。左右オペランドに「0」を設定する処理が電卓らしく動作するために必須なのですが、一般的な処理では、左右オペランドを設定して同時に演算まで行ってしまうことが多く、必ずしも左右オペランドを「0」に戻しておくことが必要ではないと思います。
デバッガーの使い方についてご説明いたします。
@ブレークポイントを「+ボタン」に繋がった「数値変換後、右オペランドを設定する」の処理に設定したとします。
このメソッドは「イベントの発生しないメソッド」なので、「ステップイン」、「ステップオーバー」どちらの矢印を押してもあまり変わりはありません。
一回矢印を押すと『メソッド実行後の状態』になります。右側コンポーネントの左に表示される青い矢印が、コンポーネントの真ん中辺りから下側に移動します。(その後同じイベントに繋がっている下側の処理に移動していきます)
この時、左下の「引数と属性パネル」をご覧下さい。「引数:右オペランド」の「+」印を押すと、ツリーが展開し、実行された引数が確認できます。(デバッガー操作説明書P19)。
Aブレークポイントを「演算を行う」に設定したとします。
演算を行うと処理完了イベントが発生し、その先に処理が設定してあるので、このメソッドは「イベントの発生するメソッド」です。「ステップオーバー」矢印での動作は@と変わりません。
「ステップイン」矢印を押した場合は、一回押すと[加算]の処理完了イベントの先の処理に移動します。終わった後、青い矢印は「演算を行う」の下側に戻ってきます。
Bデバッガー右下「メソッド処理結果リストパネル」(操作説明書P20)には実行されたメソッドに戻り値がある場合、「+」印を押すと戻り値が確認できるのですが、「Lesson5電卓」中では戻り値のあるメソッドは実行されていません。(Lesson9人口分布のアプリケーション中、「指定列の列データをリスト形式で取得する」には戻り値があります)
備考:続きは「アプリケーション開発チュートリアル(実践編)」の「Q&A4」に掲載。