이번엔 다이어리 프로그램을 만들어 보려고 한다. 실제 다이어리 프로그램을 구현하려면 파일이나 로컬 데이터베이스를 이용하여 내용을 저장해야 하지만, 이번에 만들 프로그램은 하위 버전이라 생각하면 된다.
Name 설정
텍스트박스 = txtdiary
저장버튼 = btnSave
DateTimePicker = dtpTime
우리는 비주얼 베이직의 기본적인 메소드와 클래스를 사용하고 있습니다. 근데 , 더 많은 기능들을 불러오기 위해서는 Import 키워드를 통해 네임스페이스를 추가해야 합니다.
그래서 이번 프로그램에서 좀 더 나은 기능을 구사하기 위해 Microsoft.VisualBasic 이라는 네임스페이스를 가져오겠습니다.
Imports Microsoft.VisualBasic
이렇게 폼 클래스 위에 위치에서 Import하면 됩니다. 이제부터 더 많은 클래스와 메소드를 사용 할 수 있습니다.
Windows SDK 와 닷넷 프레임워크 하위에 포함되어 있다면 Import로 불러 낼 수 있지만
만약, 타사의 어셈블리를 참조하려면
프로젝트 - 참조 추가 - 참조관리자에서 설정해야 합니다.
Convet.TodateTime 에 대해서 알아봅시다. 비주얼베이직으로 프로그램을 제작하다보면 날짜,시간과 관련 된 함수들을 잘 알아 두어야 합니다.
dateTime 이란, 말 그대로 날짜,시간을 의미합니다. 위의 예시는 무엇을 의마할까요?
DateTime 클래스에서 현재 연도를 문자열로 표현 하라는 것입니다.
텍스트박스에 출력 시키면 2015 가 출력 됩니다.
그렇다면 Convet.TodateTime 는 무엇일까요??
이러한 "TodateTime 형식"으로 변환 시키는 것입니다. 한 프로그램에서 날짜와 시간을 표시하는데 통일성이 있어야지, 이것 저것 다르게 표현하면 헷갈리므로 변환을 통해 통일시켜 줍니다.
물론, Format 함수를 사용하여 다른 표현 방식으로 통일 할 수도 있습니다.
일정한 string 날짜 형식을 적어주면 같은 모양새로 변환 시켜 줍니다. 참으로 다양한 형식도 다 받아들이네요…
MSDN을 참고해보면, 일정한 날짜,시간 틀만 갖춰지면 다 변환 해줍니다..
왜 이짓거리를 하느냐???????????
다이어리를 만들기 위해서는 내가 일기를 작성한 날짜의 텍스트를 저장할 공간이 필요합니다.
그 저장할 공간을 배열로 365개 선언을 하면 일단.. 공간은 확보가 됩니다.
근데!!
2015년 1월 1일이 배열(0)
2015년 1월 2일이 배열(1)
2015년 1월 3일이 배열(2)
라고 하면.. 그 해당하는 날짜가 대표하는 "숫자"를 필요로 합니다.
그래야 배열에 저장을 할 수 있으니까요. 즉, 2015년 1월 1일을 나타낼 "숫자"가 필요한 것이죠. 그것이 0 이라는 숫자면 2015년 12월 31일은 365라는 숫자를 가지게 됩니다.
이렇게 되면 배열의 인덱스로 날짜를 구분 할 수 있게되고, 내용에는 텍스트를 저장 할 수 있게 되죠.
그 숫자를 얻어 내기 위해서는 기준 날짜와 "날짜 차이"를 얻어 내야하는데
DateDiff() 메소드를 통해 얻어 낼 수 있습니다. 이건 위에서 Microsoft.Visualbasic 을 Import하면서 사용 할 수 있게 되었고,
Convert.TodateTime 을 통해서 형식 얻어내어 DateDiff() 메소드에 맞는 형식을 가져 올 수 있었습니다.
여기까지 , 이해를 하셔야 다음 DateDiff() 메소드를 파악 할 수 있습니다..
이해가 가지 않는다면 조금 천천히 몇번씩 고민해보시길 바랍니다.
이 메소드의 형식은 길어서 기억하기 부담스럽긴 합니다.
결론 부터 말하면
DateDiff( Interval, date1, date2, dayofWeek, weekOfYear )
우리가 왜 converter를 통해서 DateTime 형식을 구했냐면, DateDiff 메소드의 date1, date2 인자가
DateTime 형식이기 때문 입니다.
아참.. 이 메소드는 두 날짜 차이를 계산해서 Long 값으로 반환 합니다.
자세한 설정 사항은 MSDN 참고
https://msdn.microsoft.com/ko-kr/library/b5xbyt6f(v=vs.90).aspx
Interval
- date1 과 date2 사이의 차이를 어떤 단위로 사용할 건지 결정하는 인자.
- DateInterval 열거형 값을 사용한다.
Ex) DateInterval.day => 1일 단위로 차이 값을 반환 함.
Date1,date2
- 두 날짜를 비교할 대상
dayofWeek
- 주 의 첫째 요일을 지정하는 인자. ( 보통 일요일이므로 )
- FirstDayofWeek 열거형 값을 사용한다.
- 선택적인 요소로 지정하지 않으면 Sunday 로 자동 지정
Ex) FirstDayofweek.Sunday
weekOfYear
- 연도의 첫째 주를 지정하는 인자. ( 보통 1월 1일이 속해있는 주 )
- FirstWeekOfYear 열거형 값을 사용한다.
- 선택적인 요소로 지정하지 않으면 Jan 1로 자동 지정
Ex) FirstWeekOfYear.Jan1
전체적인 예시를 들어보면
DateDiff( DateInterval.day , date1, date2, FirstDayofweek.Sunday, FirstWeekOfYear.Jan1 )
아이고.. 이것은 또 무엇입니까. 고작 다이어리 만드는데 뭐가 이리 많이 필요 합니까..
하지만 이런게 쌓이고 쌓이다보면 언젠간 빛나리…
로그인 프로그램을 만들 때, Shell( "실행파일 이름" )
이것을 기억 하십니까? 다른 프로그램을 불러오는 명령어였죠.
Shell( "실행파일 이름" , 파라미터 )
이러한 형식으로 적어주면 파일을 실행하는 동시에 다음 파일에게 어떤 파라미터를 전달하게 됩니다.
그럼 실행되는 파일에서 그 파라미터를 받아 들여야 하는데 그것이 바로 Interaction.Command() 메소드 입니다.
여기에 저장이 되지요.
자, 기본적인 개념을 익혔으니 코딩해 봅시다. 먼저, 로그인 프로그램과 연동을 시켜볼 것입니다.
로그인이 완료되면 우리 다이어리가 실행되도록 하겠습니다.
우리가 원하는건 다이어리를 만드는 것인데 날짜마다 텍스트 값을 기억해야 합니다.
첫 번째로 365개를 저장 할 수 있는 배열을 선언합니다.
두 번째로 로그인 후, 파라미터를 받을 수 있는 Interaction.Command()메소드를 통해 값을 저장할 변수가 필요 합니다.
프로시저가 다 접근 할 수 있게 모듈 변수로 선언해 주시고요.
Form_load 에서 비교 할 두 날짜의 변수를 선언해 줍니다.
비교 기준이 되는 2015년 1월 1일을 하나 담고, DtpTime 컨트롤의 현재 선택 된 값을 하나 더 담습니다. 이제 비교 할 두 날짜가 생겼지요?
로그인 프로그램에서 현재 날짜,시간 정보를 파라미터로 받을 예정 입니다. 그러한 파라미터가 제대로 전달 됬다면, 비교할 변수 datTim2 변수에 저장 하고, 현재 날짜 시간을 dateTime 형식에 맞게 변환 한 후 , dtptime 컨트롤에 값을 저장 합니다.
와.. 말이 참 어렵죠?? 위에 것을 이해 했어야 소화 가능할 것입니다.
2015년 1월 1일과 현재 날짜를 비교하여 차이 값을 Long 값으로 반환 합니다. 그걸 우린 다시 Int로 변환 하였습니다.
즉, 현재 날짜를 파라미터로 받아서 dtptime 컨트롤에 띄우고 , 현재 날짜가 몇번째 배열에 저장 될지 인덱스를 구할 수 있었습니다.
마지막으로 배열에 저장되어 있던 string 텍스트 값을 띄웁니다.
DD가 12라면, 현재 날짜가 2015년 1월 13일이라는 말이므로, 그 날짜에 해당하는 저장 되어 있던 텍스트 값을 출력 할 것입니다.
전체적인 코딩입니다.