記事閲覧

− 野ざらし言 −

4566 選択曜日の指定範囲の日付を出力

めざら 2019/11/13(Wed) 21:39 http://mezala.la.coocan.jp/
仕事で予定表を作る都合で,一月分の日付リストを出力するマクロを作り,
その後,出力する曜日を選択できるメニューを装備させてみたものです.
今日,メニューの項目の値を全反転する機能を付加したので上げました.

= Datelstw.def v0.20 = by H_ear
#if 0
選択曜日の指定範囲の日付を出力
 ON/OFFメニューのテスト
#endif
* mad for vz!
1 ^\ "" ?.
        (mb || mr==$80)?{ &m("! View/Block mode") . }
        mi[-,
        JU[, JU=$7F+$80,                ;#DEF 初期設定可
                ; +1=日; +2=月; +4=火; +8=水; +16=木; +32=金; +64=土
                ;初期設定は全ビットON, 各ビットで制御可能
                ;; bit 0  1  2  3  4  5  6  7 
                ;;     fa fb fc fd fi fj fx fy
                ;;     日 月 火 水 木 金 土 1ヶ月限定出力フラグに使用
                ;;用途に合わせて on/off しておくことも可能
                ;;例えば,月水木土のみ出力なら JU=$5A+$80 など.
        ax=$2A00, &i($21)               ;当日取得
        ; ---- 年/月入力 ----
 :a     &g("年 [CR]:当年") y=r,         ;<y>年取得
        (r==-1 || r==0)?{ &m("") >z }   ;[ESC] or 数値でないなら終了
        (r==-2)?{ y=cx, }               ;[CR]:当年
 :b     &g("月 [CR]:1-12月") m=r,       ;<m>月取得
        (r==-1)?{ &m("") >z }           ;[ESC]なら終了
        (r==-2)?{ m=1, fy!, }           ;[CR]:1年分
 :c     (m<0 || m>12)?{ >b }            ;範囲外なら再入力を促す

        ;JUを使うことで以下の代入を省略できる
        ;fa=(o&1>0), fb=(o&2>0), fc=(o&4>0), fd=(o&8>0),
        ;fi=(o&16>0), fj=(o&32>0), fx=(o&64>0),
        ;o=fa+fb*2+fc*4+fd*8+fi*16+fj*32+fx*64,
        ; ---- menu ----
 :l     !01
        (r>7)?>R                        ;OKで抜ければrun
        (r>6)?{ JU^=$7F,  >l }          ;全反転
        (r+1)??{ &m("Cancel") >z }      ;r=-1 なら[ESC]
        >l

 :R     ; ---- run ----
        n=31, &00 (n>r.m)?n=r.m,        ;<n>月の日数確定

        ; ---- 朔日の曜日を確定 ----
        ; <-- y,m,d
        ; --> w
        d=1, &01                        ;<d>朔日を渡して<w>曜日を取得

        ; ---- 出力 ----
        #< (ct!=1)?#n                   ;空行出力(オートインデント対応)
 :n                                     ;(n){ ループ内に条件分岐は使えない
        &02                             ;wに応じたビットの値を評価させる
        ;fa==1, fb==2, fc==4, fd==8, fi==16, fj==32, fx==64,
        (r)?{
        &s      ;; ---- 書式カスタマイズ可能 ----
        ;       &?("%4d/%02d/%02d (%2s)",y,m,d,"日月火水木金土"+w*2) #m
        ;       &?("%4d-%02d-%02d (%2s)",y,m,d,"日月火水木金土"+w*2) #m
                &?("%4d%02d%02d (%2s)",y,m,d,"日月火水木金土"+w*2) #m
        }
        &d d++, w=(w+1)%7,
        (n--)?>n                                ;} 擬似ループの末尾

        ; ---- 連続処理 ----
        (fy)?{ &a("次の月を出力します") }?r+,
        (r>0)?{
                m++,
                (m>12)?{
                        (fy)??>q
                        m=1, y++,
                }
                >R
        }

 :q     ; ---- quit ----
        #g                      ;余分な改行を削除
 :z     ; ---- exit ----
        JU], mi],
        &d #] .

00:     ; ---- 日の整合性確認 ----      ;from calendar.def
        r=" $(1f,1c,1f,1e,1f,1e,1f,1f,1e,1f,1e,1f,)",   ;Yushi(__)
;       _______1__2__3__4__5__6__7__8__9__a__b__c       ;month
        (y%4==0 && (y%100!=0 || y%400==0))?r.2=29, ?r.2=28,     ;閏年
        (r)

01:     ; ---- 指定日の曜日を算出(ツェラーの式) ----
        ;1,2月を前年の13,14月として計算する
        ;グレゴリオ暦採用の1583年以降に対応する
        m[, y[,
        (m<3)?{ y--, m+=12, }   ;Zeller(__)
        w=((y+ y/4+ y/400+ (m*13+8)/5+ 1- y/100) +d -1) %7,
        y], m],

02:     ;wに応じたビットが立っているか評価した値を持って戻る
        (w)>?{ (JU&1) (JU&2) (JU&4) (JU&8) (JU&16) (JU&32) (JU&64) }

* popup menu
1 "曜日選択",12,9,4
        "N 日",fa
        "G 月",fb
        "K 火",fc
        "S 水",fd
        "M 木",fi
        "I 金",fj
        "D 土",fx
        "A 全反転"
        "OK"
*

[Variables]
        y,m,d,w 年月日曜
        n       カレント月の日数
        JU
         fa,fb,fc,fd,fi,fj,fx   曜日選択フラグ
         fy     1年分出力フラグ
[Buffers]
                
[History]
2018/03/04 0.10 初版
2019/11/13 0.20 メニューに全反転を追加
[Notes]
月水金なら EU&=1~ で偶数切捨てになるが使えるか?
on/offなら表示用文字列設定不要.「日$(9)off on」なんてする必要なかった.

関連記事一覧ツリー (▼ を押すとツリー全体を一括表示します)

- 4566.選択曜日の指定範囲の日付を出力 - めざら 19/11/13-21:39

返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

おなまえ :
Eメール :
タイトル :
メッセージ: 通常モード(推奨)  整形モード(非推奨)  preモード(空白再現)
※ プログラムコード等を含まない場合は,できるだけ通常モードをご利用ください。

参照先 :
暗証キー: (英数字で8文字以内) プレビューなし


- 以下のフォームから自分の投稿記事を修正・削除することができます -

処理 記事No. 暗証キー