Q13:Lesson10 ジャグリング複合コンポーネント&イメージビューアリストGUI複合コンポーネントについて、複合コンポーネントの中身が正直サッパリわかりません。
Q13-1:
題名の複合コンポーネントの中身が正直サッパリわかりません。
GUI複合コンポーネントである、イメージビューアリストにおいてはスクロールパネルをファンクションに接続していますが、画面編集で見ても4つのイメージビューアが並んでいるだけで何がしたいのか悩ましいです。<質問@>
ジャグリング複合コンポーネントにおいては、ファンクションからまず最初に繋がれている「Null」と次に繋がれている「=」の役目の違いが分かりません。
Nullはリスト格納変数の中身のリストをオペランドに設定後、Nullかどうかチェックし、Nullの時にtrueを返し、空のリストを設定していると思います(考え方合っているでしょうか?<質問A>)
次の「=」も左オペランドにリスト格納変数の戻り値を設定していますが、この時のメソッドが「リストが空かどうか判定する」となっているのは何がしたいのか不明です。<質問B>
そして、とりあえず両方とも初期化をしていると思いますが、Nullと空って何が違うのでしょうか?Null=空だと思っていましたが、違うのでしょうか?<質問C>
A13-1:
> GUI複合コンポーネントである、イメージビューアリストにおいてはスクロールパネルをファンクションに接続していますが、画面編集で見ても4つのイメージビューアが並んでいるだけで何がしたいのか悩ましいです。<質問@>
「イメージビューワーのリスト」複合コンポーネントの役割は、イメージビューワーコンポーネントのリストをアプリケーションとして保存し、それを上位階層から取得できるようにすることです。
すでにご覧になった「住所録」複合コンポーネントは、テーブルコンポーネントを利用してテーブルデータを保存していました。また、「フォルダ管理」複合コンポーネントでは、テキストフィールドコンポーネントを利用してテキストデータを保存していました。
「イメージビューワーのリスト」複合コンポーネントは、まず、アニメーション用のそれぞれの絵を保存するためにイメージビューワーコンポーネントを使っています。さらに、それらの4つの絵をリストとして扱えるようするためにイメージビューワーコンポーネントをスクロールパネルコンポーネントに配置しています。
このイメージビューワーコンポーネントのリストは、上位階層から「イメージビューワーのリストを取得する()」メソッドを実行することで取得できます。
リストデータを保存するというとリストコンポーネントが思い当たりますが、あいにくリストコンポーネントで保存できるのは文字列のリストのみですので、ここではスクロールパネルを使用しています。
> ジャグリング複合コンポーネントにおいては、ファンクションからまず最初に繋がれている「Null」と次に繋がれている「=」の役目の違いが分かりません。
> Nullはリスト格納変数の中身のリストをオペランドに設定後、Nullかどうかチェックし、Nullの時にtrueを返し、空のリストを設定していると思います(考え方合っているでしょうか?<質問A>)
その考え方で間違いございません。
> 次の「=」も左オペランドにリスト格納変数の戻り値を設定していますがこの時のメソッドが「リストが空かどうか判定する」となっているのは何がしたいのか不明です。<質問B>
ここでやりたいことは、リスト格納変数に「イメージビューワーのリスト」複合コンポーネントから取得した、イメージビューワーのリストを設定することです。リストが空の場合には、まだイメージビューワーのリストが設定されていないということですので、イメージビューワーのリストを設定するという処理を行います。
> そして、とりあえず両方とも初期化をしていると思いますがNullと空って何が違うのでしょうか?Null=空だと思っていましたが、違うのでしょうか?<質問C>
リストは任意個数の要素を収納できる「箱」のようなものだとお考えください。
「Null」は箱がない状態、「空」は箱はあるものの中身がない状態を指します。
ここでの初期化処理は2段階になっており、
(1) リストがNullの場合には空のリストを用意(箱がないときは空箱を用意)
(2) リストが空の場合にはイメージビューワーのリスト設定(箱が空のときは中身を詰める)
という処理を行っています。
Q13-2:
ジャグリング複合コンポーネントのファンクションから接続されている2行目になるのですが、等価演算に繋いだ後に、まず論理変換を行っています。これの意味が良く分からないのですが、どういった処理なのでしょうか?
Null判定コンポーネントにて空のリストという箱を設定した後に、等価演算にてリストの中身が空かどうかをメソッドで判定しています。この戻り値ってtrueとかfalseという理解で良いのか、さらにリストの中身が空だった場合はtrueを返し、それが文字列だから論理値に変換してるという流れでしょうか?<質問@>
そもそも論理値というものがイマイチ理解しにくいのですが、論理値っていったい何なんでしょうか?<質問A>
さらに進み、左の等価演算(ID-4-7)から接続しているコンポーネントの処理ですが、全てイベント番号の1が付与されています。等価演算のイベント番号1は左右のオペランドが=の時にtrueを返すということだと思いますが、ここでは必要なのでしょうか?
イベント番号を付けるコンポーネントと付けないコンポーネントとの違いが良く分からないのですが。
ひとつ上のNullでもファンクションから繋がれているNull判定コンポーネントの所ではなくて、Nullだった時に左のNull判定から接続されているところからのコンポーネントにイベント番号1が付与されています。なんとなくイベント番号をつけるタイミングがずれている気がするのですがどういうことなのでしょうか?<質問B>
A13-2:
> ジャグリング複合コンポーネントのファンクションから接続されている2行目になるのですが、等価演算に繋いだ後に、まず論理変換を行っています。
> これの意味が良く分からないのですが、どういった処理なのでしょうか?
>
> Null判定コンポーネントにて空のリストという箱を設定した後に、等価演算にてリストの中身が空かどうかをメソッドで判定しています。この戻り値ってtrueとかfalseという理解で良いのか、さらにリストの中身が空だった場合はtrueを返し、それが文字列だから論理値に変換してるという流れでしょうか?<質問@>
ご指摘の通り、リスト格納変数の「リストが空かどうか判定する()」メソッドの戻り値はtrueあるいはfalseで、空の場合にはtrueが戻り値となります。この戻り値はtrueあるいはfalseを表すデータであり、アルファベットからなる文字列ではありません。文字列なのは固定値として記入されている"true"で、「文字列だから論理値に変換」する必要があるのはこちらです。「論理値変換/左右オペランド設定後、演算を行う(String,String)」メソッドでは、元々論理値で変換の必要がない場合には、変換処理は行われません。
> そもそも論理値というものがイマイチ理解しにくいのですが論理値っていったい何なんでしょうか? <質問A>
論理値は真偽値とも言い、真か偽かを表現するデータです。IT用語辞典では、以下のように説明されています。
「論理学で、ある命題が真(true)であるか偽(false)であるかを示す値のこと。転じて、論理回路やプログラミング言語において、条件式などが真であるか偽であるかを表す値やデータ型のこと。ブール値やブール型(ブーリアン型)とも言う。真偽をデジタル信号のオンとオフや数値の0と1に対応させて表現する場合もある。」
> さらに進み、左の等価演算(ID-4-7)から接続しているコンポーネントの処理ですが全てイベント番号の1が付与されています。
等価演算のイベント番号1は左右のオペランドが=の時にtrueを返すということだと思いますが、ここでは必要なのでしょうか?
> イベント番号を付けるコンポーネントと付けないコンポーネントとの違いが良く分からないのですが。
> ひとつ上のNullでもファンクションから繋がれているNull判定コンポーネントの所ではなくて、Nullだった時に左のNull判定から接続されているところからのコンポーネントにイベント番号1が付与されています。
なんとなくイベント番号をつけるタイミングがずれている気がするのですがどういうことなのでしょうか?<質問B>
イベント番号について誤解されているようです。イベント番号は、プログラム上でユーザーが付与するものではなく、コンポーネントの仕様によってあらかじめ決まっているものです。そして、起動メソッドに対してイベント番号を「1」と指定することは、「イベント番号が1のときにのみ、そのメソッドを実行する」ことを意味します。
等価演算コンポーネントは、演算結果がtrueだった場合には番号1、演算結果がfalseだった場合には番号が0の処理完了イベントを発生します。
等価演算(ID:4-7)の場合は、リストが空のとき、すなわち演算結果がtrueのときにのみリストのデータを設定したいわけですから、接続先の処理にイベント番号1を指定します。仮に、ここでイベント番号を指定しなかった場合、イベント番号が0のとき(リストが空でないとき)にもリストのデータの設定とカウンタの初期化が実行されることになります。
イベント番号は付けるものではなく、あらかじめ決まっているものの中から指定するものです。そして指定する根拠は、その番号のイベントがどのような条件のときに発生するものなのか、そして、その条件のときに行いたい処理(起動したいメソッド)は何であるのか、ということになります。すべての場合において行いたい処理が同じであるならば、イベント番号を指定する必要はありません。
Null判定コンポーネントも同様で、このコンポーネントはオペランドがNullのときに番号1、Nullではないときに番号0の処理完了イベントを発生します。リスト格納変数に空のリストを設定するのはリスト格納変数の中身がNullのときのみですので、イベント番号1を指定しています。
Q13-3:
イメージビューワー複合コンポーネントで使用しているgetComponentListについて質問させて下さい。
これは全メソッドからしか選択できないと思いますが、普通に考えるとスクロールパネルまで含めた全コンポーネントを取得しているのかな、と思ったのですが、スクロールパネルに、各イメージビューワを配置するのに使っているはずです。取得するコンポーネントとしないコンポーネントの違いは何なのでしょうか?<質問@>
また、ジャグリング複合コンポーネント内のファンクションから接続されているコンポーネントの3つ目以降についてですが、カウンタとして使用している加算コンポーネントが出てきます。
最初はカウンタの左右オペランドを共に0に設定し、その後、リストの要素数と比較をしているかと思います。リストの要素数は初期は4、加算コンポーネントの初期は0で良いのでしょうか?
その後、リストの要素数は変化せず、加算コンポーネントはタイマーで100msずつ呼び出され、その都度1加算され、4まで増えたら、また加算の左右のオペランドを0にするといった流れで良いでしょうか?<質問A>
上記流れに関わる部分でコンポーネント格納変数に接続している部分があると思いますが、コンポーネント格納変数が何をしているか微妙にわかりません。
リスト格納変数内のイメージビューワーをカウンタの数値の位置のものを取得したあと、それをコンポーネント格納変数に入れて設定しているとは思いますが、その時のメソッド処理結果がやはり意味が分かりづらいです。
リスト格納変数で要素を位置指定で取得したものがメソッド処理結果であり、それをコンポーネント格納変数の中に設定していると思いますが、これをメソッド戻り値でやるにはどのように設定したら良いでしょうか?
「メソッド戻り値にして、リスト格納変数から選択中の要素を取得する」と抜け出せなくなってしまいます。<質問B>
(そもそもメソッド処理結果についてはどのコンポーネントがメソッド処理結果を吐き出すのか、そして吐き出さない時との違いは何なのかがサッパリわかりません。<質問C>)
A13-3:
> イメージビューワー複合コンポーネントで使用しているgetComponentListについて質問させて下さい。
>
> これは全メソッドからしか選択できないと思いますが普通に考えるとスクロールパネルまで含めた全コンポーネントを取得しているのかな、と思ったのですが、スクロールパネルに各イメージビューワを配置するのに使っているはずです。取得するコンポーネントとしないコンポーネントの違いは何なのでしょうか?<質問@>
スクロールパネルコンポーネントの「getComponentList()」メソッドは、スクロールパネルに含まれているすべてのコンポーネントのリストを取得するものです。したがって、このリストには、スクロールパネルに配置されているイメージビューワコンポーネントのみが含まれます。
なお、「全メソッド対象」は、日本語化されていないものも含めた、そのコンポーネントのすべてのメソッド、という意味です。他のコンポーネントやその階層、あるいはMZ Platform本体のもつすべてのメソッド、という意味ではありません。
> また、ジャグリング複合コンポーネント内のファンクションから接続されているコンポーネントの3つ目以降についてですが、カウンタとして使用している加算コンポーネントが出てきます。
> 最初はカウンタの左右オペランドを共に0に設定し、その後リストの要素数と比較をしているかと思います。リストの要素数は初期は4、加算コンポーネントの初期は0で良いのでしょうか?
> その後、リストの要素数は変化せず、加算コンポーネントはタイマーで100msずつ呼び出され、その都度1加算され、4まで増えたら、また加算の左右のオペランドを0にするといった流れで良いでしょうか?<質問A>
その理解で間違いありません。
> 上記流れに関わる部分でコンポーネント格納変数に接続している部分があると思いますが、コンポーネント格納変数が何をしているか微妙にわかりません。
> リスト格納変数内のイメージビューワーをカウンタの数値の位置のものを取得したあと、それをコンポーネント格納変数に入れて設定しているとは思いますが、その時のメソッド処理結果がやはり意味が分かりづらいです。
> リスト格納変数で要素を位置指定で取得したものがメソッド処理結果であり、それをコンポーネント格納変数の中に設定していると思いますが、これをメソッド戻り値でやるにはどのように設定したら良いでしょうか?
> 「メソッド戻り値にして、リスト格納変数から選択中の要素を取得する」と抜け出せなくなってしまいます。<質問B>
メソッド戻り値で行うには、以下の変更を行います。
(1) 4行目の「要素を位置指定で取得する(int)」を「選択位置を設定する(int)」に変更。
(2) 5行目の「コンポーネントを設定する(イベント発生なし)(PFComponent)」の引数を以下のように変更。
取得方法: メソッド戻り値
コンポーネント: リスト格納変数[ID:4-3]
メソッド/値: 選択中の要素を取得する
> (そもそもメソッド処理結果についてはどのコンポーネントがメソッド処理結果を吐き出すのか、そして吐き出さない時との違いは何なのかがサッパリわかりません。<質問C>)
戻り値がある場合にはメソッド処理結果が出力され、戻り値がない場合には出力されません。これはコンポーネントによる違いではなく、起動するメソッドの違いによります。例えば、同じリスト格納変数コンポーネントでも、「要素を位置指定で取得する(int)」の場合にはメソッド処理結果が出力されますが、「選択位置を設定する(int)」の場合には出力されません。
選択可能なメソッド処理結果は、起動メソッド情報ダイアログで取得方法を「メソッド処理結果」とし、「メソッド/値」欄をクリックしたときに表示されるダイアログ(メソッド処理結果選択ダイアログ)に一覧表示されます。ここには、同じイベントに接続されたメソッドのうち、それよりも前に実行されるメソッドで戻り値を持つものが示されます。そして、ユーザーは、引数として利用したいものをその中から選択します。
引数の指定方法としてはメソッド戻り値の方が分かりやすいとお考えのようですが、メソッド戻り値には引数を持たないメソッドしか指定できないという制限があります。
例えば、テーブルコンポーネントのセルの値を引数として使用したい場合には、行番号と列番号を指定しなければなりませんので、これを直接メソッド戻り値として与えることはできません。そこで、あらかじめテーブルコンポーネントの「指定セルの値を取得する(int,int)」を実行しておいて、その戻り値をメソッド処理結果として利用することになります。
Q13-4:
色々なご回答ありがとうございました。
また別の質問になるのですが、以前リストコンポーネントは文字列しか保存できないと教えて頂きましたが、等価演算(ID:8)やファンクションの4行目から繋がれているリスト格納変数はイメージビューワーを保存できるという理解で良いのでしょうか?<質問@>
それとも要素の位置情報だけを文字列か何かで判断しているのでしょうか?
・・・でもそうするとイメージビューワーを持ってこられないですよね。
あと、ファンクションから繋がれている6行目のコンポーネント格納変数と8行目のコンポーネント格納変数ですが、突然起動メソッドを設定し、そして実行しています。
あとやらなければならないことは最上位の階層に、取得したイメージビューワーを公開するための処理だと思うのですが、コンポーネント格納変数のやりたいことを教えて下さい。
とりあえず、見る限りではgetImageという固定の名前で起動メソッドを設定し、(カウンタを1増やし)、コンポーネント格納変数の起動メソッドを実行しているだけだと思うのですが、なぜこのやり方でイメージの公開が出来るのでしょうか・・<質問A>
A13-4:
> また別の質問になるのですが、以前リストコンポーネントは文字列しか保存できないと教えて頂きましたが、等価演算(ID:8)やファンクションの4行目から繋がれているリスト格納変数はイメージビューワーを保存できるという理解で良いのでしょうか?<質問@>
名前が紛らわしいのですが、リストコンポーネント(画面構成部品>リスト)は画面上に配置できるコンポーネントで、これには文字列の項目しか保持できません。プログラム上の名称(クラス名)は、PFListです。
一方、リスト格納変数で扱っているリストは画面上に配置することはできませんが、イメージビューワーを含め、任意のデータを保持できるものです。このコンポーネントで扱うリストのプログラム名(クラス名)は、PFObjectListです。
ご指摘の通り、リスト格納変数では、イメージビューワーコンポーネントのリストを保持しています。
> あと、ファンクションから繋がれている6行目のコンポーネント格納変数と8行目のコンポーネント格納変数ですが、突然起動メソッドを設定し、そして実行しています。
あとやらなければならないことは最上位の階層に、取得したイメージビューワーを公開するための処理だと思うのですが、コンポーネント格納変数のやりたいことを教えて下さい。
とりあえず、見る限りではgetImageという固定の名前で起動メソッドを設定し、(カウンタを1増やし)、コンポーネント格納変数の起動メソッドを実行しているだけだと思うのですが、なぜこのやり方でイメージの公開が出来るのでしょうか・・<質問A>
コンポーネント格納変数は、確かに動作の分かりにくいコンポーネントの1つです。このコンポーネントの主たる機能は、「任意のコンポーネントを設定し、そのコンポーネントのメソッドを起動する」というものです。ここでは、
(1) イメージビューワーコンポーネントを設定
(2) 設定されたイメージビューワーコンポーネントの「getImage()」メソッドを実行
という動作を行っています。
コンポーネント格納変数は、起動対象のコンポーネントやメソッドを状況に応じて切り替えたい場合に使います。この場合には、カウンタの値によって画像を取得するイメージビューワーコンポーネントを切り替えることが必要なので、コンポーネント格納変数を用いています。
このコンポーネントは、状況に応じて柔軟に対応できるようなアプリケーションを作成するのに便利なのですが、一方、動作を追跡しづらくなることがあります。
Q13-5:
メソッド戻り値とメソッド処理結果の違いについては何となくというレベルですが、理解できた気がします。ただ、、
>引数の指定方法としてはメソッド戻り値の方が分かりやすいとお考えのようですが、メソッド戻り値には引数を持たないメソッドしか指定できないという制限があります。
この一文で引数というのが良く分からなくなりました。
グーグル先生で引数とメソッドと戻り値の関係はなんとなく理解することが出来たのですが、上記の文では引数を持たないメソッドとあります。
例えばファンクション4行目に繋がれているリスト格納変数の中を見ると加算コンポーネントに左右オペランドの引数を与え、その結果をメソッド戻り値=引数として位置指定の要素として使っています。メソッド戻り値に引数を持っているメソッドも指定してるように見えるのですが、違うのでしょうか?<質問@>
>例えば、テーブルコンポーネントのセルの値を引数として使用したい場合には、行番号と列番号を指定しなければなりませんので、これを直接メソッド戻り値として与えることはできません。そこで、あらかじめテーブルコンポーネントの「指定セルの値を取得する(int,int)」を実行しておいて、その戻り値をメソッド処理結果として利用することになります。
この説明を素直に理解するなら、「メソッド/値」の引数の要素がひとつの時はメソッド戻り値で対応可能ですが、引数が2つ以上の要素の場合はメソッド処理結果を用いるということでしょうか?<質問A>
A13-5:
> >引数の指定方法としてはメソッド戻り値の方が分かりやすいとお考えのようですが、メソッド戻り値には引数を持たないメソッドしか指定できないという制限があります。
> この一文で引数というのが良く分からなくなりました。
グーグル先生で引数とメソッドと戻り値の関係はなんとなく理解することが出来たのですが、上記の文では引数を持たないメソッドとあります。
> 例えばファンクション4行目に繋がれているリスト格納変数の中を見ると加算コンポーネントに左右オペランドの引数を与え、その結果をメソッド戻り値=引数として位置指定の要素として使っています。
メソッド戻り値に引数を持っているメソッドも指定してるように見えるのですが、違うのでしょうか?<質問@>
「引数」と「コンポーネントが内部に保持しているデータ」について、混乱されているように思えます。
引数とは、メソッドを実行するときに与えるデータのことです。一方、コンポーネントはそれぞれ内部にデータを保持しており、そのデータを使って何らかの処理を行い、結果を戻り値として返すこともできます。
これについて、加算コンポーネントを例にとって説明いたします。
加算コンポーネントは、内部に以下の2つのデータを保持しています。
・左オペランド
・右オペランド
「数値に変換後、左右オペランドに設定する(String,String)」メソッドを実行すると、内部に保持している左オペランドと右オペランドに数値データが設定されます。このときに与える2つの数値(正確には数値を表現する文字列)が、このメソッドの引数です。ちなみに、このメソッドの戻り値はありません。
「演算結果(左オペランド+右オペランド)を取得する()」メソッドを実行すると、加算コンポーネントは内部に保持している左オペランドと右オペランドの数値データを使って足し算を行い、その結果を戻り値として返します。このメソッドを実行するときに与えるデータ(引数)はありません。
すなわち、「引数を持たないメソッド」とは、言い換えると、「コンポーネントが内部に保持しているデータだけを使って実行するメソッド」ということです。
> >例えば、テーブルコンポーネントのセルの値を引数として使用したい場合には、行番号と列番号を指定しなければなりませんので、これを直接メソッド戻り値として与えることはできません。そこで、あらかじめテーブルコンポーネントの「指定セルの値を取得する(int,int)」を実行しておいて、その戻り値をメソッド処理結果として利用することになります。
> この説明を素直に理解するなら、「メソッド/値」の引数の要素がひとつの時はメソッド戻り値で対応可能ですが、引数が2つ以上の要素の場合はメソッド処理結果を用いるということでしょうか?<質問A>
メソッド戻り値で対応可能なのは、「メソッド/値」の引数がひとつの時ではなく、引数がひとつもない時です。
例えば、「ジャグリング」複合コンポーネントのファンクション[ID:4-5]に接続された処理の5行目、コンポーネント格納変数の「コンポーネントを設定する(イベント発生なし)(PFComponent)」の引数には、リスト格納変数の「要素を位置指定で取得する(int)」で取得したイメージビューワーコンポーネントを設定しています。
リスト格納変数の「要素を位置指定で取得する(int)」メソッドの引数は1つですが、これをコンポーネント格納変数の「コンポーネントを設定する(イベント発生なし)(PFComponent)」の引数として「メソッド戻り値」で指定することはできません。そこで、リスト格納変数の「要素を位置指定で取得する(int)」メソッドをあらかじめ実行しておき、その戻り値を「メソッド処理結果」として利用しています。