カレンダーを作成していて、翌月や先月のボタンでその月のカレンダーが
表示されるように作っているのですが、1月からの先月や12月からの翌月で
去年の12月や来年の1月にするにはどうしたらよいのでしょうか?
あまりにも簡単な質問でスミマセン。
バージョンはいくつでしょうか?
TDate型変数なら、IncMonth関数で先月・次月の日付を取り出せます。
どのようにしているかを見せた方が、回答は早いと思います。
>HOta
バージョンは6,0です。
ご指摘ありがとうございます。
procedure TForm1.FormShow(Sender: TObject);
begin
label1.Caption:=inttostr(calendar1.year) + '年';
label2.Caption:=inttostr(calendar1.month) + '月';
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
calendar1.month:= calendar1.Month-1;
label2.Caption:= inttostr(calendar1.Month) + '月';
if calendar1.month < 1 then
begin
calendar1.month:= 12;
calendar1.year:= calendar1.year-1;
label1.Caption:= inttostr(calendar1.year) + '年';
end;
end
calendar1.monthが1になるとそれ以上減ることができず、
何も動かない状態になります。
ifで定義するのにこれでいいかと思ったんですがやっぱり無理でした。
calender1って何でしょう?
SamplesのTCalenderならNextMonth/NextYear/PrevMonth/PrevYearメソッドを使えばよいと思いますが。
>かみづさん
本当に申し訳ございませんが、記述の仕方を教えていただけますか?
その前にこちらの質問に答えてもらえますか。
変数名だけ教えられても何のインスタンス変数かわからなければ意味がありませんので。
TCalenderであればPrevMonthメソッドを呼び出すだけなので記述の仕方も何もないので、別のものを使用されているのだと思いますが。
何か、年の切り替え時に苦慮されているような。
単に次月・先月を設定したいだけならややこしい変数など使わずに
私なら、こうやるかな・・・
uses DateUtils;
var
{年月設定の基準変数}
FDate :TDate;//適当な箇所で適当に初期化しておいてね
procedure TForm1.BottonClick(Sender :TObject);
begin
if Sender = Button1 then //次月
begin
FDate := IncMonth(FDate,1);
end else if Sender is Button2 then //先月
begin
FDate := IncMonth(FDate,-1);
end;
Label1.Caption := IntToStr(YearOf(FDate)) + '年';
Label2.Caption := IntToStr(MonthOf(FDate)) + '月';
end;
目くら打ちなのでご勘弁を・・・
トーシローさん
もし、TCalendarを使っているなら、ボタンなどのOnClickで
calendar1.PrevMonth; //前月
calendar1.NextMonth; //前月
になります。年をまたいでも自動で年が変わります。
calendar1が何なのかを知らせて下さい。
>かみづさん
どうも大変失礼致しました。申し訳ございません。
calendar1はTCalendarのことです。
NextMonth、PrevMonthを使って月の増減はできたのですが、
12月を超えて1月になっても年の変化が起きなかったので
どうしてよいのかわかりませんでした。
わかりづらい記述と説明、大変失礼致しました。
>syakeさん
ご丁寧にありがとうございます。
一度試してみましたが、なぜかうまくいきません。
そしてなぜうまくいかないのか自分にはわかりません。
大変申し訳ないです。
>HOtaさん
HOtaさんもすいません。使用しているのはTCalendarです。
年をまたいでも自動で年が変わるとのことですが、
何か特別な設定でも必要ですか?自分のDelphiでは
年をまたいでも何の変化もないのですが…。
試してみました。
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
Calendar1.PrevMonth;
Label1.Caption := FormatDateTime('yyyy/mm/dd',
EncodeDate(Calendar1.Year,Calendar1.Month,Calendar1.Day));
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Calendar1.NextMonth;
Label1.Caption := FormatDateTime('yyyy/mm/dd',
EncodeDate(Calendar1.Year,Calendar1.Month,Calendar1.Day));
end;
後、
---
procedure TForm1.Button1Click(Sender: TObject);
begin
calendar1.month:= calendar1.Month-1;
label2.Caption:= inttostr(calendar1.Month) + '月';
if calendar1.month < 1 then // ※これが成立つことはないのでは?
begin
calendar1.month:= 12;
calendar1.year:= calendar1.year-1;
label1.Caption:= inttostr(calendar1.year) + '年';
end;
end
年は自動的に変わっても、表示は自分でしなおさないとダメです。Form1にTCalendarとTButton×2を置いて、ボタンのクリックイベントを次のようにしてみて下さい。
procedure TForm1.Button1Click(Sender: TObject);
begin
//カレンダーに前の月を表示
Calendar1.PrevMonth;
//タイトルバーに日付を表示
Caption := IntToStr(Calendar1.Year) + '/' + IntToStr(Calendar1.Month) + '/' + IntToStr(Calendar1.Day);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//カレンダーに次の月を表示
Calendar1.NextMonth;
//タイトルバーに日付を表示
Caption := IntToStr(Calendar1.Year) + '/' + IntToStr(Calendar1.Month) + '/' + IntToStr(Calendar1.Day);
end;
すみません、かぶっちゃったので自分で増減させる方法。
procedure TForm1.Button1Click(Sender: TObject);
begin
with Calendar1 do begin
if Month=1 then begin
Month := 12;
Year := Year-1;
end else begin
Month := Month-1;
end;
Form1.Caption := IntToStr(Year) + '/' + IntToStr(Month) + '/' + IntToStr(Day);
end;
end;
TCalenderであれば最初のコードのButton1Clickを
calender1.PrevMonth;
FormShow(nil);
で動作すると思います。
#もちろんFormShowの処理は別メソッドに切り出した方がよいと思います。
ただTCalenderよりTMonthCalenderの方が見た目がいい気がしますが
D6にはないんでしたっけ。
これでOKです。年は自動で変わります。
//次月
procedure TForm1.Button1Click(Sender: TObject);
begin
Calendar1.CalendarDate := IncMonth(Calendar1.CalendarDate,1);
end;
//前月
procedure TForm1.Button1Click(Sender: TObject);
begin
Calendar1.CalendarDate := IncMonth(Calendar1.CalendarDate,-11);
end;
>通りすがりさん
わざわざありがとうございました!
自分が記入していたのは自分が考えて書いたものですので、みなさんからすればありえないような記入も普通にしてしまってます。申し訳ございません。
>F.N.さん
わざわざ二回にわたるご丁寧な説明ありがとうございました!
大変わかりやすくて助かりました。
>かみずさん
数回にわたるご指導ありがとうございました!
どうやらD6にはおっしゃっているTMonthCalenderはないようです。
>HOtaさん
何度もご丁寧にありがとうございました!
>みなさん
素人の私の質問にこんなにたくさんの方がご丁寧に答えていただき、
ありがとうございました。また何かわからないことがあれば恐れ入りますが
この掲示板を利用させていただきます。
みなさん本当にありがとうございました!
> どうやらD6にはおっしゃっているTMonthCalenderはないようです。
わたしの D6per にはありますね。これってウィンドウズのコモンコントロール
だから、だいたいあるんじゃないの
ツイート | ![]() |