ド素人の質問です。

解決


トーシロー  2006-09-10 03:39:54  No: 23194

カレンダーを作成していて、翌月や先月のボタンでその月のカレンダーが
表示されるように作っているのですが、1月からの先月や12月からの翌月で
去年の12月や来年の1月にするにはどうしたらよいのでしょうか?
あまりにも簡単な質問でスミマセン。


HOta  2006-09-10 05:07:56  No: 23195

バージョンはいくつでしょうか?
TDate型変数なら、IncMonth関数で先月・次月の日付を取り出せます。
どのようにしているかを見せた方が、回答は早いと思います。


トーシロー  2006-09-10 07:44:05  No: 23196

>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で定義するのにこれでいいかと思ったんですがやっぱり無理でした。


かみづ  2006-09-10 08:16:57  No: 23197

calender1って何でしょう?
SamplesのTCalenderならNextMonth/NextYear/PrevMonth/PrevYearメソッドを使えばよいと思いますが。


トーシロー  2006-09-10 09:10:22  No: 23198

>かみづさん
本当に申し訳ございませんが、記述の仕方を教えていただけますか?


かみづ  2006-09-10 21:48:05  No: 23199

その前にこちらの質問に答えてもらえますか。
変数名だけ教えられても何のインスタンス変数かわからなければ意味がありませんので。

TCalenderであればPrevMonthメソッドを呼び出すだけなので記述の仕方も何もないので、別のものを使用されているのだと思いますが。


Syake  2006-09-11 17:31:22  No: 23200

何か、年の切り替え時に苦慮されているような。
単に次月・先月を設定したいだけならややこしい変数など使わずに
私なら、こうやるかな・・・

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;
目くら打ちなのでご勘弁を・・・


HOta  2006-09-12 05:38:07  No: 23201

トーシローさん
もし、TCalendarを使っているなら、ボタンなどのOnClickで

  calendar1.PrevMonth;   //前月
  calendar1.NextMonth;   //前月
になります。年をまたいでも自動で年が変わります。

calendar1が何なのかを知らせて下さい。


トーシロー  2006-09-12 11:19:37  No: 23202

>かみづさん
どうも大変失礼致しました。申し訳ございません。
calendar1はTCalendarのことです。
NextMonth、PrevMonthを使って月の増減はできたのですが、
12月を超えて1月になっても年の変化が起きなかったので
どうしてよいのかわかりませんでした。
わかりづらい記述と説明、大変失礼致しました。

>syakeさん
ご丁寧にありがとうございます。
一度試してみましたが、なぜかうまくいきません。
そしてなぜうまくいかないのか自分にはわかりません。
大変申し訳ないです。

>HOtaさん
HOtaさんもすいません。使用しているのはTCalendarです。
年をまたいでも自動で年が変わるとのことですが、
何か特別な設定でも必要ですか?自分のDelphiでは
年をまたいでも何の変化もないのですが…。


通りすがり  2006-09-12 18:53:41  No: 23203

試してみました。

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


F.N.  2006-09-12 18:57:00  No: 23204

年は自動的に変わっても、表示は自分でしなおさないとダメです。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;


F.N.  2006-09-12 19:05:01  No: 23205

すみません、かぶっちゃったので自分で増減させる方法。

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;


かみづ  2006-09-13 06:51:58  No: 23206

TCalenderであれば最初のコードのButton1Clickを
calender1.PrevMonth;
FormShow(nil);
で動作すると思います。
#もちろんFormShowの処理は別メソッドに切り出した方がよいと思います。

ただTCalenderよりTMonthCalenderの方が見た目がいい気がしますが
D6にはないんでしたっけ。


HOta  2006-09-13 21:39:20  No: 23207

これで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;


トーシロー  2006-09-14 10:30:04  No: 23208

>通りすがりさん
わざわざありがとうございました!
自分が記入していたのは自分が考えて書いたものですので、みなさんからすればありえないような記入も普通にしてしまってます。申し訳ございません。

>F.N.さん
わざわざ二回にわたるご丁寧な説明ありがとうございました!
大変わかりやすくて助かりました。

>かみずさん
数回にわたるご指導ありがとうございました!
どうやらD6にはおっしゃっているTMonthCalenderはないようです。

>HOtaさん
何度もご丁寧にありがとうございました!

>みなさん
素人の私の質問にこんなにたくさんの方がご丁寧に答えていただき、
ありがとうございました。また何かわからないことがあれば恐れ入りますが
この掲示板を利用させていただきます。
みなさん本当にありがとうございました!


anone  2006-09-14 13:26:54  No: 23209

> どうやらD6にはおっしゃっているTMonthCalenderはないようです。

わたしの D6per にはありますね。これってウィンドウズのコモンコントロール
だから、だいたいあるんじゃないの


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加