−トップへ−

カレンダーを作る
その2 閏年などの設定と曜日などの表示

 前回,月の日付を表示させることを行いました。
 今回は,
  ・ 「大の月」や「小の月」,閏年などに対応させる
  ・ 「日」〜「土」の表示をする
 ことなどをしていきます。

「大の月」や「小の月」,閏年などに対応させる

 まず,「大の月」や「小の月」の設定ですが,これは「mo」が小の月なら「31」の数字を書く前にプログラムを終了させます。
 同じように「mo」が2のときは,「30」の数字を記述する前にプログラムを終了し,閏年でないなら「29」の数字を記述する前に終了させます。

 閏年であるかどうかを判断するのに,「IsLeapYear」という関数があるのですが,ここではプログラムを書いてみます。
 まず,閏年の算出方法ですが,
  1 西暦が4で割り切れれば閏年。
  2 西暦が100で割り切れれば閏年ではない。
  3 西暦が400で割り切れれば閏年。
の3点です。

曜日を書き込む

 次に「日」〜「土」の曜日を書き込んでみます。
 曜日を書き込むX座標は数字のときの同じです。Y座標ですが,数字は高さを10等分した4〜9段目に書き込んだので,3段目に書き込めばよいわけです。しかし今回は3段目よりもう少し上に書き込んでみます。具体的には高さを20等分した5段目です。

 下のプログラムでは,曜日と数字の間に区切り線を引いてあります。幅は16等分した1〜15番目までにして,高さを3等分した1番目のところに引いてあります。

 これらのプログラムは,makecプロシージャに書き込みます。

 procedure TForm1.makec;
  var
   i,week:integer;
 begin
  form1.ClientWidth:=size;
  form1.ClientHeight:=size;
  image1.Left:=0;
  image1.Top:=0;
  image1.Width:=form1.ClientWidth;
  image1.Height:=form1.ClientHeight;
 
  week:=dayofweek(strtodate(ye+'/'+mo+'/1')); //“今月”の始まりの曜日を求める
  with image1.Canvas do begin
   brush.Color:=clwhite; //塗りつぶしの色を白にする
   fillrect(image1.ClientRect); //image1全体を塗りつぶす
   brush.Style:=bsclear; //塗りつぶしのスタイルを文字だけの塗りつぶしにする
     //これをbssolidにすると文字の周りをbrush.colorで指定した色で塗りつぶします。
   font.Size:=size div 20; //フォントのサイズをimage1の幅の20分の1にする
                    //この大きさはいろいろ試して見てください。
    //曜日の書き込み
   for i:=1 to 7 do begin //曜日を書き込むため7回繰り返す
    case i of
     1:begin
       font.Color:=clred; //フォントの色を赤にして
       str:='日'; //文字を「日」にする。この文字を「Sun」にすることもできます。
      end;
     2:begin
       font.Color:=clblack; //月〜金はフォントの色を黒にする
       str:='月';
      end;
     3:begin
       font.Color:=clblack;
       str:='火';
      end;
     4:begin
       font.Color:=clblack;
       str:='水';
      end;
     5:begin
       font.Color:=clblack;
       str:='木';
      end;
     6:begin
       font.Color:=clblack;
       str:='金';
      end;
     7:begin
       font.Color:=clblue; //土曜日はフォントの色を青にする
       str:='土';
      end;
    end;
    textout(size*((i-1) mod 7+1) div 8 -textwidth(str) div 2,
        size*5 div 20-textheight(str) div 2,
        str); //曜日を書き込む
   end;
    //曜日の書き込み終了

    //区切り線を入れる
   pen.Color:=clblack; //ペンの色を黒にする
   pen.Width:=2; //ペンの太さを2にする
   moveto(size*1 div 16,sizet*1 div 3); //X座標は16等分した1〜15まで
   lineto(size*15 div 16,size*1 div 3); //Y座標は3等分した1番目の場所
    //区切り線を入れる終了

   for i:=1 to 31 do begin //1日から31日まで繰り返します
     //小の月大の月閏年の判別
    case i of
     29:if mo=2 then begin //29日のとき
       if ye mod 4 >0 then begin
        exit; //4で割りきれなければ閏年でないので終了
       end else begin
        if (ye mod 100=0) and (ye mod 400>0) then exit;
       end; //100で割り切れて,400で割り切れれば閏年でない
       end;
     30:if mo=2 then exit; //30日のとき2月であれば終了
     31:begin //31日のとき
       if mo<=7 then begin
        if mo mod 2=0 then exit;
       end else begin
        if mo mod 2=1 then exit;
       end; //小の月であれば終了
      end;
    end;
     //小の月大の月閏年の判別終了
    font.Color:=clblack; //フォントの色を黒にする
    textout(size*((week+i-2) mod 7+1) div 8 -textwidth(inttostr(i)) div 2,
        size*((week+i-2) div 7+4) div 10-textheight(inttostr(i)) div 2,
        inttostr(i)); //日付を書き込む
   end;
  end;
 end;

 ここまでのプログラムを実行すると下のようになります。
 

 次回は,日曜日の日付の色を赤にして,土曜日の日付を青にしてみます。
 さらに月と西暦の表示をしてみます。

−トップへ−