프로그래밍/델파이

TMonthCalendar에서 날짜 선택에 대한 이벤트 확장하기

채윤아빠 2009. 11. 11. 18:56
728x90
반응형
델파이 컴포넌트들 중에서 Win32에 있는 TMonthCalendar는 달력을 화면에 표시한 이후에, 날짜를 선택할 때 주로 사용하는 컴포넌트이지만, 한 가지 단점이 있습니다. OnChange 이벤트로 날짜 선택여부를 확인할 수 없다는 점입니다. OnChange 이벤트는 날짜를 선택하지 않고, 월을 바꾸거나 년도를 바꾸어도 발생하게 됩니다.

이를 해결하기 위하여 CN_NOTIFY 이벤트를 서브클래싱할 수도 있지만, 동일한 기능을 TMonthCalendar 클래스를 상속받아 OnSelectDay 이벤트로 추가한 새로운 컴포넌트로 만들어 봤습니다.

아래 소스를 참고하시기 바랍니다.
interface

uses Classes, SysUtils, Windows, Messages, Controls, CommCtrl, ComCtrls;

type
  {** 월 달력 확장 *}
  TMonthCalendarEx = class(TMonthCalendar)
  private
    FOnSelectDay: TNotifyEvent;

    procedure CNNotify(var Message: TWMNotifyMC); message CN_NOTIFY;
  protected
    procedure DoSelectDay; virtual;
  public
  published
    property OnSelectDay: TNotifyEvent read FOnSelectDay write FOnSelectDay;
  end;

  procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Extended VCL', [TMonthCalendarEx]);
end;

{ TMonthCalendarEx }

procedure TMonthCalendarEx.CNNotify(var Message: TWMNotifyMC);
begin
  inherited;

  with Message, NMHdr{$IFNDEF CLR}^{$ENDIF} do
  begin
    if (Code = MCN_SELECT) then
      DoSelectDay;
  end;
end;

procedure TMonthCalendarEx.DoSelectDay;
begin
  if (Assigned(FOnSelectDay)) then
    FOnSelectDay(Self);
end;

사용법은 간단합니다. 위 소스를 바탕으로 컴포넌트를 추가하신 후에, 달력을 폼에 올려놓고, OnSelectDay 이벤트를 구현하면 됩니다. 그러면 마우스로 특정 날짜를 선택하였을 경우에만 OnSelectDay 이벤트가 발생하게 됩니다.