지금까지 작업한 내용만으로는 2가지 이상의 프로젝트에서 적용하는데 무리가 있습니다.
예를 들어 한 사람이 A프로젝트와 B 프로젝트 2가지를 동시에 진행하는데,
A프로젝트에서는 COM포트1번과 BAUDRATE 2400bps 에 HEXA 통신을 하고,
B프로젝트에서는 COM포트3번과 BAUDRATE 9600bps 에 CHAR 통신을 한다면
A프로젝트하다가 B프로젝트로 변경하거나 또는 이와 반대일 경우 일일이 다 셋틍을 해줘야 합니다.
이러한 불편사항을 해결하기 위해 세션관리가 필요합니다.
여기를 보기 전에 ini 파일 다루는 것을 먼저 보아야 합니다.
- http://whiteat.com/zbxe/32000
- http://whiteat.com/zbxe/31905
전체 소스
ini 파일 구조
먼저 여기에서 사용할 ini 구조를 알아보겠습니다.
[Section_list] 에서는 세션관리자에 표시할 session들입니다.
그 밑에 있는 [COM1_115200], [COM3_115200(A)] 같은 것들은 [Section_list]에 있는 session_name 입니다.
세션관리자에서는 Section_list 에서 리스트를 가져오고, 각 리스트의 설정값을 다시 가져오는 겁니다.
session00=COM1_115200
session01=COM3_115200(A)
session02=COM4_115200_
[COM1_115200]
txtName=COM1_115200
txtPort=COM1
txtBaud=115200
[COM3_115200(A)]
txtName=COM3_115200(A)
txtPort=COM3
txtBaud=15200
[COM4_115200_]
txtName=COM4_115200_
txtPort=COM4
txtBaud=115200
세션관리 폼 만들기
다음과 같이 세션관리 폼을 만듭니다.
추가 버튼에 코드 넣기
[추가]버튼을 눌렀을 때 앞 장에서 다룬 frmConnectInfo 폼에 연결하여 새로운 세션을 만들수 있게 합니다.
private void btnAdd_Click(object sender, EventArgs e) { string[] strName = new string[20]; for (int iTemp = 0; iTemp < lvwSession.Items.Count; iTemp++) { strName[iTemp] = lvwSession.Items[iTemp].SubItems[0].Text; } frmConnectInfo clsConnection = new frmConnectInfo(strName); if(DialogResult.OK == clsConnection.ShowDialog()) { clsWatSerialBase objWatOne = new clsWatSerialBase(); objWatOne.Name = clsConnection.txtName.Text; objWatOne.PortNum = clsConnection.txtPort.Text; objWatOne.Baud = clsConnection.txtBaud.Text; m_objWatSerialBase.Add(objWatOne); SaveAll(); RefreshList(); } clsConnection = null; }
[수정]버튼에 코드 넣기
[수정]버튼을 눌렀을 때 앞장에서 다룬 frmConnectInfo 폼에 연결하여 값을 변경할 수 있게 연결해 줍니다.
private void btnModify_Click(object sender, EventArgs e) { if (lvwSession.SelectedItems.Count < 1) return; string[] strNames = new string[20]; for (int iTemp = 0; iTemp < lvwSession.Items.Count; iTemp++) { strNames[iTemp] = lvwSession.Items[iTemp].SubItems[0].Text; } frmConnectInfo clsConnection = new frmConnectInfo(strNames); string strName = lvwSession.SelectedItems[0].SubItems[0].Text; clsConnection.txtName.Text = strName; clsConnection.txtPort.Text = GetProfileString(strName, "txtPort", "", 255, m_strPath); clsConnection.txtBaud.Text = GetProfileString(strName, "txtBaud", "", 255, m_strPath); if (DialogResult.OK == clsConnection.ShowDialog()) { m_objWatSerialBase[lvwSession.SelectedItems[0].Index].Name = clsConnection.txtName.Text; m_objWatSerialBase[lvwSession.SelectedItems[0].Index].PortNum = clsConnection.txtPort.Text; m_objWatSerialBase[lvwSession.SelectedItems[0].Index].Baud = clsConnection.txtBaud.Text; SaveAll(); RefreshList(); } clsConnection = null; }
[삭제]버튼에 코드 넣기
[삭제]버튼을 눌렀을 경우 세션관리자에 안보이게 해 줘야 합니다.
ini 파일의 리스트에서 삭제 해주면 됩니다.
private void btnDel_Click(object sender, EventArgs e) { if (lvwSession.SelectedItems.Count < 1) return; m_objWatSerialBase.RemoveAt(lvwSession.SelectedItems[0].Index); SaveAll(); RefreshList(); }
frmConnectInfo 코드 추가
세션관리창이 추가되면서 frmConnectInfo 폼에서 많은 내용이 변경되었습니다.
( 쉬운 부분이 추가되어서 코드를 보시면 금방 아실겁니다. ^^)
- 중복된 이름 검사
- 키보드 [ENTER]을 입력할 경우 [OK] 버튼이 눌러지는 기능과 동일
폼에서 불필요한 컨트롤 없애기
이제 OPEN, CLOSE 버튼과 COM, BAUD 셋팅 컨트롤이 필요 없어졌습니다.
삭제하겠습니다.^^
컨트롤 같은 경우는 폼디자인에서 선택한후 DEL 키로 삭제 할수 있습니다.
코드에서는 컴파일 한후에 에러나는 부분만 지워도 됩니다.^^
폼에서 많이 사용되지 않는 컨트롤을 메뉴로 넣어 버리니 폼이 간단해졌습니다.
여기까지의 작업으로 폼은 간단해졌는데, OPEN, CLOSE 하기가 약간 불편할 것입니다.
( 한 눈에 보이지 않으니 불편하겠죠 ㅡㅡ)
그래서 다음 장에는 [파일]의 서브메뉴에 세션리스트를 추가해보겠습니다.