Q21:Lesson12のイメージ表示チュートリアルについてですが、最上階層で右のファイル選択コンポーネントにて「単数Open用ファイル選択ダイアログを表示する」のメソッドにてフレーム(ID:1)のコンポーネントを取得しています。ダイアログ自体は取得方法を固定値にしても開くことが出来たので、ここの意味が分かりません。あえてコンポーネントを取得する意味は何でしょうか?<質問@>
Q21-1:
その箇所以外は理解することが出来ました。
Lesson13拡張版電卓1のチュートリアルですが、連続した数字を数値入力フィールドに表示するところまでは理解できます。
その後「+」を押した後の処理で、左の加算コンポーネントから数値を内部数値格納変数に文字列で設定しています。
「+」を押した時に数値入力フィールドに表示されている数値を加算コンポーネントの右オペランドに設定し、そして加算コンポーネント内の処理に移ると思うのですが、イベント内包にて処理結果データを引数として設定しています。
この処理結果データというのは何の処理結果なのでしょうか?<質問A>
なんとなくまだ、イベント内包のメソッドについて理解しきれてないのが原因だと思いますが宜しくお願いします。
「+」を押した後に何回も加算コンポーネントの処理をする部分がどうにも理解できません。
A21-1:
> Lesson12のイメージ表示チュートリアルについてですが、最上階層で右のファイル選択コンポーネントにて「単数Open用ファイル選択ダイアログを表示する」のメソッドにてフレーム(ID:1)のコンポーネントを取得しています。ダイアログ自体は取得方法を固定値にしても開くことが出来たので、ここの意味が分かりません。あえてコンポーネントを取得する意味は何でしょうか?<質問@>
「単数Open用ファイル選択ダイアログを表示する(Component)」の引数は親コンポーネントを指定するものです。この場合、親コンポーネントとは、ダイアログの表示位置を示すものとお考えください。この引数にコンポーネントを指定すると、ダイアログはそのコンポーネントの中央に表示されます(この場合にはフレーム(ID:1)よりもファイル選択ダイアログの方が大きいので、フレームは背後に隠れてしまいます)。
親コンポーネントを固定値で空欄にしておくと、PC画面の中央に表示されます。
この引数は表示位置を指定するためのもので、「ファイルを開く」という機能そのものに対しては何の意味もありません。
> Lesson13拡張版電卓1のチュートリアルですが、連続した数字を数値入力フィールドに表示するところまでは理解できます。
> その後「+」を押した後の処理で、左の加算コンポーネントから数値を内部数値格納変数に文字列で設定しています。
> 「+」を押した時に数値入力フィールドに表示されている数値を加算コンポーネントの右オペランドに設定し、そして加算コンポーネント内の処理に移ると思うのですが、イベント内包にて処理結果データを引数として設定しています。
> この処理結果データというのは何の処理結果なのでしょうか?<質問A>
足し算の結果です。加算コンポーネントは、「演算を行う()」、「左右オペランド設定後、演算を行う(Object,Object)」、「数値変換/左右オペランド設定後、演算を行う(String,String)」メソッドを実行すると、演算結果をイベント内包データとする処理完了イベントを発生します(詳細は付属のコンポーネントリファレンスをご覧ください)。
「+」ボタンが押された後の処理で行っていることは、最終的には以下の3つです。
(1) 足し算を実行し、その結果を数値入力フィールドに表示する。
(2) 次の数値の入力用に、文字列格納変数の文字列を初期化する。
(3) 次の足し算用に、それまでの足し算の結果を、加算コンポーネントの左オペランドに設定する。
加算コンポーネント(ID:15)の左オペランドには、それまでの足し算の結果が設定されています。
「+」ボタンが押されたとき、加算コンポーネント(ID:15)の「数値に変換後、右オペランドに設定する(String)」メソッドにより数値入力フィールドに表示されている数字が右オペランドに設定され、「演算を行う()」メソッドにより足し算が実行されます。そして、足し算の結果を内包データとする処理完了イベントが加算コンポーネント(ID:15)から発生します。
加算コンポーネント(ID:15)が発生する処理完了イベントに接続された「数値を文字列で設定する(String)」メソッドにより、任意精度実数格納変数(ID:16)に足し算の結果が設定されます。そして、このメソッドの実行により任意精度実数格納変数(ID:16)からはデータ設定イベントが発生し、その接続先の「表示したい文字列を設定する(String)」メソッドによって、数値入力フィールドには任意精度実数格納変数(ID:16)に設定されたデータ、すなわち足し算の結果が設定されます。
ここまでで、上述の(1)の処理が行われたことになります。
次に実行されるのは、加算コンポーネント(ID:15)が発生する処理完了イベントに接続された、加算コンポーネント(ID:15)の「数値に変換後、左右オペランドに設定する(String,String)」メソッドにより左右オペランドが0に設定され、さらに文字列格納変数(ID:16)の「文字列を設定する(イベント発生なし)(String)」メソッドにより、次の数値入力用の文字列が0で初期化されます。
この文字列格納変数(ID:16)の「文字列を設定する(イベント発生なし)(String)」メソッド実行により、上述の(2)の処理が行われたことになります。
この次に行われるのが、「+」ボタン(ID:13)が発生するアクションイベントに接続された、加算コンポーネント(ID:15)の「数値に変換後、左オペランドを設定する(String)」メソッドです。この引数は、今まさに数値入力フィールドに表示されている数字であり、ここまでの足し算の結果です。
以上で、上述の(3)の処理が行われたことになります。
ここで、1つ疑問を抱かれることと存じます。加算コンポーネント(ID:15)の左オペランドにはそれまでの計算結果、右オペランドには新しく入力された数字が設定されるのであれば、途中、加算コンポーネント(ID:15)が発生する処理完了イベントの接続先の2行目で、左右オペランドを0にしておく意味は何なのか?
この処理は、「=」ボタンを押したときに意味を持ちます。「=」ボタンを押したときには連続計算を終了し、次の新しい計算の用意をしておく必要がありますので、加算コンポーネント(ID:15)の左右オペランドを0で初期化しておくことが適切です。そのため、加算コンポーネント(ID:15)が発生する処理完了イベントの接続先には、その初期化処理も含めてあります。
もっとも、この加算コンポーネント(ID:15)の初期化処理は必ずしもここで行わなければならないものではなく、「=」ボタンが発生するアクションイベントの接続先の最後の処理として実行しても特に問題はありません。
Q21-2:
>「+」ボタンが押されたとき、加算コンポーネント(ID:15)の「数値に変換後、右オペランドに設定する(String)」メソッドにより数値入力フィールドに表示されている数字が右オペランドに設定され、「演算を行う()」メソッドにより足し算が実行されます。そして、足し算の結果を内包データとする処理完了イベントが加算コンポーネント(ID:15)から発生します。
以前のLesson5の電卓で理解してたはずですが、イベント番号を一通り習った後だと上記で混乱してしまいました。
左の加算コンポーネントはイベント番号が設定されていないため、「+」から繋がれている右の加算コンポーネントの処理を行った後すぐに左の加算コンポーネントから処理完了イベントが発生するものと思っていました。
つまり演算処理をする前に処理結果を求めているから、どこから?という状態になってしまったわけです。
「+」から接続されている右の加算コンポーネントから左の加算コンポーネントに処理が移るタイミングの違いってどこにあるのでしょうか?<質問@>
なんとなくですが、コンポーネントリファレンスを見てるとイベントが発生する時(加算コンポーネントですと演算を行った時)かな、とも思えるのですが…。
あと、接続元(右コンポーネント)が任意精度実数格納変数になっている場合のメソッドが「数値を文字列で設定する」となっています。実数を格納するための変数なので、この中に入れるのは数値だと思っていたのですが、文字列で設定ということは任意精度実数格納変数の中身は「1234」という文字列なのでしょうか?<質問A>
そもそも、この変数を使うのは文字列格納変数の中を最初「0」という文字列で初期設定し、そこに付け足された「012」などの文字列を数値化するために任意精度実数格納変数に入れたあとに、数値入力フィールドに表示させたりしているのかな、とか思っていました。
A21-2:
>> 「+」ボタンが押されたとき、加算コンポーネント(ID:15)の「数値に変換後、右オペランドに設定する(String)」メソッドにより数値入力フィールドに表示されている数字が右オペランドに設定され、「演算を行う()」メソッドにより足し算が実行されます。そして、足し算の結果を内包データとする処理完了イベントが加算コンポーネント(ID:15)から発生します。
>
> 以前のLesson5の電卓で理解してたはずですが、イベント番号を一通り習った後だと上記で混乱してしまいました。
>
> 左の加算コンポーネントはイベント番号が設定されていないため、「+」から繋がれている右の加算コンポーネントの処理を行った後すぐに左の加算コンポーネントから処理完了イベントが発生するものと思っていました。
> つまり演算処理をする前に処理結果を求めているから、どこから?という状態になってしまったわけです。
>
> 「+」から接続されている右の加算コンポーネントから左の加算コンポーネントに処理が移るタイミングの違いってどこにあるのでしょうか?<質問@>
> なんとなくですが、コンポーネントリファレンスを見てるとイベントが発生する時(加算コンポーネントですと演算を行った時)かな、とも思えるのですが…。
イベントを発生させるメソッドを実行したときに左側のコンポーネントに処理が移るとお考えになって差し支えございません。この点は付属の「開発チュートリアル(基礎編)」の付録「MZ Platformにおけるコンポーネント動作とメソッド起動」にも説明がございますので、どうぞご覧ください。
> あと、接続元(右コンポーネント)が任意精度実数格納変数になっている場合のメソッドが「数値を文字列で設定する」となっています。
実数を格納するための変数なので、この中に入れるのは数値だと思っていたのですが、文字列で設定ということは任意精度実数格納変数の中身は「1234」という文字列なのでしょうか?<質問A>
「文字列で設定」の意味は、与えられた文字列を数値を表現するものとして解釈し、内部にはその文字列をもとにして作成した数値データを保持する、ということです。例えば「1234」という文字列を与えると、内部には1234という数値データを保持します。
> そもそも、この変数を使うのは文字列格納変数の中を最初「0」という文字列で初期設定し、そこに付け足された「012」などの文字列を数値化するために任意精度実数格納変数に入れたあとに、数値入力フィールドに表示させたりしているのかな、とか思っていました。
このご理解で間違いございません。