MonthCalenderで、定休日を表示するために、たとえば月曜日の全ての日の文字を赤く(もしくは薄く)表示したいのです。
方法をご教授頂けると幸いです。
色は変えられないけど、BoldDaysを使えば各月の複数の特定の日を太字にすることは出来るよ。
解決していませんし、検証してませんけど。
https://www.petitmonte.com/bbs/answers?question_id=4771
太字なら様、TS様、ご返信ありがとうございます。色々四苦八苦やってます。
https://www.petitmonte.com/bbs/answers?question_id=3533
の過去ログを読んで、月曜日の獲得に成功したのですが、MonthCalenderのMonthCalendar1GetMonthInfoで前の月に移動したか、次の月に移動したか、判断する方法はないでしょうか? 前の月に戻りながらカレンダーを進めていくと1月と12月が月曜日を休日としてくれないバグが出てまして。
それと、MonthCalendar1.BoldDaysはMonthCalendar1GetMonthInfoメソッド以外では利用できないのでしょうか?
MonthCalendar1Clickの中で全て処理できると一気に解決できるのですが。
どうぞ、よろしくお願いします。ソース提示が必要な場合、ソースを出しますので。
なぜか上手くいかないので、ソースを貼りつけさせて頂きます。
TMonthCalendarを一個貼りつけて、Tmemoを二つ貼りつけて
TmonthCalenderのOnGetMonthinfoイベントに下記のソースを貼りつけたら使えます。
mae_Monthが正しく動いてない感じなんですよね。意見頂けると嬉しいです!!
private
{ Private 宣言 }
mae_month,Month_i:integer;
procedure TForm1.MonthCalendar1GetMonthInfo(Sender: TObject;
Month: Cardinal; var MonthBoldInfo: Cardinal);
const
week: array[1..7] of string = ('日曜日','月曜日','火曜日','水曜日','木曜日',
'金曜日','土曜日');
var
d, today: TDateTime;
iw: integer;
Day_I,Seireki_I:integer;
begin
//====================================================
//定休日を太字にする
//====================================================
memo1.Clear;
Seireki_I:=strtoint(copy(DateToStr(MonthCalendar1.date),0,4));
Mae_month:=Month_I;
Month_i:=Month;
//Month_i:=strtoint(copy(DateToStr(MonthCalendar1.date),6,2));
if (Mae_month=12) and (Month_I=1) then
begin
inc(seireki_I);
end;
if (Mae_Month=1) and (Month_i=12) then
begin
dec(seireki_I);
end;
d := VarToDateTime(inttostr(Seireki_I)+'年'+inttostr(Month_i)+'月'+'1日');
iw := 0;
repeat
inc(iw);
until week[iw] ='月曜日';
while DayOfWeek(d) <> iw do d := d+1;
case Month_I of
1,3,5,7,8,10,12:
begin
Day_I:=31;
end;
2:begin
Day_I:=28;
end;
4,6,9,11:
begin
Day_I:=30;
end;
end;
today := VarToDateTime(inttostr(Seireki_I)+'年'+inttostr(Month_I)+'月'+inttostr(Day_I)+'日');
while d<=today do
begin
Memo1.Lines.Add(DateTimeToStr(d));
d := d+7;
end;
memo2.clear;
//太字にする
for iw:=0 to Memo1.Lines.Count-1 do
begin
memo2.Lines.add(copy(memo1.lines.strings[iw],9,2));
end;
//===========================================
//太字にする
if Memo1.Lines.Count=4 then
begin
MonthCalendar1.BoldDays([strtoint(memo2.lines.strings[0]),strtoint(memo2.lines.strings[1]),strtoint(memo2.lines.strings[2]),strtoint(memo2.lines.strings[3])], MonthBoldInfo);
end;
if Memo1.Lines.Count=5 then
begin
MonthCalendar1.BoldDays([strtoint(memo2.lines.strings[0]),strtoint(memo2.lines.strings[1]),strtoint(memo2.lines.strings[2]),strtoint(memo2.lines.strings[3]),strtoint(memo2.lines.strings[4])], MonthBoldInfo);
end;
end;
真琴:「ずいぶん悪戦苦闘してるみたいだね、ミサトさんは」
春子:「もしかして、ドツボにハマったかな?」
真琴:「ねぇ、ハルコさん、ナンで上手くいかないンだろう…」
春子:「それはネ、月移動した時にGetMonthInfoハンドラが呼ばれるのは1回だけじゃないからヨ」
真琴:「えっ、そうなの? じゃ、何回呼ばれるの?」
春子:「最低でも3回、その度に Month引数の値が変るのよ」
真琴:「それなら、↓このリンクの年対応のGetMonthInfoExイベントはどうなの?」
https://www.petitmonte.com/bbs/answers?question_id=4771
春子:「その場合も同じ、でも Year引数があるから、それ使えばOK」
真琴:「そっか、じゃぁ、それで問題解決?」
春子:「ところが、そうもいかないンだな、そのサンプルにも一つバグがあって…」
真琴:「やっぱり、出来そうで出来ないってコト?」
春子:「そんなコトないよ、マコト、そのバグを直せばイイんだから」
真琴:「一難去っても、また一難来るってコトワザ通りなのねぇ」
春子:「ま、ドツボから抜け出せればダイジョウV」
真琴:「そのオヤジギャグ、どっかで聴いたよな〜…」
ダイジョウVさんありがとうございます。
https://www.petitmonte.com/bbs/answers?question_id=4771
のyear関数でなんとか形になりました。しかし、カレンダーの置き場所がタブシートの上なのですよね。
ですので、TMonthCalendarExをコンポーネントとしてしまいたいのですが、私にはコンポーネントを作る知識がありません。分かり易い方法など、ありましたらご教授頂けると幸いです。
それと、ダイジョウVさんが仰ってるバグがあるというのも気になる所なのですが……。
真琴:「ハルコさん、アタシうっかりしてた、今思い出した…」
春子:「ン? 思い出した? ナニを?」
真琴:「カイトさんが、前に…じゃなかった、"未来"に教えてくれたコト」
春子:「ややこしい言い方だよね、一体ナンなの?」
真琴:「曜日を指定してその色を自由に変えられる"MonthCalendarEx"コンポがあるの」
春子:「そのコンポを作ったのがカイトさん? でも今はまだ出来てナイんじゃない?」
真琴:「そぅ、カイトさんが作って…今もあると思う、確か…↓ココからDL出来るハズよ」
http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01
春子:「だけど、勝手にDLして使うのはマズいよね? 一応、了解とらなきゃ」
真琴:「大丈夫、それはOKって"未来"に言ってたから、…こんなカンジで使うの」
procedure TForm1.FormCreate(Sender: TObject);
begin
with MonthCalendarEx1 do begin
Colors.HolidayColor := clFuchsia; // 日曜、休日の色(デフォルト=clRed)
Colors.ReserveColor := clLime; // 定休日の色(デフォルト=clAqua)
RegularHolidays.Add(2); // 定休日の曜日指定(2〜7) 月曜=2
GradientTitle := True; // タイトル部分をグラデーション表示
end;
end;
春子:「DLしてインストールしたら [Samples]ページに入ったよ、で、貼り付けて…」
真琴:「ね? 月曜日が緑色になるでしょ? タイトルもグラデーションでイイ感じ」
春子:「そうネ、これを更に自分好みに改造すれば、コンポ作成の勉強とかにもなるし、…ところで、マコト」
真琴:「ナニ? ハルコさん」
春子:「もうすぐ夏休みも終わるけど、また夏の始めに戻りたいナンて思ってない?」
真琴:「アタシ、もうそんなコト思わないよ」
春子:「ン? マコトもこの暑さにはマイッタのかな?」
真琴:「そうじゃないよ、だって、今の夏が終わらないと、次の夏も来ないじゃん」
春子:「次の夏? あぁ〜、来るのはBeachBoyの二人だっけ? それがカイトさん達?」
真琴:「うん、待ち遠しいな〜来年が…」
春子:「ねぇ、マコト、その二人はどんな? イイ感じ?」
真琴:「そぅ…、俳優で言えば、竹之内豊と反町隆史に似てるかなぁ〜」
春子:「え? そんなにイイ男なの? それはアタシも楽しみ^^」
真琴:「でもネ、結局、二人ともハルコさんにはホレなかったの」
春子:「そんなの、アタシの魅力で変えてみせるよ、マコト」
真琴:「ハルコさん、勝手にストーリー変えないでよ^^;; でも、"大奥"の"滝山"って色っぽいよネ」
春子:「マコトの"元ヤンキー"はチョット無理があるかな?」
イイ感じ様、それと"MonthCalendarEx"コンポーネントの作者カイト様に心から感謝します!!!
ソースコード読んで勉強させてもらいます!
今回のことで自分の力不足をしみじみ感じたので、コンポーネント作成ぐらい出来るように勉強しておきます。
ご意見くださった皆様ありがとうございました!
またよろしくお願いします。
≪カイトのマンション≫
桜 :「明けましておめでとう、カイト、ピザ買ってきたけど食べる?」
海都:「あ、サクラ、おめでとう、…ピザ? サンキュ、鍵は開いてるから入って」
桜 :「外はイイお天気よ、ちょっと寒いけど…、お正月なのにパソコンで何してるの?」
海都:「年末までズット仕事忙しくてヒマがなくて…、で、久しぶりに自分のコト」
桜 :「あ…、このグラデーションのカレンダー、アタシの友達も使ってたよ」
海都:「えっ? 前に作ったのをオレのWEBページにUPしておいたんだけど、サクラにも教えてなかったよね? 検索で見つけたのかな?」
桜 :「そうみたい、やっぱりカイトだったのね、サイトのURL見て、もしかしたらって思ったけど」
海都:「でも、それはメモリーリークのバグもあったし、まだ祝日の設定も無くて未完成だったから、手直しをしてたんだ」
桜 :「だけど、祝日って、年ごとに日がズレたりして、ちょっと面倒じゃない?」
海都:「そうなんだ、祝日法が何度も改正されてるから、過去の祝日を正しくするのはかなり大変だったよ」
桜 :「春分の日、秋分の日もズレることあるよね? それは大丈夫?」
海都:「2000年からの百年間はキチンと計算してるけど、それ以外は今のところ3月21日、9月23日に固定、天文には詳しくないんで^^;」
桜 :「それでも、1998年と1999年は大丈夫ね」
海都:「あと、日付けにチェックマークを重ねることも出来るよ、こんなカンジで」
procedure TForm1.FormCreate(Sender: TObject);
begin
with MonthCalendarEx1 do begin
Colors.MarkDayColor := clFuchsia; // マーク日(太字)のデフォルト色
MarkDays.Add(2009,4,29); // 年を指定すると、その年だけ
MarkDays.Add(2009,4,30); // (2009年のゴールデンウィーク連休をマーク)
MarkDays.Add(2009,5,01);
MarkDays.Add(2009,5,02);
MarkDays.Add(2009,5,03);
MarkDays.Add(2009,5,04);
MarkDays.Add(2009,5,05);
MarkDays.Add(2009,5,06);
MarkDays.Add(3,3); // 年を指定しないと、毎年恒例
MarkDays.Add(5,22);
RegularHolidays.Add(wnSAT); // 定休曜日 wnSUN(日)〜wnSAT(土)か, 1(日)〜7(土)
end;
end;
http://kaito.es.land.to/img/_Demo1.png
桜 :「カワイイ、カラフルなカレンダーね、このチェックマークの色は緑だけ?」
海都:「マークの色は MarkBmpColorプロパティで、青か赤にも変えられる」
桜 :「カレンダーの月を変えると、並んでる別のカレンダーの月も連動して変るのね」
海都:「そう、この3個のカレンダーは GroupIndexを0以外の同じ値にしてあるから」
桜 :「あれ? 2004年の海の日が7月20日になってないよ? 間違いじゃない?」
海都:「2003年からハッピーマンデー法の第2弾が適用されるからソレでいいんだ」
桜 :「2003年に? ずいぶん先の話ね、でも何でそんな先のコトまで知ってるの?」
海都:「あっ、その説明をすると話がややこしくなるから、サラッと聞き流して^^;」
桜 :「そう? ねぇ、日付の右クリックで PoupMenuを出して、その日にマークを付けたり消したり出来たら便利じゃない?」
海都:「うん、オレもそうするつもりだけど、今日はそこまでやる時間ないな」
http://kaito.es.land.to/img/_Demo2.png
桜 :「そうそう、先にこのピザ食べない? 今日は初詣に行く約束だったでしょ?」
海都:「忘れてないよ、一応仕上がったんで、これをUPLOADしてから食べるよ、その後で初詣に行こう」
http://kaito.es.land.to/lime/lime.cgi?MonthCalendarEx01
桜 :「ねぇ、カイトは何を神様にお願いするの?」
海都:「う〜ん、"今年は大きなプロジェクトを任されますように"ってお願いしようかな?」
桜 :「アタシのお願いは仕事のことじゃなくて、"今年も健康でありますように"」
≪民宿ダイヤモンド・ヘッド≫
春子:「マコト、明けましてオメデトウさん、すがすがしい元旦だね」
真琴:「明けましておめでとうございます、ハルコさん、今なぜか懐かしい気分なの、アタシ」
春子:「それは当然じゃない? 二年前に戻ったマコトが今年の新年を迎えるのは二回目だもん」
真琴:「え?言ってる意味が分からないけど…"二年前に戻った"ってナンのコト? ハルコさん」
春子:「マコト、マジ? 二年前に戻ったコト忘れちゃったの?」
明けましておめでとうございます!
>ピンポ〜ン、明けおめ…さん
カレンダーの更新お疲れ様です!
祝日が色づけされるのは便利ですね!
使わせて頂きますね(^^)
ありがとうございます!
ツイート | ![]() |