* 先頭が * * で、始まる行はコメント行としてプログラムの実行には関係有りません   * このイベントには一部説明が入ってますが、他の説明は、「ゴミの日カレンダー」を、参照下さい 名札 メイン   変数宣言 整数{&i,&ch,&配列数,&今月}   変数宣言 日付{&作業日付}   変数宣言 整数{&作業年,&作業月,&作業日,&日t[37],&月初曜,&月末,&元号}   変数宣言 文字{&ごみ[37],&レポート,&状態}   * 配列数=50 の、役目・・・ゴミの日が1ヶ月に何日あるか、そのデータを変数に取り込みます   * 1ヶ月は、31日なので、それ以上必要はないと思われるでしょうが、データの入力ミスや展開途中で必要です。   &配列数=50   変数宣言 文字{&内容[&配列数]},整数{&週数[&配列数],&曜数[&配列数],&重複[&配列数]}   &元号=0 /* コメントはこのように入れることも出来ます */   &ch=0 /* 初期変数値は、&元号=0 西暦表示、&元号=1 元号表示   &状態="更新"   &作業日付=#日時値   &月初曜=#文字位置("日月火水木金土",#曜日(&作業日付))   データパス名 #一括パス名,固定=する   * 手続き定義開始 フォーム::フォーム開始(長整数 &表番号)   手続き実行 設定チェック() /* データのエラーチェックします   手続き実行 設定読込() /* プログラムの起動時に表のデータを読み込みを実行します   手続き実行 カレンダー作成() /* カレンダ作成を実行します   メソッド呼び出し @b月増.フォーカス設定() 手続き定義終了 手続き定義開始 カレンダー作成() *  if(&今月=1)     &STR="tg"+#文字列(&月初曜+&日-1)     オブジェクト操作 &STR.背景色="白緑" *  end   * ここは、ゴミの日カレンダーを参照下さい   &作業年=#年(&作業日付),&作業月=#月(&作業日付),&作業日=#日(&作業日付)   &月初曜=#文字位置("日月火水木金土",#曜日(#日時値生成(&作業年,&作業月,1)))   &月末=#日(#月末(#日時値生成(&作業年,&作業月,1)))   繰り返し &i=1,37     if(&i+1-&月初曜>=1 .and &i+1-&月初曜<=&月末)       &日t[&i]=&i+1-&月初曜     else       &日t[&i]=#u     end   繰り返し終了   * エラーフラグが「0」の場合だけ、ゴミ処理表示設定プログラムを実行します   if(&ch=0)     手続き実行 設定表示()   end   if(&作業年=&年 .and &作業月=&月)     &STR="tg"+#文字列(&月初曜+&日-1)     オブジェクト操作 &STR.背景色="空色" *    &今月=1   end 手続き定義終了 手続き定義開始 設定表示()   変数宣言 自動,整数{&damy}   * 配列変数 &ごみ[]を、クリアします   繰り返し &i=1,37     &ごみ[&i]=#u   繰り返し終了   &i=1   * ゴミの設定をとりこんだ変数を調べ、カレンダーのどの位置(変数)代入するか計算します   * ここでの繰り返しは、繰り返し(&内容[&i]<>#u)を使用しています。   * &内容[]が、空(未定義)になるまで繰り返します。従って、定義設定の途中に空白行があれば、そこまでしか評価されません   * 計算式は・・・・・苦肉の策も入ってます。   繰り返し(&内容[&i]<>#u)     &damy=(&週数[&i]-1)*7+#MOD(&曜数[&i]-&月初曜+7,7)+&月初曜   * if文が、2行に分かれてるのは、配列エラーが起きるのを防ぐためです。これを1つの「if文」に、書いたとして \     (&damy>=1 .and &damy<=37 .and &日t[&damy]>0)となりますが、&damyが40だった場合、最初の \     「&damy>=1 .and &damy<=37」だけで判断できなく(&日t[40]>0)この式が評価されます。ここで、配列は37までしか \     設定していないので、エラーとなるわけです。プログラムを修正する必要がありますが、勉強用としてこのままに \     しておきます。 \     ところで、このコメントには、先頭に「*」がついていませんが間違いないコメントです。理由は、最後の 「\」です \     最後に 「\」が付いてる場合は、連続した一行として扱われます。長いコマンドや、計算式なども利用できます。お試しください     if(&damy>=1 .and &damy<=37)       if(&日t[&damy]>0)         &ごみ[&damy]=&内容[&i]       end     end     &i=&i+1   繰り返し終了 手続き定義終了 手続き定義開始 設定処理()   * 設定ボタンが実行されたら、表関係オブジェクトへの操作を自動に変更します   オブジェクト操作 @t内容.フォーカスの設定="自動",@t週.フォーカスの設定="自動",@t曜日.フォーカスの設定="自動"   オブジェクト操作 @t説明.マウス左ダウン="1"   &状態="設定"   メソッド呼び出し @t内容.フォーカス設定() 手続き定義終了 手続き定義開始 更新処理()   * 念の為に、エラーフラグを戻します   &ch=0   * 最初に、手続き 毎週処理を、実行します   * エラーフラグが、「0」の場合、次へ進みます   * 次に、 手続き 設定読み込みを、実行します   * 次に、 手続き カレンダー作成を、実行します   * 次に、 表関係オブジェクトへのフォーカス操作を禁止に変更します   手続き実行 毎週処理()   手続き実行 設定チェック()   if(&ch=0)     &状態="更新"     手続き実行 設定読込()     手続き実行 カレンダー作成()     オブジェクト操作 @t説明.マウス左ダウン="0"     オブジェクト操作 @t内容.フォーカスの設定="禁止",@t週.フォーカスの設定="禁止",@t曜日.フォーカスの設定="禁止"     メソッド呼び出し @フォーム.変数変更()     メソッド呼び出し @bdamy.実行()     メソッド呼び出し @b月増.フォーカス設定()   end 手続き定義終了 手続き定義開始 毎週処理()   * 第○週の所を、毎週と入力された場合の、展開処理です   * 先頭の「名札」以外で、手続き内でも変数宣言できます。その場合、この手続きが終了したら、変数も消去されます   変数宣言 自動,文字{&damy内容,&damy曜日}   変数宣言 自動,整数{&設定行数}   絞り込み [週]="毎週"   * 絞り込みコマンドを実行すると、組み込み関数「&選択件数」に、行数がはいります。0行でも0が入ります   * 次の「if文」以降で、"毎週"の処理展開を行います   if(&選択件数>0)     &設定行数=&選択件数   * 繰り返し処理で、1行単位に処理を行います。"毎週"の文字が入ってる行の、[内容]と[曜日]を変数に代入します     繰り返し &i=1,&設定行数       ジャンプ 行番号=&i       &damy内容=[内容],&damy曜日=[曜日]   * ここから5行で同内容を([週]だけ変更して)行追加処理で最下行に追加します   * 絞り込みや、整列状態での行挿入は行えません       行追加 [内容]=&damy内容,[週]="1",[曜日]=&damy曜日       行追加 [内容]=&damy内容,[週]="2",[曜日]=&damy曜日       行追加 [内容]=&damy内容,[週]="3",[曜日]=&damy曜日       行追加 [内容]=&damy内容,[週]="4",[曜日]=&damy曜日       行追加 [内容]=&damy内容,[週]="5",[曜日]=&damy曜日     繰り返し終了   * 行追加処理が終了したら、再度[週]="毎週"を抽出し削除します   * 行削除 * の、「*」は、全行の意味です。無い場合は、対象行一行のみ削除します     絞り込み [週]="毎週"      行削除 *   end   * 解除 * の、「*」は、絞り込みや選択すべてを解除します。直前の作業を解除するときは、解除 1 と、します   解除 *   * 再度絞り込みを行います。今度は日付が重複しているものを調べます   * [重複]には、(第○週−1)*7+曜日の計算式がはいっています。1日が日曜日だったとして、何日かの答えと同じです   * 重複=2 は、2行以上という意味で、ちょうど2行を選択するときは「重複==2」と書きます   絞り込み 重複行=2,{[重複]}   if(&選択件数>0)   * 絞り込んだ結果、重複があった場合メッセージを表示しています     メッセージボックス "重複設定","同一日に複数の設定があります。\n最後の設定が有効になります",制御文字展開=する   * ここは、気になるところですが、フラグはたてないことにします。私の経験上です *    &ch=1   end   解除 * 手続き定義終了 手続き定義開始 設定読込()   * 最初に、起動したとき、表形式から戻ったとき、定義内容が更新されたときこの手続きが実行されます   * いままで、使用していた配列変数の値を、全部未定義に置き換えます   繰り返し &i=1,&配列数     &内容[&i]=#u,&週数[&i]=#u,&曜数[&i]=#u   繰り返し終了   * いま、クリアされた配列変数に、表のデータを取り込みます   if(&ch=0)     ジャンプ 行番号=先頭      &i=1   * 繰り返しの方法。今回のように何行あるかわからない場合は、一番下の行(桐では「終端行」といいます)になるまで繰り返すこの方法を使用します   * (.not #終端行)これは、終端行でなかったら続ける時に使用します     繰り返し(.not #終端行)       &内容[&i]=[内容],&週数[&i]=[週数],&曜数[&i]=[曜数],&重複[&i]=[重複]       ジャンプ 行番号=次行       &i=&i+1     繰り返し終了     ジャンプ 行番号=先頭   end 手続き定義終了 手続き定義開始 設定チェック()   * 項目集計で、データ件数を調べます。今度は&有効件数にはいります   * 項目有効件数が、「0」つまり、設定されてないとき、読み込みを中止します   * この場合正常に読み込みが行えないため、エラーフラグ(&ch=1)とします   項目集計 [内容]   if(&有効件数=0)     メッセージボックス "定義内容確認",\       "ゴミの日が設定されていません\n修正してください",\       アイコン=!,制御文字展開=する     &ch=1     手続き終了   end   * 有効件数が、配列の大きさより大きかった場合読み込みを中止します   * この場合正常に読み込みが行えないため、エラーフラグ(&ch=1)とします   項目集計 [内容]   if(&有効件数>&配列数)     メッセージボックス "定義内容確認",\       "ゴミの日設定が多すぎます\n修正してください",\       アイコン=!,制御文字展開=する     &ch=1     手続き終了   end   * データ行の中に未定義行があった場合、処理を中止します   ジャンプ 行番号=先頭   繰り返し(.not #終端行)     if(#TRIM([内容],4)=#u .or #TRIM([週],4)=#u .or #TRIM([曜日],4)=#u)       メッセージボックス "入力確認","未定義の項目があります。確認下さい"       &ch=1       手続き終了     end     ジャンプ 行番号=次行   繰り返し終了 手続き定義終了 手続き定義開始 印刷処理()   * 印刷データの書き出し、読み込みを行います   * 印刷ボタンで、&レポートにファイル名を代入したあとこの手続きを呼び出しています   * 変数の内容により、1面に何ヶ月印刷するかを決めています   * "ゴミの日.rpt"の場合2ヶ月分、"ゴミの日4.rpt"は4ヶ月分です   * 変数に代入する値は、今回文字列変数「&レポート」を使用し、"ゴミの日.rpt"・"ゴミの日4.rpt"を代入しています   * 「if文」で、if(&レポート="ゴミの日.rpt")の時、「&面=2」のように代入しています   * これもルールはありません。「if(&面=2)の時、&レポート="ゴミの日.rpt"」のように、書いても問題ありません   変数宣言 自動,整数{&i2,&面}   if(&レポート="ゴミの日.rpt")     &面=2   else if(&レポート="ゴミの日4.rpt")     &面=4   end   * 資料 −−−−−−−−−−−−−−−−−−−−   *   明治 1年 9月 8日 1868/ 9/ 8   *   大正 1年 7月 30日 1912/ 7/30   *   昭和 1年 12月 25日 1926/12/25   *   平成 1年 1月 8日 1989/ 1/ 8   * カレンダーを元号年で印刷するときに、使用しています。レポート4の方では関数で処理を行っています   * データの書き出しを行います。印字処理で書き出します   印字開始 "カレンダー.txt"   * ここの繰り返しは、「&面」の値により異なります   * 年の書き出し時に、&元号=0(西暦表示)の場合と、「1868/ 9/ 8」より年月が小さい場合は強制的に、西暦年を書き出します    * その他は、年によって元号月年を書き出してます   * そのあと、月を書き出します   * 年月を書き出したあとに、変数書き出しを呼び出します   * 印字の処理での出力・・・例:変数 &a="あああ",&b="いいい"の場合   * 印字 &a,&b では、 「あああいいい」と、なります・・・・・@   * 印字 &a,",",&b では、 「あああ,いいい」と、なります ・・・・A   * 印字 &a,",",&b,"," では、 「あああ,いいい,」と、なります・・・・B   * 印字 &a,",",&b,",",では、 「あああ,いいい,」と、なります・・・・C   * @とAの違いは中央の「,」が違いますね。","がもれると、ひとつの続いた長い文章になってしまいます   * BとCの違いは・・・見た目ではわかりませんが・・・答えは少し下に書いてあります   繰り返し &i2=1,&面     if(&元号=0 .or &作業日付0)       印字 &日t[&i3],",",     else       印字 "",",",     end   繰り返し終了     印字 "ch1",",",   繰り返し &i3=1,37     印字 &ごみ[&i3],",",   繰り返し終了     印字 "ch2" 手続き定義終了 手続き定義開始 t作業日付::マウス左ダウン(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)   * マウスイベントで使用しています   if(&元号=0)     &元号=1   else     &元号=0   end   メソッド呼び出し @フォーム.変数変更()   *  メソッド呼び出し @フォーム.描画更新() 手続き定義終了 手続き定義開始 t説明::マウス左ダウン(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)   * マウスイベントで、詳しいヘルプを出したいとき利用します   * 「\n」・・制御文字といって、改行したいときに利用します   メッセージボックス "   ◇◆◇ 入力方法 ◇◆◇",\     "・内容・・・\n  半角換算「9桁以内」(全角文字も使用できます)\n\n"+ \     "・週・・・・\n  毎週は、「毎週」。他は、数字入力\n  毎週は、1〜5に修正されます。\n\n"+ \     "・第2・第4等の入力は・・\n  それぞれ2行に分けて入力",\     アイコン=i,制御文字展開=する 手続き定義終了 手続き定義開始 t作業日付::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)   * マウスイベントで使用しています   if(&元号=0)     &元号=1   else     &元号=0   end   メソッド呼び出し @フォーム.変数変更()   *  メソッド呼び出し @フォーム.描画更新() 手続き定義終了