カレンダーを作る
その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;
ここまでのプログラムを実行すると下のようになります。

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