変数トップへ手順1手順2手順3
お得情報

最初はおまけ?

大量オブジェクトの重なり順を変更する方法。

  手順−2で、直線オブジェクトをたくさん作成して、番号順に並べる作業がありましたが、どのようにされましたか?
  オブジェクトリストを利用して「Shift+↑↓」を利用されたと思いますが、先にこの方法を紹介しなくて申し訳ございません
  私もいままでは、上記方法や重なり順を利用したり、時には、いったんワークスペースへ出したあと、再度戻したり行ってました
  
  今回、初公開の情報です。その方法は、上(前面)にしたいオブジェクトを「切り取り」ます。そして「貼り付け」をクリックします。
  この方法だと同じ場所に貼り付けることができますので、本当に順番だけの入れ替えが可能です。
  大量のオブジェクトの入れ替えには是非ご利用ください。


では、まじめに、お得情報を始めます
(ファイル名は、適当に変更・複写してお試しください)

さきほど、矢印の上に配置した「ラベルオブジェクト」配置しました。・・・
その前にワークスペースにだしてしまった「ボタンオブジェクト」ご記憶ですか?。せっかくですから、そのコマンドボタンを利用しましょう
コマンドボタンを利用することで、イベントも短くできます。(イベントが短くなればいいというものでもないのですが、変数の勉強のためと・・)

コマンドボタンの紹介(内容)
作成するボタンは10個です(先ほどの6個を利用すると、あと4個です)
ボタン名は、「b中大1・b中大2・b大中1・b大中2・b小大1・b小大2・b大小1・b大小2・b小中・b中小」
背景は透明、標題はなしです。大きさ・場所は、さきほどのラベルの場所です。そのため事前に、ラベルオブジェクト10個は、移動または、削除しておいてください。

まずコマンド紹介:「b1」の場合
機能名 パラメータリスト
なし #代入(&共器,&器),#代入(&元量,&量),#代入(&先量,&量)
手続き実行 共通処理
なし #代入(&量,&元量),#代入(&量,&先量)
手続き実行 画面更新
注意:もし、コマンドボタンにイベントの設定が行われていましたら、全てクリアしてください。

このようなボタン設定を10個も作成するのは面倒ですね。いろいろ裏技・表技ありますが、
また機会がありましたらご紹介致します。
お忙しい方は、2・3個作成して試してみるか、サンプルを開いて参照下さい。

ボタン名とパラメータリストのは、ボタン名の「緑」「赤」で、それぞれ対応しています。
修正される場合は参考にしてください


いままでの説明のなかで、なにか「似ているのをたくさん作るナー」と、思われませんでしたか?。
そうです。ここでは、似ているものをまとめてしまおうということです。

しかし、「大→小」「中→大」・・・と、それぞれ異なる処理を行うのですから、当然工夫が必要です。
それが、変数です。(頭がラーメン状態?・・いえ、説明する方がです)

では、気合いをいれてご紹介します。内容は、「似てるところだけをまとめる」これだけです。

上記「大→小」「中→大」を例に、似ている所を探すと、
・送り側が、量があるか?
・受け取り側のまだ入る空き量が、送り側より大きいか
・あふれる場合は、いくらの空き量(移動可能量)があるか
・以上の判定で、実際の移動を行う
・移動後に、画面表示を更新する
この工程は同じですね。では、違うところは
・送り側の量
・受け取り側の量
・空き量
・移動可能量
これが違います。つまりここをなんとかすると、同じプログラムで使用出来ることがわかります

簡単にいうと、異なる部分(量を変えるところ)だけ、それぞれで行い、共通処理を実行しようということです。

では、上記コマンドボタン機能の説明。

 イベントには、共通で、使用する変数を追加しています
 >変数宣言 整数{&共器,&元量,&先量}

機能1.共通で使用する変数に、それぞれの値を代入します。
  「受け取り側の器の量・送り側の量・受け取り側の量」・・これだけわかれば大丈夫ですね。

機能2.上記変数を、共通の手続きで処理します(手続きは下記参照)

機能3.計算された変数を元の変数に戻します
  「送った後の量・受け取った後の量」・・これだけです。「受け取り側の器の量」は、固定ですので不要です

機能4.最後に変更された変数を利用して画面の更新処理を行います(手続きは、以前の物と同じです)


「機能2.」で使用するイベントの紹介。

手続き定義開始 共通処理()
  if(&元量=0)
  else if(&共器-&先量>=&元量)
    &先量=&先量+&元量
    &元量=0
  else
    &移量=&共器-&先量
    &先量=&先量+&移量
    &元量=&元量-&移量
  end
手続き定義終了

よくみると内容は同じですね。しかし、これで、イベントのプログラム量は10分の1になります。

コマンドボタンも使い方次第ですね。

えっ!「10分の1」・・と、いう訳で、ピクチャーの表示部分も頑張ってみましょう。

いままで利用している内容は
  >&Ypt=#文字列( 30+(&大器-&大量)*20)+"pt"
  >&Hpt=#文字列(&大量*20)+"pt"
  >オブジェクト操作 @p大量{始点Y=&Ypt,高さ=&Hpt}
  このように紹介しましたが、思い切ってまとめてみます。

  >オブジェクト操作 @p大量{始点Y=#文字列( 50+(&大器-&大量)*20)+"pt",高さ=#文字列(&大量*20)+"pt"}
  >オブジェクト操作 @p中量{始点Y=#文字列(250+(&中器-&中量)*20)+"pt",高さ=#文字列(&中量*20)+"pt"}
  >オブジェクト操作 @p小量{始点Y=#文字列(275+(&小器-&小量)*20)+"pt",高さ=#文字列(&小量*20)+"pt"}

 もともと3行しかないので、10分の1にはできませんが、3文の1になりますね。(ただ、3行あったのを1行にしただけです)

 ※しかし、行数が少ないプログラムがいいという訳ではありません。あくまで一番いいのは正しい答えを出すプログラムです
  無理に行数を少なくすることをお奨めしているのではありませんので、ご了承下さい

また、今回、コマンドボタンを使用したため、フォーカスの処理が残っています。
通常のメニューなどで使用するコマンドボタンは、選択したボタンにフォーカスが動いても問題ないですが、今回は矢印の上に、中途半端に残ってしまうと見た目が悪いので、フォーカス処理を行います。

方法は、「b中大1・b中大2・・・・b中小」のフォーカス設定可能(F)は「自動」のままで結構です。
追加ボタンを作成してください。「b終了」機能名:「閉じる」、フォーカス設定可能(F)を、「自動」でなく、「許可」に設定してください
とりあえず、マウス操作でのフォーカス移動はなくなります。

なお、ここまでの、サンプルを「変数付録」に入れてあります
top


後ひとつ、お得情報
(ファイル名は、適当に変更・複写してお試しください)

さて、共通と聞いて思い出すのは・・・「ファミリー」が、あります。

 さきほど、「共通しない部分だけコマンドボタンの、パラメータリストに設定し、共通部分をイベント(手続き)で、処理を行う」と、紹介いたしましたが、ファミリーではそのような処理はできません。(パラメータリストとイベントの発生順の関係です。従って、コマンドリストの実行が後でいい場合は可能です)

 では、今回、利用できないか・・・?

いえ、ご紹介します。桐もこれだけ使ってくれるとうれしいのでは・・・と、勝手に思いながら(自己満足です)

では、最初にファミリーの設定を行います。
書式→ファミリーパレット→追加
オブジェクトリストのファミリー→追加(マウス右クリックで、選択)

ファミリー名は任意に変更できます。今回は、「くりっく」としてみました。
オブジェクトリストのファミリーに「くりっく」が、できましたか?では、マウスで選択してオブジェクト属性画面、または、オブジェクトリストの属性画面を表示してください。

ファミリーでは使用できるイベントが限られてますが、今回は、「マウスインアウト」・「マウス左クリック」のみ使用します

「マウスインアウト」は、当然矢印の色を変更するために利用しています。そして、「マウス左クリック」は、量を動かすのに使用しますね


では、イベントは・・・ところで、読み飽きませんか、あと少しで終わりです。いままでと違った説明ですから、深呼吸でもしてからどうぞ

「マウスインアウト」も「マウス左クリック」もコマンドオブジェクトに登録する方法は一緒です。コマンドボタンのオブジェクト属性からイベントタブを開き右下の「ファミリー名」の▼をクリックして名前を選択してください。あとは、ファミリーでイベントを登録していきます。

このファミリーイベントでは、ひとつを除いて、いままで紹介したものを使用しています。それはそうですね。同じ内容を行うわけですから。
そのひとつとは、「&this」です。

いままで、「○○ボタンをクリックしたら」・・・・・とプログラムを作成してきましたが、「&this」を利用すると、いま何が押されたかがわかります。(ファミリー以外のイベントでも使用できます)

つまり、きっかけのボタンや他のオブジェクト名がわかるので、共通(ファミリー)のプログラムもそれなりに作成(変更)が、必要です

  &this・・「&」が付いているので、変数というのはわかりますが、いつ宣言するのか・・?
この変数は、宣言しなくても使用可能です。とにかく、イベントが発生したら、そのきっかけを作ったオブジェクト名が、入っていると、覚えてください。

ここで、お知らせ。オブジェクト名は、「自由にとか、わかりやすい名前を・・・」と、書きました。では、名前を「左下の5から右上の8へ移動するボタン」でもいいのか?。悪くはないのですが、今回ファミリーで使用するために「b大中」など指定していたわけです。
プログラムの中で、「&this」の内容が、「左下の5から右上の8へ移動するボタン」より、「b大中」の方が、処理に楽です。

少し遠まわりになりましたが、利用例(詳細はイベントファイルを参照下さい)

「クリック」ファミリーのマウスインアウトでの使用例

  >手続き定義開始 くりっく::マウスインアウト(長整数 &フラグ,長整数 &明細番号)
  >  if(#文字位置(&this,"中大")>0)
  >    &obj[1]="直線_11",&obj[2]="直線_12",&obj数=2
  >  else if(#文字位置(&this,"大中")>0)
  >    &obj[1]="直線_13",&obj[2]="直線_14",&obj数=2

&thisの内容を調べ、その中の文字に「○○」が含まれている場合は、以下の処理をする


「クリック」ファミリーのマウス左クリックでの使用例

  >手続き定義開始 くりっく::マウス左クリック(・・・・・・・・・・・・)
  >  if(#部分列(&this,2,1)="大")
  >    &元量=&大量
  >  else if(#部分列(&this,2,1)="中")
  >    &元量=&中量

  >  if(#部分列(&this,3,1)="大")
  >    &共器=&大器,&先量=&大量
  >  else if(#部分列(&this,3,1)="中")
  >    &共器=&中器,&先量=&中量

ここでは、&thisの内容を一文字ずつ調べ、その中の文字に「○」が含まれている場合は、以下の処理をする


ファミリーでの使用に限らず「&this」は、重要な変数のひとつです。使用方法を覚えましょう

ここまでのサンプルは、「変数付録2」に入れてあります
top
変数・・・あってもいいし、なくてもいいし・・特に考えたことはなかったのですが、ふとしたことから、変数をまとめてみました

「変数は、使用すればするほど、プログラムがわかりにくくなってしまう」そう考えておられたかた!。正しいです。
しかし、変数を使用しないプログラムは書けません。となれば、できるだけわかりやすい変数での利用をしましょう。

これをご覧になられて、わかりにくかった方は、このような利用はしないで下さい。もし参考になられた方は、これは、たんなる一例です
もっとすばらしい方法があると思いますので、改良してよりいい方法でご利用ください。ここまで、ご覧頂ましてありがとうございます
【多遊】