Q3:@P.6で「C繰り返し処理」で引数が5つ出てきていますが、これはどういう意味なのでしょうか?Aコンポーネント配置画面の右と左のコンポーネントのフローチャートというか処理順に番号とか割り振ってあると、処理順序がよく分かるのですが…、他。
Q3-1:
複合コンポーネントP.6で「C繰り返し処理(テーブルデータの最終行から開始行の繰り返し)」で引数が5つ出てきていますが、これはどういう意味なのでしょうか?あまりに突然出てきた部分でさっぱり分かりません。
P.4の解説を見る感じでは「テーブルの第3列の値を順に取得し平均値と比較する」を行っているとは思いますが、コンポーネント配置画面(何て呼んだら良いでしょうか?)の右で5つの引数を設定し、配置画面左からアクションイベントでテーブルの3列かつ平均値以上の行のセルの値を読み込み、それを左オペランドに入れ、右オペランドに入っている平均値と比較し・・・までは何となくわかったのですが、比較したあとの結果をどのように処理しているのかが良くわかりません。
多分その結果の処理が繰り返し処理内で設定している引数だとは思うのですが、その辺りの流れがつかみきれない感じです。
コンポーネント配置画面の右と左のコンポーネントのフローチャートというか処理順に番号とか割り振ってあると、処理順序がよく分かるのですが…。ここまでは右のコンポーネントで、ここからは左のコンポーネントに処理が移るといった具合です。
チュートリアルやサンプルの説明でそういったものを追加して頂けないでしょうか?
A3-1:
> 複合コンポーネントP.6で「C繰り返し処理(テーブルデータの最終行から開始行の繰り返し)」で引数が5つ出てきていますがこれはどういう意味なのでしょうか?あまりに突然出てきた部分でさっぱり分かりません。
MZ Platformの[繰り返し制御(FOR)]コンポーネントは、与えられた5つの引数に基づいてアクションイベントを複数回発生するものです。このコンポーネントは、同じような処理を繰り返し行う時に用います。複合コンポーネントチュートリアルの場合では、テーブルデータを最終行から先頭行まで順番に同様の処理(年齢が平均値より小さい行は削除)を行わせるために、[繰り返し制御(FOR)]を使っています。
「繰り返し処理を実行する(int, boolean, int, boolean, int)」の5つの引数の意味はそれぞれ、
開始値
開始値を含めるかどうか
終了値
終了値を含めるかどうか
増減値
で、このメソッドの基本的な動作は以下の通りです。
(1) 繰り返し制御コンポーネントは、内部に"現在値"という数値データを保持している。「繰り返し処理を実行する(int, boolean, int, boolean, int)」メソッドを起動したとき、"現在値"は引数の開始値となる。
(2) 繰り返し制御コンポーネントは、"現在値"をイベント番号とするアクションイベントを発生する。
(3) 発生したアクションイベントに接続された処理が終了すると、"現在値"を増減値で指定された分だけ変化させる。
(4) "現在値"が終了値に達していない場合、さらにアクションイベントを発生させる(上の(2)へ進む)。"現在値"が終了値に達した場合には、それ以上アクションイベントは発生させず、動作を終了する。
「開始値を含めるかどうか」はいわばオプションで、これをfalseとした場合には"現在値"が開始値の場合のアクションイベントが発生しません。「終了値を含めるかどうか」も同様です。
繰り返し制御(FOR)の動作をご覧頂くためのサンプルを用意しましたので、ご覧ください。関連ファイルのサンプルファイルをアプリケーションビルダーから起動し、[繰り返し制御(FOR)]ボタンをクリックすると、"現在値"を示すメッセージダイアログがされます。[了解]ボタンをクリックし続けると、"現在値"が1つずつ増えているのが確認できるかと思います(このサンプルでは、増減値を1としています)。
> P.4の解説を見る感じでは「テーブルの第3列の値を順に取得し平均値と比較する」を行っているとは思いますが、コンポーネント配置画面(何て呼んだら良いでしょうか?)の右で5つの引数を設定し、配置画面左からアクションイベントでテーブルの3列かつ平均値以上の行のセルの値を読み込み、それを左オペランドに入れ、右オペランドに入っている平均値と比較し・・・までは何となくわかったのですが、比較したあとの結果をどのように処理しているのかが良くわかりません。
>
> 多分その結果の処理が繰り返し処理内で設定している引数だとは思うのですがその辺りの流れがつかみきれない感じです。
>
> コンポーネント配置画面の右と左のコンポーネントのフローチャートというか処理順に番号とか割り振ってあると、処理順序がよく分かるのですが…。ここまでは右のコンポーネントで、ここからは左のコンポーネントに処理が移るといった具合です。
ご参考までに、[フィルタ]複合コンポーネント内のテーブル行削除の繰り返し処理に関わる部分に番号を付けましたので、どうぞご覧ください。また、Ver.2.6より、開発チュートリアル(基礎編)に付録として「MZ Platformにおけるコンポーネント動作とメソッド起動」を追加しました。ここでは、メソッド処理の実行順序について分かりやすく説明してあります。
関連ファイル:繰り返し制御(FOR).mzax、実行順序.png
Q3-2:
マニュアルP.6にある比較演算≧から繋いであるコンポーネントの箇所で、イベント番号「0」となっていますが、この「0」はコンポーネントリファレンスの比較演算の項目のイベント番号が0でメソッド処理結果がfalseの時、内包データも「0」ということかな、と思ったのですが、これはつまり、右オペの平均値と左オペの値を比較し、平均値未満の時はfalseを返しているということでしょうか?内包データとメソッド処理結果って別のものなのでしょうか…。
やはり、詳細な流れが分かるよう説明が欲しいです。
A3-2:
> マニュアルP.6にある比較演算≧から繋いであるコンポーネントの箇所で、イベント番号「0」となっていますが、この「0」はコンポーネントリファレンスの比較演算の項目のイベント番号が0でメソッド処理結果がfalseの時、内包データも「0」ということかな、と思ったのですが、これはつまり、右オペの平均値と左オペの値を比較し、平均値未満の時はfalseを返しているということでしょうか?内包データとメソッド処理結果って別のものなのでしょうか…。
ご指摘の通り、左右のオペランドを比較し、平均値未満のときにはfalseを返しています。そのときのイベント番号は「0」、イベント内包データは「false」となります。
内包データとメソッド処理結果(メソッドの実行結果)とは別のものとお考えください。ただし、コンポーネント、起動メソッドおよび発生イベントによっては、結果として同じものになっているものもございます。それは各コンポーネントの仕様に依存します。各コンポーネントの仕様の詳細は、付属の「コンポーネントリファレンス」をご覧ください。
> やはり、詳細な流れが分かるよう説明が欲しいです。
Ver.2.6より、開発チュートリアル(基礎編)に付録として「MZ Platformにおけるコンポーネント動作とメソッド起動」を追加しました。ここでは、メソッド処理の流れについて分かりやすく説明してあります。
Q3-3:
じっくりとフィルタの複合コンポーネントについて考えてみました。
繰り返し制御(FOR)についてはサンプルもあったおかげで良く理解することが出来ました。
行数を取得している部分が最終行から先頭行まで読み込んでいる部分が分かり、「そんなやり方してたのか!!」とちょっと感動しました。
一応自分でも理解しようと、コンポーネント配置画面の右にすべてブレークポイントを設定し、デバッグのステップインでちょっとずつ引数とメソッド処理結果を見ながら、今どのコンポーネントでどの処理をしているのかを理解しようとしましたが、何か所か引っかかってしまいます。
一番疑問なのは、なぜこの処理をするのにこのコンポーネントを選択しているのかということと、このコンポーネントを複数回使っている時の違いが良く分かりません。
フィルタ複合コンポーネントの中を順次追っていきますので質問させて下さい。
左サブルーチン1から右テーブル格納変数にデータリストを格納しています。まずはその次の基本統計処理コンポーネントを選択する理由です。このコンポーネント自体は何もしていないように思えます。
テーブルに格納したデータの平均値を求めるのに必要だとは思うのですがなぜこのコンポーネントを一度通さないといけないのでしょうか?テーブルに格納した値の平均値を一気に求めることはできないのでしょうか?
そして、比較演算に使うための右オペランドを平均値から設定しています。その時の呼びだしているコンポーネントが基本統計処理になっていますがこれが無いと無理なのでしょうか。要は一度基本統計処理コンポーネントを間に噛ませて平均値を取得しているように思えます。
その後は繰り返し制御(FOR)によって行数を取得した最終行から先頭行まで各セルを取得しながら左オペランドに設定し、比較演算で平均値未満のときFalseを返しています。
ここからまた疑問なのですが、右の比較演算でFalseを返した場合、左の比較演算に行き、そこから処理完了イベントでその行を削除していると思うのですが、左オペランドに設定した値が平均値以上の時は比較演算はどのような処理を返しているのでしょうか?この部分がどうしても分かりませんでした。
とりあえず、全てのセルに対して比較を行い、平均値未満だった行を削除したあとはイベント生成コンポーネントに行くわけですが、この時、どうしてイベント生成なのか、さらにこのイベント生成はどういったことをしているのかがイマイチ分かりません。
平均値未満の行を削除した後に、テーブル格納変数にテーブルを全部入れる処理をしているとは思うのですが…。
そのあとにイベント番号を1で設定するのも良く分かりません。上の階層で、フィルタで設定が終わったテーブルデータをテーブルに設定し直しているように思います。
まだ上の階層での流れ等微妙な箇所もありますが、まずはフィルタ内部を完全に理解したいと思いますので、多くの質問がありますが、宜しくお願いします。
A3-3:
> 左サブルーチン1から右テーブル格納変数にデータリストを格納しています。
まずはその次の基本統計処理コンポーネントを選択する理由です。このコンポーネント自体は何もしていないように思えます。
> テーブルに格納したデータの平均値を求めるのに必要だとは思うのですがなぜこのコンポーネントを一度通さないといけないのでしょうか?テーブルに格納した値の平均値を一気に求めることはできないのでしょうか?
>
> そして、比較演算に使うための右オペランドを平均値から設定しています。その時の呼びだしているコンポーネントが基本統計処理になっていますがこれが無いと無理なのでしょうか。要は一度基本統計処理コンポーネントを間に噛ませて平均値を取得しているように思えます。
基本統計処理は、与えられた数値のリストに対する様々な計算機能を提供するコンポーネントです。ここで使っている平均値の計算のほか、総和や標準偏差の計算、最大値、最小値、中央値の取得などを行えます。
基本統計処理の使い方は、以下の2段階から成ります。
(1) 計算対象となる数値のリストを設定する。
(2) 設定された数値リストに対して行うべき計算を指定して実行させる。
「フィルタ」複合コンポーネントのサブルーチン1に接続された2つめの処理、基本統計処理の「集計対象データを設定する(PFObjectList)」で上述の(1)を行っています。次に、比較演算用の右オペランドの設定で呼び出されている「平均値を取得する()」メソッドで、上述の(2)を行っています。すなわち、このメソッドが行っていることは「設定された数値リストの平均値を計算して、その値を返す」ということであり、その計算結果が比較演算の右オペランドに設定されているわけです。
現在、リストに含まれる数値の平均値を計算するメソッドを持っているコンポーネントは、基本統計処理のみとなります。
> その後は繰り返し制御(FOR)によって行数を取得した最終行から先頭行まで各セルを取得しながら左オペランドに設定し、比較演算で平均値未満のときFalseを返しています。
> ここからまた疑問なのですが、右の比較演算でFalseを返した場合、左の比較演算に行き、そこから処理完了イベントでその行を削除していると思うのですが、左オペランドに設定した値が平均値以上の時は比較演算はどのような処理を返しているのでしょうか?この部分がどうしても分かりませんでした。
左オペランドに設定した値が平均値以上の場合には、何も行っていません。ここで行っている処理は、「テーブル格納変数2が保持しているテーブルデータから、指定セルの値が平均値未満の行を削除することによって、平均値以上の行だけを残す」というものです。
> とりあえず、全てのセルに対して比較を行い、平均値未満だった行を削除したあとはイベント生成コンポーネントに行くわけですが、この時、どうしてイベント生成なのか、さらにこのイベント生成はどういったことをしているのかがイマイチ分かりません。
>平均値未満の行を削除した後に、テーブル格納変数にテーブルを全部入れる処理をしているとは思うのですが…。
テーブル格納変数2にテーブルを全部入れる処理は行っていません。上述のように、テーブル格納変数2には元の住所録テーブルのデータが全部入っていて、ここで行った行削除処理の結果、テーブル格納変数2には平均値以上の行だけが残ったテーブルが保持されています。
テーブル格納変数2に元の住所録テーブルのデータを全部設定するという処理は、上位階層のボタン[ID:5 KEY:"平均年齢以上"]に接続されている処理「テーブルを設定する(PFObjectTable)」で行われています。
イベント生成コンポーネントは、テーブル格納変数に保持されているテーブルデータ(平均値以上の行のみが残っているテーブルデータ)を、トップ階層に伝達するために使われています。イベント生成の「データ生成イベントの発生(Object,int)」メソッドを実行すると、イベント生成からはデータ生成イベントが発生します。そのデータ生成イベントにつながっている「フィルタ」複合コンポーネントの「イベントを伝播させる(PFEvent)」メソッドの実行により、上位階層の「フィルタ」複合コンポーネントから、このデータ生成イベントが発生します。
イベントが一種のメッセージだということは「開発チュートリアル(基礎編)」の付録にも記述されている通りですが、イベント受け取り先のコンポーネントが利用するためのデータを内包データとしてイベントと一緒に送ることができます。ここでは、データ生成イベントに、テーブル格納変数2が保持しているテーブルデータを内包データとして一緒に送っています。このテーブルデータは、最終的な受け取り先である、上位階層のテーブル2が「テーブルを設定する(PFObjectTable)」の引数として利用します。
> そのあとにイベント番号を1で設定するのも良く分かりません。
イベント番号を1とする理由は特にありません。任意の数字を指定できます。ただし、上位階層で「フィルタ」複合コンポーネントが発生しているデータ生成イベントの番号を一致させておく必要があります。
> 上の階層で、フィルタで設定が終わったテーブルデータをテーブルに設定し直しているように思います。
そのご理解で間違いありません。「フィルタ」複合コンポーネントで作られた 「平均値以上の行のみが残っているテーブル」を上位層のテーブルに設定するまでの処理の流れは、上でご説明した通りです。
Q3-4:
基本処理統計については良く理解することができました。
ありがとうございました。
比較演算でTrueの時は何もせず、Falseの時だけ行削除が行われるというのも理解することができました。
>テーブル格納変数2に元の住所録テーブルのデータを全部設定するという処理は、上位階層のボタン[ID:5 KEY:"平均年齢以上"]に接続されている処理「テーブルを設定する(PFObjectTable)」で行われています。
この部分に疑問があります。
上位階層でボタンの「全体」を押した時に、テーブル2に入っている元の住所録テーブルのデータを設定していると思っていたのですが違うのでしょうか?
そもそも住所録の複合コンポーネント内のどこにデータが入っているのかがずっと疑問でした。複合コンポーネント内に入っても何もありませんし…。
また、別の質問になりますが、上位階層でボタン「平均年齢以上」を押した時にフィルタで平均未満が削除されたテーブルを設定しています。
そこまでは理解できるのですが、もうひとつのフィルタコンポーネントへの接続先である平均年齢以上の住所録を作成する、というメソッドがなぜここで出てくるのかが微妙に分かりません。
フィルタ複合コンポーネント内から公開しているメソッドで、サブルーチン1からのメソッドで、イベント生成で作成されたもの呼び出すという理解で良いでしょうか?
この時の上位階層でのフィルタとボタンコンポーネントの順番は、ボタンが押された時にフィルタ複合コンポーネントで平均未満の行を削除したテーブルを設定し、それを住所録としてもう一回テーブルに設定しているということでしょうか?(フィルタ複合に2回繋がっている意味が分かりません)
その後、フィルタ複合コンポーネントからテーブル2にデータを設定し直しているという流れなのでしょうか・・・
以上細かい箇所まで追求するようですが、宜しくお願いします。
A3-4:
お問い合わせの件について、以下の通り回答させていただきます。
> >テーブル格納変数2に元の住所録テーブルのデータを全部設定するという処理は、上位階層のボタン[ID:5 KEY:"平均年齢以上"]に接続されている処理「テーブルを設定する(PFObjectTable)」で行われています。
>
> この部分に疑問があります。
> 上位階層でボタンの「全体」を押した時に、テーブル2に入っている元の住所録テーブルのデータを設定してると思っていたのですが違うのでしょうか?
「全体」ボタンを押したときに行われるのは、上位階層の「テーブル2」に住所録データを設定する処理です。「テーブル2」は、画面上に表示されているテーブルです。この処理は「フィルタ」複合コンポーネントとは一切関わりません。
「全体」ボタンが押されると、このボタンコンポーネントからアクションイベントが発生し、上述の処理が行われます。イベント発生とメソッドの実行順序につきましては、開発チュートリアル(基礎編)の付録をご覧ください。
> そもそも住所録の複合コンポーネント内のどこにデータが入っているのかがずっと疑問でした。複合コンポーネント内に入っても何もありませんし…。
>
> また、別の質問になりますが、上位階層でボタン「平均年齢以上」を押した時にフィルタで平均未満が削除されたテーブルを設定しています。
ここで設定しているのは平均未満が削除されたテーブルではありません。元々の全体のテーブルデータを「フィルタ」複合コンポーネントに設定しています。
> そこまでは理解できるのですが、もうひとつのフィルタコンポーネントへの接続先である平均年齢以上の住所録を作成する、というメソッドがなぜここで出てくるのかが微妙に分かりません。
>
> フィルタ複合コンポーネント内から公開しているメソッドで、サブルーチン1からのメソッドで、イベント生成で作成されたもの呼び出すという理解で良いでしょうか?
> この時の上位階層でのフィルタとボタンコンポーネントの順番は、ボタンが押された時にフィルタ複合コンポーネントで平均未満の行を削除したテーブルを設定し、それを住所録としてもう一回テーブルに設定しているということでしょうか?(フィルタ複合に2回繋がっている意味が分かりません)
「フィルタ」複合コンポーネントの2つの公開メソッド、「テーブルを設定する(PFObjectTable)」と「平均年齢以上の住所録を作成する()」が行う処理について誤解されているようです。
上位階層から見たときの「フィルタ」複合コンポーネントの機能は以下の通りです(上位階層から見た場合、「フィルタ」複合コンポーネントは1つの独立したコンポーネントとみなされます)。
「与えられたテーブルデータから、平均年齢以上の行データを削除したテーブルを作成し、そのテーブルを内包データとするデータ生成イベントを発生する」
この機能は、以下の2つの公開メソッドで実現されています。
(1) テーブルを設定する(PFObjectTable)
「フィルタ」複合コンポーネントに処理対象のテーブルデータを与えます。
(2) 平均年齢以上の住所録を作成する()
(1)のメソッドによって与えられたテーブルデータから平均年齢以上のテーブルデータを作成します。そののち、そのテーブルデータを内包データとするデータ生成イベントを発生します。
「平均年齢以上」ボタンコンポーネントに接続された「テーブルを設定する(PFObjectTable)」メソッドにより、「フィルタ」複合コンポーネントに全体の住所録テーブルデータを与えます。この時点では、「フィルタ」複合コンポーネントが保持しているのは、すべての行を含んだ住所録テーブルデータです。
次に、「平均年齢以上の住所録を作成する()」メソッドを実行することによって平均年齢以上のテーブルデータが作成され(「フィルタ」複合コンポーネント内のサブルーチン1につながる処理によって作成)、そのテーブルデータを内包データとするデータ生成イベントが「フィルタ」複合コンポーネントから発生します。
そして、「フィルタ」複合コンポーネントからのデータ生成イベントに接続されたテーブル2の「テーブルデータを設定する(PFObjectTable)」メソッドにより、テーブル2に対して平均年齢以上のテーブルデータが設定されます。
Q3-5:
さらに追加の質問をさせて下さい。
上位階層の一番上のコンポーネント接続において、テーブルデータを設定する時に住所録の複合コンポーネントを呼び出しています。その部分は理解できるのですが、その住所録複合コンポーネントの中身について疑問があります。DBに接続しているわけでもないのにどうやってテーブルデータを保持しているのでしょうか?この存在がすごく気になります。
A3-5:
「住所録」複合コンポーネントの中には、住所データを記入したテーブルが配置されています。テーブルコンポーネントが保持しているデータおよび配色等の属性情報は、アプリケーションと一緒に保存されます。上位階層からは、この保存されたテーブルデータを取得しています。
なお、このテーブルデータは以下の手順で作成したものです。
(1) フレームコンポーネントにテーブルコンポーネントを配置。
(2) フレームを表示させ、画面からデータを手入力。
(3) フレームを閉じた後、アプリケーションビルダー上からフレームコンポーネントを削除。
(4) アプリケーションを保存。