728x90
반응형
델파이 컴포넌트들 중에서 Win32에 있는 TMonthCalendar는 달력을 화면에 표시한 이후에, 날짜를 선택할 때 주로 사용하는 컴포넌트이지만, 한 가지 단점이 있습니다. OnChange 이벤트로 날짜 선택여부를 확인할 수 없다는 점입니다. OnChange 이벤트는 날짜를 선택하지 않고, 월을 바꾸거나 년도를 바꾸어도 발생하게 됩니다.
이를 해결하기 위하여 CN_NOTIFY 이벤트를 서브클래싱할 수도 있지만, 동일한 기능을 TMonthCalendar 클래스를 상속받아 OnSelectDay 이벤트로 추가한 새로운 컴포넌트로 만들어 봤습니다.
아래 소스를 참고하시기 바랍니다.
사용법은 간단합니다. 위 소스를 바탕으로 컴포넌트를 추가하신 후에, 달력을 폼에 올려놓고, OnSelectDay 이벤트를 구현하면 됩니다. 그러면 마우스로 특정 날짜를 선택하였을 경우에만 OnSelectDay 이벤트가 발생하게 됩니다.
이를 해결하기 위하여 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 이벤트가 발생하게 됩니다.
'프로그래밍 > 델파이' 카테고리의 다른 글
ForceDirectoriesOfIdFTP ; 디렉토리 강제 생성하기 (0) | 2009.12.02 |
---|---|
델파이 IDE 환경정보를 그대로 활용하자. (0) | 2009.11.27 |
WinInet Component Suite를 이용한 파일 업로드(POST) 예제 (0) | 2009.09.29 |
Internet Explorer7 에서 현재 활성화 되있는 탭윈도우 핸들 얻기 (0) | 2009.09.19 |
Live Templates(라이브 템플릿) (0) | 2009.09.18 |