강좌,팁

[강좌:015] 따라하기 10. 초기설정파일(ini) 이용하기 (1)

질문답변 게시판에 "컨트롤 값의 저장에 대하여..."라는 제목의 질문이있습니다. 컨트롤의 세팅값을 파일에 저장했다가 나중에 프로그램이 시작되면서 다시불러와 컨트롤 값을 세팅하는 내용이었습니다. 그리고, "initially dimmed시키고 나서 살리려는데...."라는제목의 질문도 있습니다. 이 질문은 컨트롤의 속성을 변경시키는 것에 대한 질문이었습니다.

이번 강좌에서 이 두 가지 문제를 포함하여 초기설정파일을 이용하는 방법을 살펴보겠습니다.이 강좌에서는 제가 만들어서 이용하고 있는 방법을 소개할 것입니다. (LabWindows/CVI의샘플 프로그램 중에도 ini.prj가 있습니다. cvisamplestoolboxini.prj을 참고하십시오.)

이번 강좌에서 만들어볼 프로그램의 개요를 말씀드리면, 두 개의 Panel이 있습니다.하나는 Main panel이고, 나머지 하나는 Setting panel입니다. INI 파일에 저장되는값은 주로 Setting(혹은 Option)값들이기 때문에 실제적인 상황에 가깝게 별도의Setting Panel을 두었습니다. Setting panel에서 세팅되는 컨트롤의 값을 ini 파일에다저장하고 불러오는 기능이 주된 내용이 되겠습니다.

이번 강좌의 진행순서는 다음과 같습니다.

첫 번째 과정은 일반적인 프로그램의 초기 작성 작업(화면구성, 속성설정, 소스코드생성, 간단한 소스 수정)
두 번째 과정은 INI 파일을 다루기 위한 처리부분을작성합니다.
세 번째 과정은 본 강좌의 프로그램에 한정된 기능을 구현하게 되고,
마지막으로화면구성 작업시 알아둘 팁 하나와 이번에 이용된 ini 파일에 대한 comment가 추가됩니다.

그림 15.1에 과정을 블록으로 표시해 보았습니다.

그림 15.1 ini 파일 이용하기 강좌의 작업 흐름도

 

제1장 일반적인 프로그래밍 시작작업 단계

1. 프로젝트 파일 생성(L015_UsingINI.prj)
LabWindows/CVI를 실행시켜서 새 프로젝트 파일을 열고, 저장(L015_UsingINI.prj)합니다.
그리고새 UIR 파일을 열고, 곧바로저장(L015_UsingINI.uir)한 다음 프로젝트에 포함시킵니다.

2. 화면구성 및 속성설정
화면구성을 그림 15.2, 15.3와 같이 하였습니다.

그림 15.2 Main Panel 화면

 

표 15.1 Main Panel의 속성설정

속성

내용

Constant Name

PANEL

Callback Function

PanelCB

Panel Title

Main Panel

 

표 15.2 Main Panel의 컨트롤의 속성 설정

컨트롤 종류

Constant
Name

Callback Function

Label

LED

LED_Drive

 

구동장치

LED

LED_Power

 

전원공급기

LED

LED_Voltmeter

 

Voltmeter

Command Button

cmdSetting

cmdSetting

설정

Command Button

cmdExit

cmdExit

종료

Decoration

don't care(상관없음)

 

 

Text Message

don't care(상관없음)

 

여기는 Main Panel ... 

Text Message

don't care(상관없음)

 

통신상태

 

이제는 Setting Panel에 대한 화면구성과 Panel, Control의 속성설정을 보였습니다.

그림 15.3 Setting Panel 화면

 

표 15.3 Setting Panel의 속성설정

속성

내용

Constant Name

P_Setting

Callback Function

P_SettingCB

Panel Title

Setting

 

표 15.4 Setting Panel의 컨트롤의 속성 설정

컨트롤 종류

Constant
Name

Callback Function

Label

Data Type

Numeric

numV_offst

 

Toleration of offset

float

Numeric

numCheck_V

 

Max. number of check

int

Numeric

numI_offst

 

Toleration of offset

float

Numeric

numCheck_I

 

Max. number of check

int

Binary Switch

bsDrive

 

구동장치

int

Text Button

tgVoltmeter

 

Voltmeter

 

Check Box

chkPowerSupply

 

전원공급기

 

Check Box

chkPS_Dimmed

 

전원공급기 LED Dimmed

 

String

strWorkDir

 

Working paths

 

Command Button

cmdBrowse

cmdBrowse

찾아보기...

 

Command Button

cmdOK

cmdOK_Setting

OK

 

Command Button

cmdCancel

cmdCancel_Setting

Cancel

 

Command Button

cmdApply

cmdApply_Setting

Apply

 

Decoration 여러개

don't care(상관없음)

 

 

 

Text Message 여러개

don't care(상관없음)

 

Voltmeter
Power Supply
통신장치 강제 초기세팅
작업 디렉토리

 

 

3. 기초 소스코드 생성(UIR 창에서 Code-Generate-All code... 메뉴)
이제 소스코드를 생성할 단계가되었습니다. uir 창에서 Code-Generate-All code... 메뉴를 선택하면, 그림 14.2와같은 대화상자가 뜹니다. 아래의 항목들을 수정합니다.

TargerFiles: Add To Current Project
Select panels to load and display at startup:일단 모두 다 체크
Select QuitUserInterface Callbacks: PanelCB, cmdExit를체크

그리고, 버튼을 누르면, L015_UsingINI.c 소스코드 창이 생기면서 프로젝트에 포함됩니다.L015_UsingINI.h 파일도 열어서 프로젝트에 포함시킵니다. 전에도 얘기했듯이헤더 파일은 프로젝트에 포함시키지 않아도 되지만, 코딩 작업 중에 헤더 파일을쉽게 불러오기 위해 프로젝트 창에 포함시켜 둡니다.

4. 사용자 정의함수 파일(...common.x), 통합헤더파일 생성
이 단계는저의 프로그래밍 스타일에 따른 과정입니다. 자동생성된 L015_UsingINI.c에는 각종Callback 함수들이 있는데, 사용자 정의 함수들과 섞이면 코딩작업시 좀 번거롭기때문에 저는 일반 사용자 정의 함수들을 ...common.c 파일에다 작성합니다. 그리고통합헤더파일을 만드는 이유는 각 소스 파일마다 include 문을 여러개 나열하는 것이번거롭기 때문이죠!

먼저, 그림 15.4에 통합헤더파일을 보였습니다. 그림과 같이 작성한 후에 프로젝트에포함시키세요.

그림 15.4 L015_UsingINI 통합헤더파일

L015_UsingINI_common.h와 L015_UsingINI_common.c는 그림 15.5, 그림 15.6에보였습니다.
L015_UsingINI_common.h의 6번 라인은 L015_UsingINI.c에서 static으로선언된 문장을 가져와서 extern으로 선언한 것입니다. 그리고, 8,9번 라인의 함수는프로그램의 초기화와 마무리 함수 선언입니다.

그림 15.5 L015_UsingINI_common.h 헤더파일

L015_UsingINI_common.c의 4번 라인은 L015_UsingINI_common.h의 6번 라인의 실제변수 선언입니다. static이 되어서는 안됩니다. 다른 파일에서도 이용될 것이기 때문이죠!
Initialize_L015_UsingINI() 함수는 L015_UsingINI 프로그램의 초기화를 담당하는부분인데, 아직은 어떤 문장도 들어가지 않았습니다. Finish_L015_UsingINI() 함수는프로그램을 종료하기 전에 마지막으로 처리해야 할 부분이 오게 됩니다.

그림 15.6 L015_UsingINI_common.c 파일

5. main() 함수 주변 수정
main() 함수가 있는 L015_UsingINI.c 파일에우선 수정하고 추가해야할 부분이 있습니다. 그림 15.7에 보였습니다.

그림 15.7 L015_UsingINI.c에서 우선 수정되는 부분

1, 2번 라인의 include 문은 3번 라인으로 통합되었고, 5번 라인은 L015_UsingINI_common.c의4번 라인으로 옮겨가면서 static이라는 수식어가 없어졌습니다.
프로그램의 초기화함수, 마무리 함수가 추가되었고, 20번, 23번 라인은 코멘트 처리되었습니다. 지금표시될 panel이 아니기 때문이죠!

6. Setting Panel을 호출하고 닫는 콜백 함수들
L015_UsingINI.c 파일에있는 콜백 함수들 중에서 Setting Panel을 표시하는 cmdSetting() 함수를 그림 15.8과같이 만듭니다. modaless 대화 상자로 표시하기 위해 InstallPopup()함수를 이용하였습니다.

그림 15.8 cmdSetting() 콜백 함수(L015_UsingINI.c 파일)

그리고, Setting Panel을 닫는 콜백함수로는 P_SettingCB()라는 Panel 콜백함수와cmdOK_Setting(), cmdCancel_Setting() 콜백함수가 있습니다. 그림 15.9에 P_SettingCB()콜백 함수를 보였습니다.

그림 15.9 P_SettingCB() Panel 콜백 함수(L015_UsingINI.c 파일)

그림 15.10에서 cmdOK_Setting() 함수는 단순히 닫는 동작만 있는것이 아니지만, 나머지는 나중에 추가하기로 하고 Setting Panel을 닫는 문장을 넣어줍니다.

그림 15.10 cmdOK_Setting(), cmdCancel_Setting() 콜백함수(L015_UsingINI.c파일)

이제 그림 15.11과 같은 Project 파일 상태에서 프로그램을 Build하여 실행시켜봅니다.

그림 15.11 L015_UsingINI.prj의 파일들

그림 15.12와 그림 15.13에는 실행된 화면을 보였는데, Setting Panel을 띄우고제거하는 부분과 종료하는 부분만 유효합니다.

그림 15.12 실행화면(Main panel)

 

그림 15.13 실행화면(Setting panel)

여기까지는 다른 CVI 프로그램을 작성할 때와 거의 유사한 시작 과정이었습니다.다음은 INI 관련 기능을 만들어 나가도록 합니다.

 


허창원

2003.03.03 23:12:32
*.96.191.238

[추가수정] 그림 5.8에서 InstallPopup(pSetting); 라는 문장 바로 앞에 Refresh_L015_UsingINI_INI(); 라는 문장이 와야겠습니다. 다시 정리하면, 아래와 같이 말입니다. Refresh_L015_UsingINI_INI(); InstallPopup(pSetting);

허창원

2013.04.08 17:41:29
*.39.129.111

지금(2013-04-08)와서 보니, 제가 CVI를 처음 사용할 때 이용하던 방식이네요.

CVI에서 제공하는 inifile.fp 를 이용하는 것도 편리한데, 이것을 활용하는 간단한 방법을 조만간 소개하도록 하겠습니다.

 

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