カレンダーを作る
その3 日付の色を変える
前回,曜日を表示させることを行いました。
今回は,
・ 日曜日の日付の色を赤にして,土曜日の日付を青にする。
・ 月と西暦の表示をする。
ことなどをしていきます。
日付の色を変える
これは前回,「日」〜「土」の曜日を書き込んだときと同じようにしていきます。
つまり日付を書き込むときのX座標が1のときはフォントの色を赤にして,7のときは青にします。そしてそれ以外のときは黒にしていきます
月と西暦の表示
このプログラムでは,味も素っ気もなく表示させただけですが,この表示の仕方でだいぶ雰囲気も変わってくると思います。
ちなみに月を表示させた場所は横方向は中央で縦方向は20等分した3段目です。そして西暦を表示させた場所は,横方向が5等分した4番目で,縦方向は最上部です。
また月の表示は「1月」,「2月」…といった表記で行っていますが,英語表記などもできますのでいろいろ試行錯誤しながら試して見てください。
これらのプログラムは,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 14; //フォントの大きさをsizeの14分の1にする
font.Color:=clblue; //フォントの色を青にする
textout(size div 2 -textwidth(mo+'月') div 2, //X座標は中央
size*3 div 20-textheight(mo+'月') div 2, //Y座標は20分の3の部分
mo+'月'); //
//西暦の書き込み
font.Size:=size div 22; //フォントの大きさをsizeの22分の1にする
font.Color:=clblue; //フォントの色を青にする
textout(size*4 div 5-textwidth(ye+'年') div 2,0,ye+'年');
//X座標は左から5分の4のところ,Y座標は0に書き込む
font.Size:=size div 20; //フォントのサイズをsizeの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;
//小の月大の月閏年の判別終了
//日付の色を変える
case (week+i-2) mod 7+1 of //日付を書き込むX座標による場合分け
1:font.Color:=clred; //1のときはフォントの色を赤にする
7:font.Color:=clblue; //7のときはフォントの色を青にする
else font.Color:=clblack; //それ以外は黒にする
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;
ここまでのプログラムを実行すると下のようになります。

以上で,カレンダーを表示させることができました。
次回からは,form2を新規作成し,カレンダーの設定を変えられるようにしたいと思います。