Q8-1:p134で「アクションイベント」になっていますが、演算子を設定するので「データ設定イベント」ではいけないのでしょうか?データ=演算子と伺ったことがあるのですが。
A8-1:
サブルーチンにつきましては、
メソッド:処理を呼び出す[call()]
を実行した際にはアクションイベントが発生します。
データ設定イベントを含むその他のイベントは
メソッド:イベントを渡して処理を呼び出す[call(PFEvent)]
にイベントを引数に設定して実行した場合に同一のイベントが発生します。
今回の場合、複合コンポーネントの公開メソッドとしてメソッド名は変更しておりますが、前者のメソッドを実行しておりますため、アクションイベントである必要がございます。
Q8-2:
以前に下記の質問に対しまして下記の返答をして頂きましたが、良くわかりませんでした。メソッドでは「演算子を設定する」になっているのでアクションイベントではなくデータ設定イベントではないのでしょうか?下記の答えの「その他のイベント」にはアクションイベントは含まれるのでしょうか?また下記の「同一のイベント」とは何を指しているのでしょうか?
A8-2:
イベントは、アプリケーションビルダー編集画面右側の、接続先コンポーネントの処理が実行されたり、何か画面上で操作をしたりといった「きっかけの後」発生します。
「データ設定イベント」は[算術演算子格納変数]の「演算子を設定する」の処理が行われた後、[算術演算子格納変数]から発生します。
[サブルーチン]のアクションイベントは、これ以前に発生し、[算術演算子格納変数]のイベントとは直接関係ないとお考え下さい。
P134の[サブルーチン]のアクションイベントは上位の階層で「+」や「-」ボタンを押した時に[サブルーチン]の[処理を呼び出す()」の処理が行われた時、発生しています。
(メソッド名は同じ種類のコンポーネントを複数使った場合、全部同じ名前になってしまうので、「公開メソッド名の変更」で「+押下処理を呼び出す」など少しずつ変えてあります)
@実行画面(電卓)上で「+ボタン」を押す→[+ボタン]アクションイベント発生
→
A[複合コンポーネント電卓モデル]「+押下処理を呼び出す」が実行される
→[+押し下げサブルーチン]アクションイベント発生→
B[入力演算子格納変数]データ設定イベント発生→
その先の処理に続く
という処理の流れになります。
Q8-3:
接続元コンポーネントと発生イベントと接続先コンポーネントの3つの関係についてお伺い致します。接続元コンポーネントがどのようなイベントをおこなうかは、発生イベントで指定し、接続先コンポーネントはこれら前者2つとはまったく関係がない、と考えて宜しいのでしょうか?
A8-3:
例えば[ボタン]コンポーネントを例に考えると[ボタン]には「アクションイベント」など3種類の「イベント処理」を設定できるようになっています。
イベントが発生する条件は決まっており、詳しくは『コンポーネントリファレンス』の各コンポーネントの項に書いてあります。
[ボタン]コンポーネントには「ボタンを押した時」の条件で発生する「アクションイベント」を[イベント処理追加]で設定することが多いかと思います。
これは「ボタンを押したら」、「アクションイベント」に接続する右側のコンポーネントの処理を行うという設定になります。
実は[ボタン]の「アクションイベント」以外の「マウスボタンイベント」や「マウスモーションイベント」も、アプリケーション実行時マウスをボタン上で操作すると発生しています。
ただ、マウスのイベントに処理を設定していない場合には、何か処理が行われることは一切ありませんので、アプリケーション実行上、何ら影響もないということになります。
アプリケーション設計の際には、右側接続先コンポーネントの処理をどのタイミングで行いたいかということを考え、左側の接続元コンポーネント及びイベントを選択します。
Q8-4:
接続元コンポーネントと発生イベントと接続先コンポーネントの3つの関係についてお伺いしまして、それについてお答え頂きましたが、それらの一般的な関係の概要がいまいちイメージできませんでしたので再度お伺い致します。上記の3つの一般的な関係はアプリケーションを作成する上で極めて重要となると思います。それらの関係ををお教え下さい。発生イベントの主体が接続元コンポーネントで接続先コンポーネントは、それを起動させたいタイミングだけを考慮して接続させれば宜しいのでしょうか?
A8-4:
> 発生イベントの主体が接続元コンポーネントで接続先コンポーネントは、それを起動させたいタイミングだけを考慮して接続させれば宜しいのでしょうか?
概ねそのようにご理解頂いて結構です。
一つの処理の結果を別の処理で使いたい時(例:計算の結果をフィールドに表示する)などは処理の順番を考慮する必要があります。
Q8-5:
実践編p134の接続元と接続先の各コンポーネントと発生イベントの関係についてお伺致します。
接続元は発生イベントの主体であって発生イベントは接続元の動作を表すと伺いました。また、接続先は接続元や発生イベントとは関係なく、作成した全体のアプリケーションの中での動作の流れのタイミングのみを考慮して発生イベントにつなげるべきだと伺いました。これを基にp134を考えてみますと
接続元:サブルーチン
発生イベント:アクションイベント
接続先:入力演算子格納変数
四則演算の4つのサブルーチンは名前のみ「+押し下げ処理」などと変更しましたが、それ以外は、4つのサブーチンは全く同じものです。同じ4つのサブーチンが、異なる4つの演算処理にどのように作用するのでしょうか?
このページの、
接続元:サブルーチン
発生イベント:アクションイベント
接続先:入力演算子格納変数
の3つの関係はどうなっているのでしょうか?
p.143
複数のコンポーネントを一回で削除するには、どのような方法があるのでしょうか?「シフト押しながら選択して削除」この方法以外の方法がありましたら、お教え下さいますようお願い申し上げます。
A8-5:
4つのサブルーチンは、電卓画面上の「+」や「-」のボタンに一対一で対応しています。「+」ボタンを押した時と、「-」ボタンと押した時ではそれぞれ別の[サブルーチン]でアクションイベントが発生します。
4つの[サブルーチン]のアクションイベント先には、全て[算術演算子格納変数]コンポーネントの「演算子を設定する」の処理が接続していますが、引数に違いがあります。
「取得方法:コンポーネント」で「コンポーネント」欄はそれぞれ、[加算]、[減算]、[乗算]、[除算]と変えてあります。
@「+」ボタンを押した時→「+押下処理を呼び出す」→
A[+押し下げサブルーチン]アクションイベント発生→
B[算術演算子格納変数]「演算子を設定する」
(引数のコンポーネント欄は[加算])
となります。
複数のコンポーネントを一括で削除する方法ですが、現在のところ、Shiftキーで複数選択する以外の方法はございません。
Q8-6:
実践編p.134についてのご説明を頂きましたが、はっきりとしないことがありますので確認いたします。
>4つのサブルーチンは、電卓画面上の「+」や「-」のボタンに一対一で対応しています。「+」ボタンを押した時と、「-」ボタンと押した時ではそれぞれ別の[サブルーチン]でアクションイベントが発生します。
上記のご説明で「「+」や「-」のボタン」と言われているのは、複合コンポーネント 内でなくて、上層での「「+」や「-」のボタン」という意味でしょうか?私は、過去にFortranでプログラムを作成したことがありますが、その時のサブルーチンは各サブルーチンが異なっており、それぞれ異なる動作をしていました。しかし、MZのサブルーチンのコンポーネントは、名前だけ異なっていてますが、実体は他の多数のサブルーチンと同じだと思いますが正しいでしょうか?というのは、接続元と接続先のコンポーネントは特別な関係はないとのことでしたので。
接続元であるサブルーチンのコンポーネントは接続先とは全体のアプリケーションの中での実行するタイミング以外は無関係ということでしたので。
A8-6:
Fortranでの「call subrutine」に当たるMZPlatformの[サブルーチン]のメソッドは「処理を呼び出す()」です。Lesson13では4つの[押下げサブルーチン]を複合コンポーネント内に入れていて、複合コンポーネント内では公開メソッド名を変更できるので、4つそれぞれ違う名前に変えています。
「+」ボタンを押した時と「-」ボタンとでは別の[サブルーチン]が「call」されています。
Fortranではsubrutineが「call」されても「return」までの間に何も処理が書いてなければ、何も起こらず、そのまま主プログラムに戻って来るかと思います。
これはMZPlatformでは[サブルーチン]の右側に何も接続されていないという場合に相当します。
Fortranでのsubrutineに何か処理を書くことは、MZPlatformでは右側にコンポーネントを接続して、メソッドや引数を設定することに当たります。
複合コンポーネント内の4つの「押下げサブルーチン]の右側接続処理には、使用するコンポーネントとメソッド名は同じですが、それぞれ引数の違うものが設定してあります。
Fortranで考えると4つのsubrutine内には少しずつ違った処理が書いてあるということになります。
Q8-7:
以前、連結させた接続元コンポーネントと発生イベントと接続先イベントの3つの関係を伺ったところ、発生イベントの動作の主体は接続元コンポーネントであり、それらは、すなわち、主語と述語の関係にあると、ご説明がありました。一方、接続先イベントは、アプリケーションの中での実行のタイミングに合わせて発生イベントに連結させるものであり接続元コンポーネントとは関係ないものとして考えて扱って下さいという趣旨の回答を送ってもらいました。この回答と下記の回答は異なっています。
もう一度、接続元コンポーネントと発生イベントと接続先イベントの3つの関係を教えて下さい。それらの関係の概要を教えて下さい。
A8-7:
[サブルーチン]の「処理を呼び出す()」が行われると「アクションイベント」が発生します。また「イベントを渡して処理を呼び出す(PFEvent)」が行われると、この時引数として設定したイベントが発生します。
Lesson13に於いては「+」、「-」、「×」、「÷」の4種のボタンを押した時、4つの[押下げサブルーチン]のうちの一つからアクションイベントが発生します。
つまり「+」ボタンを押したら、「+押下げサブルーチン]のアクションイベントが発生することになるので、「+」ボタンを押した時何か処理を行いたい場合は、このアクションイベントに接続をすることになります。
>MZのサブルーチンのコンポーネントは、名前だけ異なっていてますが、実体は他の多数のサブルーチンと同じだと思いますが正しいでしょうか?
というご質問の意味が『[サブルーチン]は4つ必要ではなく、一つだけで良いのではないか』ということでしたら、Lesson13では4つの[押下げサブルーチン]のアクションイベントに接続されている右側の処理は引数が全て異なっていますので、一つに纏めることは難しくなります。
以前のご質問の際、「左側コンポーネントのどのイベントを発生させるかは、右側のコンポーネントの処理内容によって決める」とお考えになっていらっしゃるかと考え、回答致しました。
左側コンポーネントからイベントが発生する条件は、任意には設定できません。
予め各コンポーネントによってイベント発生条件は決まっています。
[サブルーチン]の場合も「処理を呼び出す()」の処理が行われた時に、アクションイベントが発生すると決まっています。
発生しないイベントに接続した場合や、アプリケーション実行中「処理を呼び出す()」が行われなかった場合には、右側に接続したコンポーネントの処理は行われません。
従って右側のコンポーネントは「適切なイベント(=タイミング)に接続する」ことが必要という回答になります。
Q8-9:
接続元コンポーネントと発生イベントと接続先コンポーネントの関係について詳細にお答え頂きまして誠に有難うございました。下記のお答えをまとめますと「発生イベントを実行する主体は接続元コンポーネントである。その実行された発生イベントを受けて、そのイベントに関連した更なる処理をおこなうのが、接続先コンポーネントと考えて良いのでしょうか?接続元コンポーネントと接続先コンポーネントはいずれも処理を実行する主体となるが、それらの関係は主−従と考えて良いのでしょうか?」
A8-9:
> 下記のお答えをまとめますと、「発生イベントを実行する主体は接続元コンポーネントである。
「発生イベントを実行する主体は接続元コンポーネント」という言葉が、「接続元コンポーネントがイベントを発生する」という意味であれば、そのご理解で間違いございません。
> その実行された発生イベントを受けて、そのイベントに関連した更なる処理をおこなうのが、接続先コンポーネントと考えて良いのでしょうか?
「実行された発生イベント」という言葉が、「接続元が発生したイベント」という意味であれば、「実行された発生イベントを受けて、更なる処理を行うのが接続先コンポーネント」というご理解で間違いありません。
「そのイベントに関連した」という言葉の意味が不明ですが、例えば、「データ設定イベントに接続する場合には、『〜を設定する』という種類の処理を行う」という意味であるならば、それは誤解です。発生イベントは、接続先コンポーネントが処理を実行するためのきっかけに過ぎず、実行される処理の種類を制限あるいは特定するものではありません。
> 接続元コンポーネントと接続先コンポーネントはいずれも処理を実行する主体となるが、それらの関係は主−従と考えて良いのでしょうか?」
「主ー従という関係」が、「処理の実行のきっかけとなるものが『主』で、そこから連鎖的に起動されるものが『従』」という意味であるならば、接続元コンポーネントと接続先コンポーネントの関係につきましては、そのご理解で間違いありません。
「処理を実行する主体」をどのようにお考えなのかが不明ですが、処理実行のきっかけを作ることも「処理を実行する」の内容に含めてお考えなのであれば、「接続元コンポーネントと接続先コンポーネントはいずれも処理を実行する主体となる」という理解で間違いありません。
上述の回答でも申し上げました通り、接続元コンポーネントの役割は処理のきっかけを作ることで、具体的な処理は接続先コンポーネントが行います。
Q8-10:
「接続元コンポーネント」と「発生イベント」と「接続先コンポーネント」の関係について大体わかりました。ただ、お答え頂いた文章に中に「きっかけ」という捉えどころのない言葉がありまして、未だ明確には理解できていない状態です。「きっかけ」というのは、「きっかけ」のそれ以上でもそれ以下でもないという意味でしょうか?すなわち、接続元のコンポーネントが出力したデータやイベントなどの情報を接続先は全く引用しないと考えても宜しいのでしょうか?すなわち、接続元から接続先へとデータの伝達はなく、両者の関係は、単に実行のタイミングのみによって決まる。
A8-10:
基本的には、イベントは「きっかけ」以上でも以下でもありません。ただし、イベント自体は内部にデータを持っており、接続先コンポーネントは、処理の実行に際してそれらを利用することもできます。しかしながら、これは、イベントが持つデータの利用や受け渡しを強制するものではありません。
すなわち、「接続元から接続先へのデータの伝達」は、接続先コンポーネントが実行する処理に必要あるいは有用なデータのみについて行うように、アプリケーションを作り上げるということです。これらのデータは、通常、接続先コンポーネントが実行するメソッドの引数として受け渡します。
備考:「一般的な質問」の「Q&A60」に一部掲載。