강좌,팁

[강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (2)

제3장 INI 파일 기능 구현

10. INI 파일을 이용하기 위한 작업 절차
앞 강좌(강좌:009)에서 초기설정파일(ini)이용하는 한가지 방법을 다루었습니다. 여러 가지 방법 중에 제가 만들어서 이용하는방법이죠!
그 부분을 정리하면 다음과 같습니다.

A. DEFPROG_INI 파일 가져오기
B. Setting 구조체 멤버 변수 선언
C. Setting 값 초기화 함수 (Initialize_..._INI() )
D. Setting 값을 파일에 저장하는 함수 (Save_..._INI() )
E. Setting 값을 파일로부터 불러오는 함수 (Open_..._INI() )
F. Setting 값을 컨트롤에 적용하는 함수 (Refresh_..._INI() )
G. Setting 값 초기화 함수와 저장함수를 적절한 위치에 추가

이와 같은 과정을 여기서도 똑같이 반복합니다. 하지만, Setting 값을 갖는 구조체는이미 DataViewer3_common.h에 선언되어 사용되었습니다. 그것을 DataViewer3_INI.h파일로 옮겨오게 되고, 구조체 이름도 SETTING에서 DataViewer3_INI_SETTING으로바뀌는 과정이 추가됩니다.
그리고, DataViewer3_INI.c에서 GetStringItem() 함수를호출하게 되는데, DataViewer3_common.c에서 정의된 GetStringItem_mode() 함수를호출하여 이용하도록 하겠습니다.

CVI 자료실의 "[강좌자료] DEFPROG_INI.zip: ini 파일 이용하기"라는제목의 글에서 DEFPROG_INI.zip 파일을 다운로드 받으십시오.

11. DEFPROG_INI 파일 가져오기
다운로드 받은 DEFPROG_INI.zip이라는 파일을 압축해제하면, DEFPROG_INI.h와 DEFPROG_INI.c 파일이 나옵니다. 이 두 파일의파일명을 DataViewer3_INI.h와 DataViewer3_INI.c로 바꾸어서 프로젝트에 포함시킵니다.

그리고, 두 파일 내부의 문자열도 표 16.2와 같이 바꾸도록 합니다.

표 16.2 문자열 수정

수정전

수정후

DEFPROG

DataViewer3

defprog

dataviewer3

그리고, DataViewer3_DEF.h 통합헤더파일에 DataViewer3_INI.h 파일을 include시키십시오.

참, 또하나 GetStringItem() 함수를 그림 16.10과 같이 DataViewer3_INI.c에 정의하십시오.

그림 16.10 GetStringItem() 함수 (DataViewer3_INI.c 파일)

그리고, DataViewer3_INI.h에 함수를 선언해 주십시오. 프로토 타입을 적어주고,끝에 세미콜론을 붙이는 거 말입니다.

12. DataViewer3_INI_SETTING 구조체 멤버 변수 선언
DataViewer3_INI.h에있는 DataViewer3_INI_SETTING 구조체는 따로 정의하지 않고, DataViewer3_common.h에정의된 SETTING를 가져옵니다. 원래 SETTING 구조체도 DataViewer3_INI.h 라는 파일을만들어서 정의하는 것이 저의 습관이지만, DataViewer2 프로그램은 작은 프로그램이라서DataViewer2_common.h에 포함시켰던 것입니다. 별도 관리를 위해 DataViewer3_INI.h로옮겨옵니다.

그림 16.11에는 DataViewer3_INI_SETTING 구조체 정의와 그 구조체 변수의 외부변수선언을 보였습니다.

그림 16.11 DataViewer3_INI_SETTING 구조체 (DataViewer3_INI.h 파일)

외부변수로 선언된 3개의 변수들은 DataViewer3_INI.c에 정식으로 지금 선언하도록합니다.

이제 기존의 SETTING 구조체는 더 이상 필요하지 않으므로 Comment 처리를 하도록합니다. 그림 16.12처럼 말입니다.

그림 16.12 기존의 SETTING 구조체를 무효화함 (DataViewer3_common.h 파일)

이것외에도, SETTING 구조체 변수의 선언과 외부변수 선언도 comment 처리를 합니다.각각 DataViewer3_common.c와 DataViewer3_common.h에 있습니다.
그리고, 기존의setting 구조체 변수명은 이제 모두 dataviewer3_ini_setting로 바꿉니다. DataViewer3_common.c,DataViewer3.c 파일에 있는 모든 setting 구조체 변수를 그렇게 바꿉니다.

13. DataViewer3_INI_SETTING 구조체 값 초기화 함수 (Initialize_..._INI())
DataViewer3_INI_SETTING 구조체를 선언하였으므로, 이제는 초기화 함수를손질합니다. 그림 16.13에 수정된 초기화 함수를 보였습니다.

그림 16.13 DataViewer3_INI_SETTING 구조체를 초기화함 (DataViewer3_INI.c 파일)

34라인과 37라인을 분리하였습니다. 이렇게 하면 되는 걸, 전에는 왜 논리 연산자를써가면서 그랬는지.... 납득이 잘 안가네요. ........ 아마도..... 전에는 그 두문장을 if문에 넣고, 두 조건 다 성공하지 못하면, 내장된 초기화 과정을 수행했었습니다.위치를 바꾸는 과정에서 논리연산이 필요없게 되었군요.

13. DataViewer3_INI_SETTING 구조체 값을 파일에 저장하는 함수 (Save_..._INI())
그림 16.14에 DataViewer3_INI_SETTING 구조체의 값을 저장하는 함수를보였습니다.

그림 16.14 DataViewer3_INI_SETTING 구조체를 저장 (DataViewer3_INI.c 파일)

14. DataViewer3_INI_SETTING 구조체 값을 파일로부터 불러오는 함수 (Open_..._INI())
그림 16.15에 DataViewer3_INI_SETTING 구조체의 값을 파일로부터 불러오는함수를 보였습니다.

그림 16.15 DataViewer3_INI_SETTING 구조체를 파일로부터 불러오는함수 (DataViewer3_INI.c 파일)

15. DataViewer3_INI_SETTING 구조체 값을 컨트롤에 적용하는 함수 (Refresh_..._INI())
그림 16.16에 DataViewer3_INI_SETTING 구조체의 값을 컨트롤에 적용하는함수를 보였습니다. 그림의 151라인에 호출된 Refresh_Setting() 함수는 그림 16.5에언급되었습니다.

그림 16.16 DataViewer3_INI_SETTING 구조체 값을 컨트롤에 적용하는함수 (DataViewer3_INI.c 파일)

16. DataViewer3_INI_SETTING 구조체 값을 초기화 함수 및 저장 함수를 적절한위치에서 호출
그림 16.17에는 Initialize_DataViewer3_INI() 함수를 Initialize_DataViewer()함수에서 호출하도록 추가한 소스를 보여주고 있습니다.

그림 16.17 Initialize_DataViewer3_INI() 함수를 호출하는 위치 (DataViewer3_common.c 파일)

이렇게 되면, main() 함수 내에 있던 Initialize_Setting() 함수는 더 이상 호출될필요가 없습니다. 이미 Initialize_DataViewer3_INI() 함수 내에서 호출되었기 때문입니다.그리고, Initialize_Setting() 함수 내의 Refresh_Setting() 함수도 호출될 이유가없습니다. 왜냐하면, Initialize_DataViewer3_INI() 함수 내에서 Refresh_DataViewer3_INI()함수를 호출하게 되고, Refresh_DataViewer3_INI() 함수는 다시 Refresh_Setting()함수를 호출하기 때문입니다. 설명을 하다보니 복잡하게 되었는데, 잘 따져보면 이해가되실 겁니다.

그리고, 그림 16.18에 보면 Finish() 함수 내에 INI 정보를 저장하는 함수를 호출하였습니다.

그림 16.18 Save_DataViewer3_INI() 함수를 호출하는 위치 (DataViewer3_common.c 파일)

이제 프로그램을 Build한 후에 실행을 시켜 보십시오. 그리고 Setting Panel에서설정을 변경시켜보십시오. OK를 한 후, 프로그램을 종료하고, 다시 실행시켜 데이터파일을 불러들이면 그 이전의 설정 정보가 유지됨을 알 수 있을 것입니다. Debug모드에서 실행할 때는 ini 파일이 없기 때문에 CVI 디버거가 에러 메시지를 내는데,"Continue" 버튼을 눌러 계속 실행하시면 됩니다. 디버거가 이 상황에서에러를 내지 말아야되는데, 에러를 내는군요. 아마도 이건 버그라기보다는 CVI 디버거가너무 민감한 반응을 보인다고 보아야할 것 같습니다. 아니면 진짜 버그던가....

 

제4장 Default 값으로 초기화 하는 기능 구현

17. Default 값으로 초기화
이제는 Setting Panel에서 "Default"라는버튼의 콜백 함수만 남았습니다. 이 버튼의 기능은 Setting 값이 여러번 변경이 되었을때, 프로그램에 내장된 초기값으로 혹은 DataViewer3_default.ini 라는 파일에서설정한 초기값으로 되돌리는 역할을 합니다. 그러자면, 기본 세팅값이 default_dataviewer3_ini_setting라는 구조체 변수에 저장되어 있어야겠죠?

그래서, 우리는 dataviewer3_ini_setting라는 구조체 변수를 프로그램에 내장된값으로 초기화하는 1단계 초기화와  DataViewer3_default.ini라는 파일로부터설정값을 불러와서 초기화하는 2단계 초기화를 거친 후에, dataviewer3_ini_setting값을default_dataviewer3_ini_setting에 복사해 두도록 합니다. 그러면, 이후에 dataviewer3_ini_setting의값이 여러번 변경되더라도 default_dataviewer3_ini_setting의 값은 그대로 유지되게됩니다.

이렇게 유지된 default_dataviewer3_ini_setting 값은 Setting Panel의 "Default"버튼이 눌러질 때, dataviewer3_ini_setting 로 복사되어 해당 컨트롤들이 갱신되도록하면 되는 것입니다.

그림 16.19에는 dataviewer3_ini_setting 구조체 변수의 값을 default_dataviewer3_ini_setting에대피시키는 부분을 보이고 있습니다.

그림 16.19 default 설정값의 대피 (DataViewer3_INI.c 파일)

그리고, 마지막으로 Setting Panel의 "Default" 버튼의 콜백함수 부분을그림 16.20에 보였습니다.

그림 16.20 default 설정값으로 설정을 복원하는 콜백함수 (DataViewer3.c 파일)

18. 마지막 실행
위와 같이 다 끝낸 후에, Build 하여 실행을 시켜봅시다.원래 계획했던 모든 기능이 제대로 동작하는지를 살펴봅시다. Style을 한꺼번에 바꾸는것, 초기설정파일을 이용하여 프로그램의 설정이 재시작 후에도 유지되는 것, 그리고Default 값으로 되돌리는 것을 확인해 봅시다. 참, DataViewer3_default.ini 파일은어떻게 만들어 두는지를 별도로 말씀드리지 않았는데, DataViewer3의 Setting을 설정을한다음, 프로그램을 종료하면 DataViewer3.ini 파일이 만들어집니다. 이 파일을 DataViewer3_default.ini로복사해 두면, default 설정 파일로 이용할 수 있습니다. DataViewer3.ini 파일은바뀌더라도 DataViewer3_default.ini 파일은 변경되지 않고, 단지 처음 시작될 때불러오기만 하게 되죠! 프로그램에 내장된 초기값으로 DataViewer3_default.ini를만들려면, ini 파일을 모두 지우고 실행한 후 종료하고, 그 때의 DataViewer3.ini파일을 DataViewer3_default.ini로 복사하면 되겠죠?

최종 실행화면을 그림 16.21에 보였습니다.

그림 16.21 최종 실행화면 (Data_noise2.dat 파일을 불러옴)

 

DataViewer2에서 간단한 기능을 추가한 강좌였는데도, 거의 12시간걸렸네요.ㅜㅜㅜ
미리 한번 만들어보고, 강좌로 만들면서 쉬엄쉬엄 일일이 그림을 추가하니까이렇게 되어 버리네요.
강좌를 만드는 데 드는 시간을 줄이기 위해 궁리도 해보는데요,오늘 문득 든 생각은 동영상으로 화면을 캡쳐하면서 음성강의를 하는 거였습니다.다행히 Windows Media 인코더 프로그램이 freeware로 나와있기 때문에 부담없이 할수 있을 것 같더군요. 하지만 그렇게 되면 강좌를 이용하시는 분들이 불편하실 수도있겠다는 생각이 들더군요. 나중에 다시 참고를 할 때 원하는 부분을 찾기도 어렵겠죠?

듣는 분들을 위해서는 웹강좌와 동영상 화면 캡쳐 음성 강좌가 병행되면제일 좋겠군요.
여러 가지 시도를 해보겠습니다.

오늘도 여기까지 인도해 주신 하나님의 은혜에 감사를 드립니다.
좋은것을 더욱 잘 나눌 수 있도록 노력하겠습니다.

감사합니다.

 

조지 W 부시 미국 대통령이 對이라크 선전포고를 하던 날(2003년3월 18일) 밤에
극동테크(www.kdtechno.com) 허창원이었습니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수
56 [팁:6] 배포판(설치) 프로그램에 데이터 폴더 포함하기 허창원 2004-05-20 14901
55 [팁:5] Parallel Port 이용할 때, CVI Low-level support driver [2] 허창원 2004-05-18 12852
54 [팁004]팁아닌...팁..Text Message오른쪽 정렬..... [4] 야리싸내 2004-02-02 14956
53 객체의 위치값을 이용한 퍼즐 게임. file [2] 조인배 2004-01-09 13717
52 [강좌020]실행시에 uir파일을 사용하지 맙시다. file [6] 야리싸내 2003-12-19 13329
51 [강좌:019] CVI 런타임엔진과 설치 프로그램 허창원 2003-12-08 14636
50 그래프에 Zoom 기능을 만들어봤습니다.. ^^ file 야리싸내 2003-09-30 13386
49 헉..ㅠ_ㅠ;; 죄송합니다..위에 첨부파일에 소스가 없네요....ㅠ_ㅠ; file 야리싸내 2003-11-26 13331
48 [팁:003] NI DAQ 프로그래밍 예제 얻기 file 허창원 2003-08-11 14848
47 켄바스 기능을 이용한 아날로그시계 file [1] 조인배 2003-07-09 14535
46 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (2) 허창원 2003-04-11 13221
45 [강좌:018] 따라하기 13. AudioPlayer(MP3, WMA, ASF, WAV 등) (1) [1] 허창원 2003-04-11 14688
44 [강좌:017] 따라하기 12. 재사용 가능한 Library(static lib, DLL) 만들기 허창원 2003-04-11 15470
43 [팁:003] 종료시 MS Office와의 충돌 피해가는 대안 [2] 허창원 2003-04-01 13553
» [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (2) 허창원 2003-03-19 13866
41 [강좌:016] 따라하기 11. 데이터 뷰어3로 업그레이드하기 (1) 허창원 2003-03-19 12734
40 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (3) [2] 허창원 2003-02-25 14010
39 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (2) [2] 허창원 2003-02-25 12536
38 [강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (1) [2] 허창원 2003-02-25 14831
37 [강좌:014] 따라하기 9. 터치스크린에서 숫자 입력하기 (3) [4] 허창원 2003-01-15 12493