Q4:イベントの発生するメソッドとイベントの発生しないメソッドの差異、他
Q4-1:
幾つか質問が生じましたので、お伺い致します。
> デバッガーの使い方についてご説明いたします。@ブレークポイントを「+ボタン」に繋がった「数値変換後、右オペランドを設定する」の処理に設定したとします。このメソッドは「イベントの発生しないメソッド」なので、「ステップイン」...
イベントの発生するメソッドとイベントの発生しないメソッドの差異がわかりかねます。ここでのイベントとは何を指すのでしょうか?デバッガーの「引数と属性」のウインドウに示される「ComponentPublicName」とは何を指すのでしょうか?これがNullになっています。また、電卓の場合、単にデバッガーの開始ボタンを押しただけでは、デバッガーのウィンドウには何も表示されません。しかし、実際に計算をおこなうとメソッドコールスタックのウィンドウに「+(ID:7), アクションイベント[NO:0],加算(+)11(ID:11),演算を行う」 と表示されます。この表示は、バグがあるときにのみ表示されるのでしょうか?また、この表示からバグのある箇所の情報を得ることはできるのでしょうか?
Tutorialの実践編Lesson.13のStep.1「任意桁の計算」の「2)起動時の変数の初期化」で接続元コンポーネントが「アプリケーション」で接続先コンポーネントが「文字列格納変数」の設定のとき起動メソッドはテキストでは「文字列を設定する(String)」になっています。「文字列を設定する(イベント発生なし)(String)」との違いを教えて下さい。前者が正しい理由も併せてお願い致します。
上記と同様な質問なのですが、「4)文字列データを数値データに変換」で接続元が「文字格納変数」で、接続先が「任意精度実数変数」のとき起動メソッドが「数値を文字列で設定する(イベント発生なし)(String)」を選択してはいけない理由を教えて下さい。ここで、取得方法がイベント内包となっていますが、ここではデータは文字格納変数に保持されているので、「メソッド戻り値」でも良いと考えて良いのでしょうか?また、ここでのイベントとは何を指すのでしょうか?
ここでの「メソッド/値」が「イベント対象データ」となっています。「イベント発生元コンポーネント」ではいけない理由を教えて下さい。
「5)数値データを[数値入力フィールド]に表示」で接続元が「任意精度実数」で接続先が「数値入力フィールド」の場合の起動メソッドは「数値を取得する」や「数値を設定する(Object)」や「文字列を設定した後、その文字列で値を確定する(String)」を設定できないのでしょうか?設定できない理由も併せて教えて下さい。また、取得方法もイベント内包ではなく、「メソッド戻り値」とし、コンポーネントを「任意精度実数」とし、メソッド/値を「数値(BigDecimal)を取得する」でも良いのでしょうか?
A4-1:
『デバッガー操作説明書』中の「イベントの発生するメソッド」とは、そのメソッド実行により引き起こされるイベントの先に、接続処理が書いてあるものを指します。
各コンポーネントは、どんな条件(=タイミング)でどんなイベントが発生するか予め決められていて、右側に接続処理が設定されれば、処理を行える状態になっています。
電卓の例では[加算]コンポーネント「演算を行う()」で処理完了イベントが発生し、処理完了イベントの先には2つの接続処理が繋がっているので、「演算を行う()」は「イベント発生するメソッド」です。
「ComponentPublicName」は「データ連携機能」という設定を使う時のみ利用する項目で、通常は使いません。デフォルトはNULLになっています。
デバッガーは全部の箇所で停まるわけではありません。エラーの有無とは関係なく、ブレークポイントが設定してある箇所で停まります。「演算を行う()」の処理にブレークポイントを設定なさってはいないでしょうか?
デバッガーの使用に関わらず、エラーが起こった時には、エラーメッセージが発生します。デバッガー使用時には右側接続先のコンポーネントの横に青い矢印が表示されますが、エラーが起こった時その矢印がどの処理で停まっているかで、エラーが発生している箇所が判断できます。その前後の処理を注意深く見ていくということになります。
Lesson13の電卓の場合、基本的には[文字列格納変数]に文字列を設定すると、
すぐさま[文字列格納変数]のデータ設定イベント発生→
[任意精度実数(BigDecimal)格納変数]に「数値を文字列で設定」→
[任意精度実数(BigDecimal)格納変数]のデータ設定イベント発生→
[数値入力フィールド]に「表示したい文字列を設定」
という流れになっています。
このため[文字列格納変数]に設定した数字は、直ぐに[数値入力フィールド]に表示されることになります。
この流れを途中で止めたい場合には「(イベント発生なし)」の方を選択します。
[加算]の処理完了イベントに繋がっている[文字列格納変数」の処理は変数の中味だけ「0」とし、[数値入力フィールド]の表示は変えたくないので、敢えて「(イベント発生なし)」の方を使用しています。
この流れでの取得方法は「イベント内包」、「メソッド戻り値」どちらでも結構です。
「データ設定イベント」の「イベント対象データ」には設定されたデータが含まれると、予め定義してあります。詳しくは『コンポーネントリファレンス』の各コンポーネントのイベントの項をご覧下さい。「イベント発生元コンポーネント」は接続元のコンポーネントそのものを指します。
接続元が「任意精度実数」で接続先が「数値入力フィールド」の場合の設定は、御指摘の通り、「数値を設定する(Object)」や「文字列を設定した後、その文字列で値を確定する(String)」を使用して頂いて問題ありません。
また、取得方法:「メソッド戻り値」とし、コンポーネント:「任意精度実数」メソッド/値:「数値(BigDecimal)を取得する」で結構です。
Q4-2:
ブレークポイントなど何も設定せずにデバッガーを起動させると、バグのある箇所で青の⇒が表示されると考えて宜しいのでしょうか?すなわち、どの箇所にバグがあるのかわからないときにデバッガーを起動させて⇒の付近を調べればバグを発見できる可能性が高いと考えて宜しいのでしょうか?
⇒の付近にバグがある確率は100%と考えて良いのでしょうか?
> Lesson13の電卓の場合、基本的には[文字列格納変数]に文字列を設定すると、
すぐさま[文字列格納変数]のデータ設定イベント発生→
[任意精度実数(BigDecimal)格納変数]に「数値を文字列で設定」→
[任意精度実数(BigDecimal)格納変数]のデータ設定イベント発生→
[数値入力フィールド]に「表示したい文字列を設定」
という流れになっています。
> このため[文字列格納変数]に設定した数字は、直ぐに[数値入力フィールド]に表示されることになります。この流れを途中で止めたい場合には「(イベント発生なし)」の方を選択します。
> [加算]の処理完了イベントに繋がっている[文字列格納変数」の処理は変数の中味だけ「0」とし、[数値入力フィールド]の表示は変えたくないので、敢えて「(イベント発生なし)」の方を使用しています。
上記に関して確認したいことがあります。文字格納変数をAとし、任意精度実数変数をBとし数値入力フィールドをCとする場合、[A]→[B]→[C]となっている場合、[A]で「イベント発生なし」の状態でメソッドを設定するとその設定は[A]にだけに留まり、[B]や[C]にまで[A]の情報が伝達しないと考えて良いのでしょうか?また、実践編Lesson.13のStep.1「任意桁の計算」の「6)[加算]コンポーネントの処理の変更」の変数の初期化では、Aのみを初期化しています。BやCではなく何故Aのみを初期化するのでしょうか?その理由はBやCを初期化してもAの値で上書きされるからでしょうか?テキストでは、Aの初期化で イベント発生なしを選択しています。これはイベント発生なしなのでAのみを初期化されると考えて良いのでしょうか?BやCを初期化しなくてもプログラム上問題が生じない理由を教えて下さい。
実践編Lesson.13のStep.2「[0]ボタンと[.(小数点)]ボタンを追加」の「2)エラー処理」で接続元を文字格納変数とし接続先を整数格納変数としたときの起動メソッド
として下記を選択してはいけない理由を教えて下さい。
・int値を取得する
・数値(BigInteger)を設定する(イベント発生なし)(BigInteger)
・数値を取得する
・数値を文字列で設定する
int値とは整数を示すと考えて宜しいのでしょうか?
ここでメソッド/値とありますが、
・文字列の長さを取得する
・文字列を取得する
文字列の長さとは、具体的に何を表しているのでしょうか?文字列を取得するとは、文字列そのものを取得すると考えて宜しいのでしょうか?
起動メソッドで、「指定インデックス間の部分文字列に置き換える」とあります。ここでの指定インデックスとは何を指すのでしょうか?「説明」の欄にある「部分文字列の開始インデックス」と「部分文字列の終了インデックス」の2つを設定している理由と前者に固定値0を設定する理由を教えて下さい。
メソッド/値で「数値(BigInteger)を取得する」となっていますが、整数変数から整数を取得して、それが実数に変換されるからくりを教えて下さい。
A4-2:
デバッガー動作時、明らかにエラーメッセージが発生するようなエラーの場合は、その部分で停まります。但しエラーにはならないが、自分の意図した処理になっていないということも往々にしてあります。例えば『フィールドAから値を取得しているつもりが、フィールドBを指定していた』などです。その場合にはやはり適宜ブレークポイントを設定して、見ていくことになります。
> [A]→[B]→[C]となっている場合、[A]で「イベント発生なし」の状態でメソッドを設定するとその設定は[A]にだけに留まり、[B]や[C]にまで[A]の情報が伝達しないと考えて良いのでしょうか?
[A] にイベントが発生(『[A]→』)して初めて『→[B]』となるので、この『→』が出なければ後には続きません。
実践編Lesson.13のStep.1「任意桁の計算」の「6)[加算]コンポーネントの処理の変更」で[文字列格納変数]に「0」を設定している理由は、「メソッド:指定した文字列と連結して置き換える」を使用して数字ボタンを連続して押した場合には複数桁の数字になるようにしているのですが、「+」や「=」を押した時には、もう連結する必要はないので一旦「0」を設定(初期化)しています。
この時「イベント発生なし」でない方を選ぶと[A]→[B]→[C]と伝わってしまい、[数値入力フィールド]上に表示されている数字まで「0」になってしまいます。[数値入力フィールド]上の数字を使って計算もしており「0」になっては都合が悪いので「イベント発生なし」を使用しています。
>下記を選択してはいけない理由を教えて下さい。
> ・int値を取得する
> ・数値(BigInteger)を設定する(イベント発生なし)(BigInteger)
> ・数値を取得する
> ・数値を文字列で設定する
「取得する」のメソッドは、ここでは何整数を「設定」したいので使えません。
「数値(BigInteger)を設定する(BigInteger)」は[整数(BigInteger)格納変数]の「データ設定イベント」には何も処理が繋がっていませんので、「イベント発生あり/なし」どちらでも処理に差異は生じません。
「数値を文字列で設定する(String)」は文字列でも型変換されるので使用できます。
> 「指定インデックス間の部分文字列に置き換える」とあります。
> ここでの指定インデックスとは何を指すのでしょうか?
このメソッドは例えば[文字列格納変数]の中に文字列「ABCDE」が入っている時、「ABC」だけにしたい時に使用します。インデックスは左から何番目かということで、順に「0,1,2…」と数えます。例えば「C」のインデックス(位置)は「2」です。「ABC」だけ取り出し置き換える場合の引数は「0」と「3」(取り出されるのは0,1,2番目の文字。「0」から始まり「3」の直前まで)
「電卓」において[文字列格納変数]と[任意精度実数格納変数]が繋がった処理の箇所でエラーになるのは、小数点の「.」を2度押してしまい「1.2.」といった文字列になる場合と考えられます。最後の小数点を取り去り「1.2」とするのが、ここでの処理の目的です。
「1.2.」の例では@文字列の長さは「4」です。
A指定開始インデックスは「0」です。終了インデックスは「3」です。
(最後の文字がエラーの原因ですから、文字列の長さより1小さい数になります)
Bそのため[整数格納変数]で「値を1減らして」います。
intは「(32ビット)整数」のことです。「BigInteger」は「任意精度の整数」です。 「指定インデックス間の部分文字列に置き換える」の引数に使用する場合、厳密に考えると「int値を取得する」の方がより良いかもしれません。ただし[任意精度整数格納変数」に入る数値も取得できる数値も整数ですので、エラーなく型変換され、ここでの引数として使用できます。
Q4-3:
大変良くわかりました。
> デバッガー動作時、明らかにエラーメッセージが発生するようなエラーの場合は、その部分で停まります。但しエラーにはならないが、自分の意図した処理になっていないということも往々にしてあります。例えば『フィールドAから値を取得しているつもりが、フィールドBを指定していた』などです。その場合にはやはり適宜ブレークポイントを設定して、見ていくことになります。
了解しました。ところでブレークポイントを設定していないときに表示される青の⇒の箇所は何を示しているのでしょうか?バグのある箇所と考えて良いのでしょうか?
実践編Lesson.13のStep.1「任意桁の計算」の「6)[加算]コンポーネントの処理の変更」で演算をおこなった後に「入力文字格納変数」の文字列を0に初期化するとありますが、演算後であれば、接続元は、「=」や「数値入力フィールド」などのコンポーネントでも良いと思いますが、何故ここでは、接続元が「加算+」になっているのでしょうか?また、ここでの処理結果データは「加算+」コンポーネントに保持されていると考えて宜しいのでしょうか?
>>下記を選択してはいけない理由を教えて下さい。
>> ・int値を取得する
>> ・数値(BigInteger)を設定する(イベント発生なし)(BigInteger)
>> ・数値を取得する
>> ・数値を文字列で設定する
> 「取得する」のメソッドは、ここでは何整数を「設定」したいので使えません。
文字列格納変数から数を取得するという考え方ではいけないのでしょうか?「取得する」と「設定する」の違いについて以前下記のように説明を受けました。
「設定するとはコンポーネントがもつ内部データを外部から割り当てるこという。取得するとは別のコンポーネントが持っている内部データを利用する場合に使う。」
この説明では、その違いを明確にイメージできかねます。外部から割り当てるとは、どのようなことなのか。利用するとは具体的にどのようなことなのか、お教え下さいますようお願い申し上げます。
実践編Lesson.13のStep.2「[0]ボタンと[.(小数点)]ボタンを追加」の「2)エラー処理」の接続先コンポーネント@の起動メソッドの選択肢として
> 「数値を文字列で設定する(String)」は文字列でも型変換されるので使用できます。
とありますが、文字列が0.123の場合123と整数に変換され、1.23の場合123と整数に変換されると考えて良いのでしょうか?これらを実数に戻すときに、前者と後者の違い、すなわち0.123と1.23の違いの情報は、どのようにしてプログラムの後方に伝わっていくのでしょうか?
ここで、接続先として「整数格納変数」を使用しています。扱っている数字は実数なのに、何故ここで、「整数格納変数」を使用するのでしょうか?
> intは「(32ビット)整数」のことです
32ビットの整数とは、何桁の整数を指すのでしょうか?
A4-3:
> ところでブレークポイントを設定していないときに表示される青の⇒の箇所は何を示しているのでしょうか?バグのある箇所と考えて良いのでしょうか?
エラーが発生して処理が止まった場合には、青の矢印が停まった場所で中断されている、附近でエラーが発生しているとお考え頂いて宜しいかと思います。
> 実践編Lesson.13のStep.1「任意桁の計算」の「6)[加算]コンポーネントの処理の変更」で演算をおこなった後に「入力文字格納変数」の文字列を0に初期化するとありますが、演算後であれば、接続元は、「=」や「数値入力フィールド」などのコンポーネントでも良いと思いますが
「+」と「=」ボタンの処理の「演算を行う」のすぐ下に設定する方法でも、もちろん結構です。
「数値入力フィールド」への接続は、この「電卓」では「表示したい文字列を設定する」を使用し数値を確定させていない関係上、データ更新イベントもデータ設定イベントも発生していませんので、不適当です。
> 文字列格納変数から数を取得するという考え方ではいけないのでしょうか?
アプリケーションビルダーの編集画面の見方ですが、一旦完全に右側の接続と左側のコンポーネントを切り離してお考え下さい。
右側の接続だけ見ていきます。例えば
・[加算]で「演算を行う」
・[任意精度実数格納変数]に「数値を文字列で設定する」
「右側のコンポーネントで/に/から」等、右側コンポーネントに於いて右側コンポーネントを対象にして行われる動作が「メソッド」となります。
この時、足りない情報を補うのが引数です。
[任意精度実数格納変数]に「数値を文字列で設定」の際には、『どんな数値を設定するのか』という情報が必要ですが、起動メソッド情報の引数欄で「どこからどういう方法で入手」するか指定しています。
ErrorOnlyの設定がしてある[整数格納変数]の処理は『[文字列格納変数]の文字数(文字列長さ)を取得し、1減らし、文字列格納変数の中の文字列を置き換えるための指定インデックスとして使用する』目的で行っています。
[文字列格納変数]の接続された処理は4つありますが、一番上の[任意精度実数格納変数]の「数値を文字列で設定する]と、後の3つは別な目的の処理とお考え下さい。
一つのイベントに繋がっている処理でも、必ずしも連続して行わなければいけない処理ばかりということではありません。
intで表現できる値は-2147483648〜2147483647の整数(最小値:-2^31、最大値:2^31-1)です。
Q4-4:
良くわかりました。また新たに疑問が生じましたので
質問致します。
>> 実践編Lesson.13のStep.1「任意桁の計算」の「6)[加算]コンポーネントの処理の変更」で演算をおこなった後に「入力文字格納変数」の文字列を0に初期化するとありますが、演算後であれば、接続元は、「=」や「数値入力フィールド」などのコンポーネントでも良いと思いますが
> 「+」と「=」ボタンの処理の「演算を行う」のすぐ下に設定する方法でも、もちろん結構です。
> 「数値入力フィールド」への接続は、この「電卓」では「表示したい文字列を設定する」を使用し数値を確定させていない関係上、データ更新イベントもデータ設定イベントも発生していませんので、不適当です。
演算に使う変数なので、演算後にそれらの初期化が必要であることはわかりますが、上記の「数値入力フィールド」を接続元にできない理由が分かりかねます。
接続元と接続先を決定付ける関係はなんなのでしょうか?上記で数値を確定していないとありますが、入力文字格納変数に保持されるデータは文字列なので、数値フィールドで数値として確定させる必要はないと思いますが、どうなのでしょうか?
初期化に関して質問です。
演算に係る変数は、「入力文字格納変数」と「任意精度実数格納変数」と「オペランド」であると思いますが、ここで初期化しているのは、「入力文字格納変数」と「オペランド」のみですが、「任意精度実数格納変数」を初期化しなくても良い理由を教えて下さい。
実践編Lesson.13のStep.2「[0]ボタンと[.(小数点)]ボタンを追加」の「2)エラー処理」
エラーが発生しないときに起動するコンポーネントが1つとその下にエラー発生時に起動するコンポーネントが3つ示してあります。エラー発生時のこれらのコンポーネントの起動順番についてお聞きします。エラーが発生したときはエラー発生時に起動する3つのコンポーネントが起動し、その後、エラーが発生しないときのコンポーネント、すなわち一番上のコンポーネントが実行されると推測されますが、コンポーネントの起動順は、
一般的にどのようにして決定されるのでしょうか?すなわち、エラー発生時に起動する 3つのコンポーネントの下にエラーが解消されたときに実行すべきコンポーネントを追加しておかなくても宜しいのでしょうか?
実践編Lesson.13のStep.3「四則演算」の「1)変数の利用」の考え方の部分
・・・演算子が入力される度に記憶されている演算を実行してから、「内部演算子格納変数」にその「演算子」コンポーネントを設定します。・・・とありますが、記憶されている演算を実行してしまえば、その演算の情報は不要になるので、変数に設定する必要はないと思いますがいかがでしょうか?
メソッド戻り値とイベント内包
イベント内包の定義では、イベントに含まれるデータをメソッド引数に指定する、とあります。イベントに含まれる場合、データはそのイベントに関与するコンポーネントに保持されるのではないのでしょうか?もし、そうであれば、メソッド戻り値と差異はないと思いますがいかがでしょうか?メソッド戻り値の定義では、コンポーネント内のデータを取得して引数として渡す、とあります。
実践編Lesson.13のStep.3「四則演算」の「1)変数の利用」の接続確認
@接続先が「サブルーチン」の場合、起動メソッドとして「処理を呼び出す()」と「イベントを渡して処理を呼び出す(PFEvent)」とがあります。これらの違いを教えて下さい。なぜ、ここでは前者を使うのでしょうか?また、処理を呼び出す()の「()」は何を意味するのでしょうか?
A接続先が「内部演算子格納変数」の場合、起動メソッドとして「演算子を取得する()」や「演算子を設定する(イベント発生なし)(PFArithmeticOperator)」を選べない理由を教えて下さい。取得方法は、「イベント内包」となっていますが、演算子を引数とするので「コンポーネント」でも良いと考えますがいかがでしょうか?メソッド/値が「イベント対象データ」となっていますが、引数は演算子なので対象データよりも「イベント発生元コンポーネント」の方が妥当だと考えますがいかがでしょうか?
A4-4:
電卓画面上のボタンを押しても[数値入力フィールド]にはイベントが発生しません。ビルダー編集画面上で、行いたい処理は右側に書きますが、右側の処理単独で描くことはできませんので、どこか適切なタイミング、つまり左側のコンポーネントの適切なイベントを見つける必要があります。
例えば「ボタンを押す」というのもタイミングの一つで、ボタンを押すと[ボタン]から「アクションイベント」が発生し、その先に繋げてある「指定した文字列と連結して置き換える」が実行されます。ボタンを押さない限り、右側の処理が行われないということになります。
「電卓」では[数値入力フィールド]のイベントの先に処理を繋げても、イベントが起こる動作や処理がないので、右側の処理は行われません。
各コンポーネントにイベントが起こる条件については『コンポーネントリファレンス』に書いてあります。
[任意精度実数格納変数]のデータ設定イベントには[数値入力フィールド]の「表示したい文字列を設定する」の処理が繋がっていますので、「0」が設定されると[数値入力フィールド]の表示もすぐに「0」になってしまいます。
[数値入力フィールド]上の表示は計算結果など残しておきたいので、「0」が設定されては都合が悪いということになります。
[数値入力フィールド]内に数値が残っていても、[文字列格納変数]に文字が入ると、(初期化処理を除き)すぐに「数値を文字列で設定する」の処理が行われて数値が置き換わりますし、再ロード時には「0」になるので問題ありません。
> 起動順番についてお聞きします。エラーが発生したときはエラー発生時に起動する3つのコンポーネントが起動し、その後、エラーが発生しないときのコンポーネント、すなわち一番上のコンポーネントが実行されると推測されますが、コンポーネントの起動順は、
一般的にどのようにして決定されるのでしょうか?
「電卓」で想定しているエラーは、[文字列格納変数]に繋がっている[任意精度実数格納変数]に「数値を文字列で設定する」を行った時に発生するエラーですので、まず一番上の処理は行われています。
エラーが発生すると、通常そこでアプリケーション内の処理の実行は止まってしまいます。
ErrorOnlyモードを設定している場合には、その後その処理が行われます。
[文字列格納変数]に繋がっている処理を上から@〜Cとすると
@(エラー発生)→A→B→C([文字列格納変数]データ設定イベント発生)→@([任意精度実数格納変数]データ設定イベント発生)→[数値入力フィールド]に「表示したい文字列を設定する」という流れになっています。
> 実践編Lesson.13のStep.3「四則演算」の「1)変数の利用」の考え方の部分・・・演算子が入力される度に記憶されている演算を実行してから、「内部演算子格納変数」に
その「演算子」コンポーネントを設定します。・・・とありますが、記憶されている演算を 実行してしまえば、その演算の情報は不要になるので、変数に設定する必要はないと思いますがいかがでしょうか?
文章中の『その「演算子」』は後から押した演算子を指しています。
> イベント内包の定義では、イベントに含まれるデータをメソッド引数に指定する、とあります。イベントに含まれる場合、データはそのイベントに関与するコンポーネントに保持されるのではないのでしょうか?もし、そうであれば、メソッド戻り値と差異はないと思いますがいかがでしょうか?メソッド戻り値の定義では、コンポーネント内のデータを取得して引数として渡す、とあります。
ご指摘の通りで、チュートリアルで「イベント内包」を指定してある場合でも、「メソッド戻り値」で取得可能な値を扱っている処理は多くあります。その場合には「メソッド戻り値」を使用しても問題はございません。
> @接続先が「サブルーチン」の場合、起動メソッドとして「処理を呼び出す()」と「イベントを渡して処理を呼び出す(PFEvent)」とがあります。これらの違いを教えて下さい。なぜ、ここでは前者を使うのでしょうか?また、処理を呼び出す()の「()」は何を意味するのでしょうか?
・[サブルーチン]で「処理を呼び出す()」が実行されると[サブルーチン]から「アクションイベント」が発生します。行いたい処理は「アクションイベント」に繋げて設定します。
・[サブルーチン]で「イベントを渡して処理を呼び出す(PFEvent)」が実行されると、[サブルーチン]から渡されたイベントが発生します。行いたい処理は渡されたのと同じ名前のイベントに繋げて設定します。
「イベントを渡して…」を使うと、イベント番号、データ等を含んだイベントがそのまま引き渡されるので便利な場合がありますが、今回は特にイベント内包データを必要としていないので、シンプルな「処理を呼び出す()」を使用しています。
「()」の中に何か文字が入っていれば引数が必要で、入っていなければメソッドの実行の際に引数は必要ないということになります。
>A接続先が「内部演算子格納変数」の場合、起動メソッドとして「演算子を取得する()」や「演算子を設定する(イベント発生なし)(PFArithmeticOperator)」を選べない理由を教えて下さい。取得方法は、「イベント内包」となっていますが、演算子を引数とするので「コンポーネント」でも良いと考えますがいかがでしょうか?
「演算子を設定する(イベント発生なし)(PFArithmeticOperator)」とすると、[内部演算子格納変数]のデータ設定イベントの右側に繋げてある「演算子の左側の数値を文字列で設定して数値変換する(String)」の処理が行われなくなってしまいますので、不適です。
「演算子を取得する()」は英語で言うと「getOperator」で、「データ設定」の処理ではありませんから、不適です。
確かにコンポーネントが引き渡されているのですが、ここで「「取得方法:コンポーネント」とすると、P112,P119で行っているようにコンポーネントの名前を指定しなくてはなりません。演算に関するコンポーネントは加算、減算など4種類あるので、「イベント内包」でないと特定できなくなってしまいます。
「取得方法:イベント内包」の「イベント発生元コンポーネント」は接続元の[入力演算子格納変数]を指し、内部に格納されているデータではありませんので、不適です。
Q4-5:
丁寧なご説明ありがとうございます。大変良くわかりました。
実践編Lesson.13のStep.2「[0]ボタンと[.(小数点)]ボタンを追加」の「2)エラー処理」のコンポーネントの実行順
> [文字列格納変数]に繋がっている処理を上から@〜Cとすると
> @(エラー発生)→A→B→C([文字列格納変数]データ設定イベント発生)
> →@([任意精度実数格納変数]データ設定イベント発生)→[数値入力フィールド]に「表示したい文字列を設定する」という流れになっています。
MZプラットフォームでは、特に指定しない限り、エラーが生じた場合には上記の順にコンポーネントが実行されるのでしょうか?通常、プログラムは上から下に実行されると伺いました。今回のようにエラー処理がおこなわれた後、下から上に実行されるということですね。
実践編Lesson.13のStep.3「四則演算」の「1)変数の利用」の接続確認
> ・[サブルーチン]で「イベントを渡して処理を呼び出す(PFEvent)」が実行されると、[サブルーチン]から渡されたイベントが発生します。行いたい処理は渡されたのと同じ名前のイベントに繋げて設定します。
上記で「サブルーチンから渡された」とありますが、具体的にどのようなことを指すのでしょうか?
Aの起動メソッドの選択
> 「演算子を取得する()」は英語で言うと「getOperator」で、「データ設定」の処理ではありませんから、不適です。
ここでは、演算子をデータとして設定しているとの理解で良いのでしょうか?私の認識では、データというと数値を想像してしまうのですが、MZでは演算子もデータとして定義するのでしょうか?まだ、「取得する」の意味が理解できていないので伺います。入力演算子格納変数から演算子を取得し、内部演算子格納変数に設定するという考え方なのでしょうか?この場合、取得と設定の両方の単語を使っています。ここで、「取得」でなく「設定」の単語を使っている理由を教えて下さい。
実践編Lesson.13のStep.3「四則演算」の「1)変数の利用」の接続確認
> 「取得方法:イベント内包」の「イベント発生元コンポーネント」は接続元の[入力演算子格納変数]を指し、内部に格納されているデータではありませんので、不適です。
上記の内部に格納されているデータとは、「入力演算子格納変数」に保持されているデータではないのでしょうか?もし、そうだとするならば、イベント発生元コンポーネントでも適当であると推察しますが、いかがなのでしょうか?
実践編Lesson.13のStep.3「四則演算」の「1)変数の利用」の接続確認の表の最後
起動メソッドで「演算子の左側の数値を文字列で設定して数値変換する(String)」の左側の数値とは左オペランドを指すのでしょうか?上記は「数値を文字列で設定して数値変換」となっています。何故、数値→文字列→数値となって文字列を間に入れて複雑にしているのでしょうか?
実践編Lesson.13のStep.3「四則演算」の「3)サブルーチンの利用」の初期化サブルーチンではオペランドの初期化が入っていませんが入れなくても良いのでしょうか?
実践編Lesson.13のStep.3「四則演算」の「3)サブルーチンの利用」の接続確認
Null判定のコンポーネントの起動メソッドに演算をおこなうなどの選択肢を設定した理由は何でしょうか?Null判定と演算を関係付けると利点があるのでしょうか?
ここで内部演算子格納変数を初期化する理由を教えて下さい。この変数は入力演算子格納変数で上書きされると推測されます。にも拘わらず初期化するのは何故なのでしょうか?"="を二度押したときに二度目の"="で結果が変わらないようにするためでしょうか?
また、入力文字列格納変数を初期化していますが、その理由を教えて下さい。
任意精度実数変数やオペランドなどを初期化せず、この変数のみを初期化している理由を教えて下さい。
ここには、同じ初期化の操作が2回続けて記載してありますが、最初の初期化の操作を初期化サブルーチンでまとめてはいけないのでしょうか?
これらの入力文字列格納変数の初期化で前者は(イベント発生なし)で後者はイベントについて何も記載がないのですが、これらは何故このように区別されているのでしょうか?
A4-5:
実践編Lesson.13のStep.2「[0]ボタンと[.(小数点)]ボタンを追加」の「2)エラー処理」のコンポーネントの実行順ですが、
@(エラー発生)→A→B→Cまで行われると、[文字列格納変数]にデータ設定イベントが発生することになります。そこで、もう一度@が実行されます。もしCのメソッドが[文字列格納変数]にイベントを発生させる要因になるものでなければ、@は再びは行われません。
> 「サブルーチンから渡された」とありますが、具体的にどのようなことを指すのでしょうか?
『[サブルーチン]から、「イベントを渡して処理を呼び出す(PFEvent)」で渡されたイベント』です。
> 入力演算子格納変数から演算子を取得し、内部演算子 格納変数に設定するという考え方なのでしょうか?この場合、取得と設定の 両方の単語を使っています。
ご理解の通りで結構です。[入力演算子格納変数]のデータ設定イベントに[内部演算子格納変数]が繋がっていますが、切り離してまずは右側だけご注目下さい。
[内部演算子格納変数]に演算子を設定します。
この時演算子のデータが必要なので、どこからか取得してきます。指定は引数の部分で行います。
「取得方法:イベント内包」となっていますが、「接続元のコンポーネントからデータを取得」という指示と同等になります。
メソッド/値欄で「イベント対象データ」を選んでいます。ここで「どんなデータを取得するのか」指示しています。
あくまで「接続元コンポーネント」は[内部演算子格納変数]全体を指しています。「演算子」のデータは[内部演算子格納変数]に設定された(保持された)ものです。
メソッド「演算子の左側の数値を文字列で設定して数値変換する(String)」は『演算子の左側の数字を(厳密には数値でないかも知れない)設定して、(念のため)数値変換する』とご理解下さい。
「左側の数値」は[左オペランド」を指します。
> 実践編Lesson.13のStep.3「四則演算」の「3)サブルーチンの利用」の初期化サブルーチンではオペランドの初期化が入っていませんが入れなくても良いのでしょうか?
[内部演算子格納変数]を初期化していますので、一旦全てが空になっているとお考え下さい。
> 実践編Lesson.13のStep.3「四則演算」の「3)サブルーチンの利用」の接続確認
> Null判定のコンポーネントの起動メソッドに演算をおこなうなどの選択肢を設定した理由は何でしょうか?Null判定と演算を関係付けると利点があるのでしょうか?
アプリケーションを実行した当初や「C」、「=」ボタンを押した後、[内部演算子格納変数]はNULLになっています。
この時、「演算子の右側の数値を文字列で設定して数値変換する」、「演算を行う」を実行するとエラーが発生してしまいますので、一番初めに演算のボタンを押した時と2回目以降とを分けるために、このような条件分けを設定しています。
> ここで内部演算子格納変数を初期化する理由を教えて下さい。この変数は入力演算子格納変数で上書きされると推測されます。にも拘わらず初期化するのは何故なのでしょうか?"="を二度押したときに二度目の"="で結果が変わらないようにするためでしょうか?
[入力演算子格納変数]にデータが設定されると、その後
@[演算実行サブルーチン]処理を呼び出す
A[NULL判定]オペランド設定後演算を行う→NULLでない場合
B[内部演算子格納変数]演算子の右側の数値を文字列で設定して数値変換する
C[内部演算子格納変数]演算を行う
D[内部演算子格納変数]初期化する
E[文字列格納変数]文字列を設定する(イベント発生なし)
F[内部演算子格納変数]演算子を設定する
という順番で実行されます。
Cで演算を実行した後は一旦初期化して、次の演算に備えます。
[文字列格納変数]を逐次「0」に戻す理由ですが、「指定した文字列と連結して置き換える」を使用しているため、タイミング良く「0」に戻さないと数字がどんどん連結していってしまうためです。
Lesson13の電卓の場合、基本的には[文字列格納変数]に文字列を設定すると、
[文字列格納変数]のデータ設定イベント発生→
[任意精度実数(BigDecimal)格納変数]に「数値を文字列で設定」→
[任意精度実数(BigDecimal)格納変数]のデータ設定イベント発生→
[数値入力フィールド]に「表示したい文字列を設定」
という流れになっています。
[文字列格納変数]で「文字列を設定する」(=イベント発生あり)を選べば、すぐに[任意精度実数格納変数]も同じ数字が設定されます。
(イベント発生なし)を選ぶ場合は、[数値入力フィールド]の表示まで変わってしまうと不都合がある場合です。[任意精度実数格納変数]の中を「0」に戻しておかなくても特に問題は生じません。
なおこのLesson13実践編Lesson.13のStep.3「四則演算」以降は、だいぶ複雑な設定になっており、通常講習会ではご紹介しておりません。ご参考になりそうなところを、部分々々でご覧頂ければ幸いです。
Q4-6:
ご返答ありがとうございます。また、質問が生じましたのでお伺い致します。
Lesson.13のStep.3「四則演算」の「1)変数の利用」の接続確認の@
ここでの起動メソッドの1つに「イベントを渡して処理を呼び出す(PFEvent)」があります。この詳細は、[サブルーチン]から渡されたイベントが発生すると、ご説明を受けました。
Q. これが実行されるにはサブルーチンにイベントの情報がなければならないのでしょうか?また、渡すとは、サブルーチンからどこにイベントを渡すのでしょうか?
Lesson.13のStep.3「四則演算」の「1)変数の利用」の接続確認のAの起動メソッドの選択
Q「演算子を取得する」が不適当である理由がよくわかりません。ご説明頂いた下記では、「取得」と「設定」の両方の単語が記載されています。それにも拘わらず「設定」でないといけない理由を教えて下さい。
>> 実践編Lesson.13のStep.3「四則演算」の「3)サブルーチンの利用」の初期化サブルーチンではオペランドの初期化が入っていませんが入れなくても良いのでしょうか?
> [内部演算子格納変数]を初期化していますので、一旦全てが空になっているとお考え下さい。
この変数が初期化されると、自動的にこの変数に格納されている演算子のオペランドも初期化されると考えて良いのでしょうか?
Lesson.13のStep.3「四則演算」の「3)サブルーチンの利用」
>> Null判定のコンポーネントの起動メソッドに演算をおこなうなどの選択肢を設定した理由は何でしょうか?Null判定と演算を関係付けると利点があるのでしょうか?
> アプリケーションを実行した当初や「C」、「=」ボタンを押した後、[内部演算子格納変数]はNULLになっています。
Lesson.13のStep.3「四則演算」の「1)変数の利用」の「考え方」に内部演算子格納変数に、その「演算子」コンポーネントを設定する、とあります。ご説明と異なりますが、どう考えるべきなのでしょうか?
基本的な質問で申し訳ありませんが、「データ設定イベント」と「アクションイベント」とはどのようにことなるのでしょうか?
A4-6:
[サブルーチン]のメソッド「イベントを渡して処理を呼び出す(PFEvent)」の方を選んだ場合には、引数にイベントを指定する必要があります。「処理を呼び出す()」を選んだ場合には引数は必要がありません。
このメソッドは『サブルーチンにイベントを渡して、サブルーチンの処理を呼び出す(PFEvent)』の意とお考え下さい。
例えば[サブルーチン]が接続している接続元のイベントが、[テーブル]の「データ更新イベント」であったとします。
この場合「データ更新イベント」が[サブルーチン]に渡され、[サブルーチン]から「データ更新イベント」が発生します。
その先に処理を設定すると実行されます。
このメソッドを使うと、[テーブル]と『[サブルーチン]の[データ更新イベント]の先に繋げた処理』が分断されず、データ更新イベント内のイベント内包データやイベント番号の利用ができるということが利点です。
取得すると設定するについて
コンポーネントを一種の箱のようなものと考えてみて下さい。
入れられるもの(設定できる項目)は予め決まっています。
箱の前に立って、目の前の箱の中にデータを入れます(設定します)。
この「目の前の箱」が右側接続先コンポーネントとなります。
> この変数が初期されると、自動的にこの変数に格納されている演算子のオペランドも初期化されると考えて良いのでしょうか?
オペランドも初期化されます。
> Lesson.13のStep.3「四則演算」の「1)変数の利用」の「考え方」に内部演算子格納変数に、その「演算子」コンポーネントを設定する、とあります。ご説明と異なりますが、どう考えるべきなのでしょうか?
アプリケーションを実行した当初や「C」、「=」ボタンを押した後、[内部演算子格納変数]は一旦NULLになっています。「+」や「x」を押す前です。
「+」や「x」を押した時には、変数に演算子のコンポーネントが設定されます。
「データ設定イベント」と「アクションイベント」ですが、コンポーネントによって、それぞれ意味合いが違います。各コンポーネントは予め、発生可能なイベント、発生条件、イベントに含まれるデータ等が定義されています。詳しくは『コンポーネントリファレンス』をご覧下さい。
「データ設定イベント」は基本的に、文字通り何かデータが設定された時発生するイベントとお考え下さい。
「アクションイベント」は[ボタン]の場合は「ボタンが押された時」、[フレーム]の場合は「フレームが閉じた時」です。
Q4-7:
良くわかりました。
電卓の全体的な各コンポーネントのつながりに関して質問があります。
実践編Lesson.13のStep.3「四則演算」の「まとめ」の各コンポーネントの実行される順番は、
入力演算子変数→ 演算実行サブルーチン 1
→ 内部演算子変数 2
内部演算子変数→ 内部演算子変数 4
演算実行サブルーチン → Null判定 3
上から順に実行されるとすると実行される順番は右の数値となりますが、3では演算が実行されており4では左オペランドが設定されています。すなわち3と4とは順番が逆だと思いますが、実際にはどのような計算順で実行されているのでしょうか?その下の
Null判定コンポーネントが左に配置されていて内部演算子変数コンポーネントが2つ右に配置されている部分では、最初に「演算子の右側の数値を設定する」とあります。これはその上の
内部演算子------内部演算子
で「演算子の左側の数値を設定する」となっていて左オペランドがNullでないことが確定しているから上記で「右側」としていると考えて良いのでしょうか?
A4-7:
各コンポーネントの実行される順番ですが、詳しく見ていきますと
@[入力演算子格納変数]−[演算実行サブルーチン]処理を呼び出す
A[演算実行サブルーチン]−[NULL判定]オペランド設定後演算を行う
(内部演算子格納変数がNULLでなかった場合)
B[NULL判定]−[算術演算子コンポーネント]演算子の右側の数値を文字列で設定して数値変換する、演算を行う
C[演算実行サブルーチン]−[入力演算子格納変数]−初期化する
D −[文字列格納変数]−文字列を設定する(イベント発生なし)
E[入力演算子格納変数]−[内部演算子格納変数]演算子を設定する
F[内部演算子格納変数]−[内部演算子格納変数]演算子の左側の数値を文字列で設定して数値変換する
という流れになります。
一つの処理が行われて何かイベントが発生した場合、そのイベントの先に繋がっている処理が続いて実行されるとお考え下さい。(例えば[サブルーチン]の「処理を呼び出す()」が実行されると、[サブルーチン]からアクションイベントが発生します)
「+」や「-」のボタンが押されるたびに、@〜Fが繰り返されます。
連続した計算に於いて最初に「+」や「-」ボタン押した時はNULLですが、2回目以降は[内部演算子格納変数]はNULLではありません。(EとFで演算子と左オペランドが既に設定されている)
従って、右オペランドの設定、演算が行えるということになります。
Q4-8:
ご返答ありがとうございます。大変良くわかりました。
Lesson.13のStep.3「四則演算」の「まとめ」の各コンポーネントの実行順番についてお伺いします。
複数の演算を含む計算の場合、
最初の演算の時
入力演算子格納変数→演算実行サブルーチン(処理を呼び出す)
演算実行サブルーチン→NULL判定(NULLなので)
内部演算子格納変数(初期化する)→文字列格納変数(初期化する)
内部演算子格納変数(このコンポーネントに入力演算子格納変数に保持されている演算子を入力する)→内部演算子格納変数で演算子の右側の数値を設定する
2回目以降の演算の時
入力演算子格納変数→演算実行サブルーチン(処理を呼び出す)
演算実行サブルーチン→NULL判定(NULLではないので)→
内部演算子格納変数で右側の数値を設定して演算する。→
内部演算子格納変数と文字列格納変数を初期化する
以上の順番で宜しいでしょうか?最初の演算の時、内部演算子格納変数を初期化した直後に入力演算子格納変数のデータを内部演算子格納変数に写しますが、このときの初期化は必要なのでしょうか?また、連続計算時の入力演算子格納変数の役割が良くわからないのですが。
A4-8:
最初の演算の時
一番最後の処理は[内部演算子格納変数]で「演算子の右側の数値を設定する」ではなく「演算子の左側の数値を文字列で設定して演算を行う」です。
[内部演算子格納変数]のデータ設定イベントに繋がっている処理です。
2回目以降の演算の時は
お書き頂いた最後の「内部演算子格納変数と文字列格納変数を初期化する」の後に、[内部演算子格納変数]に演算子を設定する(このコンポーネントに入力演算子格納変数に保持されている演算子を入力する)→[内部演算子格納変数]の演算子の左側の数値を文字列で設定して演算を行う、の処理が行われます。
> 内部演算子格納変数を初期化した直後に入力演算子格納変数のデータを内部演算子格納変数に写しますが、このときの初期化は必要なのでしょうか?また、連続計算時の入力演算子格納変数の役割が良くわからないのですが、
変数に演算子が設定されても、左右のオペランドの値もまだ残っていますし、「=」を押した時には「演算子を設定する」の処理は行われません。
ここで初期化しないと、「=」ボタンを続けて押してしまった時には、最後に行った演算が繰り返し行われてしまいます。
(右側に接続されたコンポーネントの上で、[イベント番号設定]>[起動しない]とすると、その処理は実行されません。[内部演算子格納変数]の「初期化する」の処理を「起動しない」に設定して、お試し下さい。)
[内部演算子格納変数]では一つ前に押された演算子を使って、演算を実行しています。一方[入力演算子格納変数]は直前に押された演算子が格納されていますが、この演算子はすぐに使われる訳ではなく、[内部演算子格納変数]で演算が実行された後に、次の演算に備えるため[内部演算子格納変数]に設定されます。
「2+3-4=」の計算を考えて見ますと
@最初に「2」「+」が押される→(演算は行われない)→「+」は[内部演算子格納変数]に設定される
A次に「3」「−」が押される→「+」を使った計算が行われる(2+3)→「−」は[内部演算子格納変数]に設定される
B「4」「=」が押される→「−」を使った計算が行われる(5−4)
となります。
一連の計算処理で、記憶しておく必要がある演算子は2つあるので、2つの[算術演算子格納変数]を使っているとお考え下さい。
Q4-9:
ご返答ありがとうございました。大変良くわかりました。
Lesson.13のStep.3「四則演算」の「まとめ」において、未だ不明な部分がありますのでお伺い致します。
演算実行サブルーチンにつながっている内部演算子格納変数の初期化は、一番最初の演算では不要なのではないのでしょうか?2番目以降の演算では必要なのはわかります。しかし、最初の演算では、初期化の直後に、入力演算子格納変数に保持されている演算子を内部演算子格納変数に上書きするので、一番最初の演算のときの初期化は不要であると思います。
また、演算子格納変数の初期化や文字列格納変数の初期化では、実際にはどんな値がそれらの変数に与えられるのでしょうか?
プログラムの実行順についてお伺いします。
A-B
-C
-D
B-E
E-F
上のCとDはAにつながっているとします。この場合実行される順番は、B, E, F, C, D だと思いますがこれで正しいでしょうか?
A4-9:
プログラムの実行順ですが、
> A-B
> -C
> -D
> B-E
> E-F
の時、B, E, F, C, Dとなる場合もありますし、ならない可能性もあります。
「A-B」の処理が、「B」からイベントが発生する要件となる場合、「B」の発生イベントの先に「E」が繋がっていれば、B、Eの順になります。
但し、「A-B」の処理がイベントの発生しないものであったり、「B」の先に設定されているイベントとは違う種類のイベントしか発生しない場合には、Eは実行されません。この場合はB、Cの順になります。
例えば[テーブル]のデータを変更すると「データ更新イベント」が発生しますが、[テーブル]から間違って「データ設定イベント」を出して、その先にコンポーネントを接続しても、処理は行われません。
先にお問い合わせ頂いた変数についてですが、ご指摘の通り実行直後には[算術演算子格納変数]初期化の処理は必要ないかと存じます。
ただし、[文字列格納変数]の方は「0」を設定しておくことが必要です。
2つの「初期化」を一緒に書いておく方が処理を把握しやすいという利点もあり、初期化を複数回行っても問題はないので、このような処理になっていると御理解下さい。
[算術演算子格納変数]の場合には初期化されると、演算子のデータは空(NULL)になります。
[文字列格納変数]は「初期化する」というメソッドはありませんが、ビルダーを一旦終了して、再びファイルをロードした時には最初「空文字」が設定されます。
Q4-10:
返答ありがとうございます。
> プログラムの実行順ですが、
>> A-B
>> -C
>> -D
>> B-E
>> E-F
> の時、B, E, F, C, Dとなる場合もありますし、ならない可能性もあります。
>
> 「A-B」の処理が、「B」からイベントが発生する要件となる場合、「B」の発生イベントの先に「E」が繋がっていれば、B、Eの順になります。
>
> 但し、「A-B」の処理がイベントの発生しないものであったり、「B」の先に設定されているイベントとは違う種類のイベントしか発生しない場合には、Eは実行されません。この場合はB、Cの順になります。
上記の「違う種類のイベント」とは、何のイベントと何のイベントを比較しているのでしょうか?同じ種類のイベントであれば連続して実行されるのでしょうか?
> 例えば[テーブル]のデータを変更すると「データ更新イベント」が発生しますが、[テーブル]から間違って「データ設定イベント」を出して、その先にコンポーネントを接続しても、処理は行われません。
上記の説明は、更にその上の説明とつながっていますが、何故その処理がおこなわれないのかわかりません。
> [算術演算子格納変数]の場合には初期化されると、演算子のデータは空(NULL)になります。
初期化される前がNullであると思っていました。初期化する理由は、その変数が、Nullである場合に演算ができずエラーが出るためであると思っていました。
この考え方は間違っているのでしょうか?
私が考えている各コンポーネントの実行順が正しいのかをお伺いするためにファイルをお送りしました。順番付けで迷ったのはDとFのどちらが先か、です。関連ファイル「電卓.pdf」で正しいのでしょうか?
関連ファイル:電卓.pdf
A4-10:
プログラムの実行順についてはご連絡頂いたPDFに記されている@〜Fの順で結構です。[サブルーチン]に繋がる処理が終わってから、「演算子を設定する」の処理が行われるということになります。
> 「違う種類のイベント」とは、何のイベントと何のイベントを比較しているのでしょうか?同じ種類のイベントであれば連続して実行されるのでしょうか?
左側コンポーネントを右クリックして、[イベント処理追加]で設定できるイベントの種類は予め定義されています。イベント処理が複数設定できるコンポーネントもあれば、全く設定できない(イベントが出てこない)コンポーネントもあります。
イベントの先に右側コンポーネントの処理(起動メソッド処理)を追加すれば一つの接続処理が完成する訳ですが、自分が意図したタイミングでメソッドが実行されるよう、イベントを選ぶ必要があります。
例えば「アプリケーション開始イベント」に通常[フレーム]「フレームを表示する」の処理を繋ぎますが、これを間違って「アプリケーション終了イベント」に繋いでしまうと、いくら実行ボタンを押しても画面(=フレーム)が現れません。
A-B、B-Eの例で考えると[B]のメソッドが実行された時、次にB-Eの処理が行われるためには、[B] でのメソッド実行→[B]からイベント発生と繋がるように設定をする必要があります。
[テーブル]コンポーネントを例に取ると、「メソッド:テーブルデータを設定する(PFObjectTable)」が実行されると、データ設定イベントが発生します。
「メソッド:列を追加する」等、テーブルの内容が変更されるメソッドを実行すると、データ更新イベントが発生します。
A-Bの「−B」でメソッドが「列を追加する」となっていて、B-Eの「B−」のイベントは「データ設定」イベントだった場合は、連続して実行されません。
初期化をするのはLesson.13電卓の場合、むしろ設定されている数字を残して置かないように右オペランド、左オペランドごと一旦NULLにしてしまう目的で行っています。
[NULL判定]の先の処理にはイベント番号が付いていて、NULLで無い時以外行われないようになっているので、NULLであった場合でもエラーになることはありません。
備考:「アプリケーション開発チュートリアル(基礎編)」の「Q&A1」からの続き。