お世話になります。
今、DateTimePickerを使って日付の選択を行おうと思っているのですが、
それと同時に、ボタンを使って前月や次月などの移動をやりたいと思っています。
そこで、ボタンを押した際、DateTimePickerのDateを更新して、DatetimePickerのChangeイベントを拾えたら日付の移動と同じ処理を共有できると考えました。しかし、Dateを変更しただけではChangeイベントが発生しないようなのでどうしようかな〜と考えているところです。
処理を関数にするのもありですが、こういう経験がある型もいるのでは?と思い質問させていただきました。
よろしくお願いします。
TMonthCalendarじゃあ、だめなんですか?
常時カレンダーを表示させておきたくないのです。
前後の日付移動がベースにあって、必要なときにカレンダーでも日付を選択できるという形にしたいと思っています。
なので、DateTimePickerがベストだと思ったのですが。
関数を作ってみました。
TNMDateTimeChangeを使うのに、CommCtrlをuses節に追加する必要があります。
procedure SetDateTimePickerDateTime(dtp: TDateTimePicker; dt: TDateTime);
var
nmDtc: TNMDateTimeChange;
st: TSystemTime;
begin
DateTimeToSystemTime(dt, st);
nmDtc.nmhdr.hwndFrom := dtp.Handle;
nmDtc.nmhdr.idFrom := 0;
nmDtc.nmhdr.code := DTN_DATETIMECHANGE;
nmDtc.dwFlags := GDT_VALID;
nmDtc.st := st;
dtp.Perform( WM_NOTIFY, 0, Integer(@nmDtc) );
end;
>しかし、Dateを変更しただけではChangeイベントが発生しない…
イベントハンドラを呼び出すのはダメなの?
procedure TForm1.Button1Click(Sender: TObject);
begin
DateTimePicker1.Date := IncMonth(DateTimePicker1.Date, -1);
DateTimePicker1Change(Self);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DateTimePicker1.Date := IncMonth(DateTimePicker1.Date, +1);
DateTimePicker1Change(Self);
end;
ボタンを押した際に、イベントハンドラを毎回コールする方法をとった場合、
日付の更新を処理的に組み込むところには必ずそのイベントハンドラを記述する必要があり、それは避けてDateTimePickerのイベントだけでハンドリングしたいと思ったのです。
にしの様
関数の提供ありがとうございます。
本関数でDateTimePickerのDateを更新することで、更新イベントが発生しました。無事解決しました。ありがとうございました。
便乗して質問なのですが、
DateTimePickerのカレンダーを開いて、カレンダーの日付をクリックすると、
OnClickイベントが続けて2回発生するようなのですが、これはMonthCalendarのOnClickとPickerのOnClickなのでしょうか?
ありがとうございました。
ツイート | ![]() |