프로그램을 개발하다 보면 개발 시점에는 찜찜한 마음을 가지고 임시 방편으로 문제해결을 하고 나중에 확인되는 경우가 가끔있다.
이번 발견(?)이 그런 경우다.
여러 프로젝트를 관리하다 보면 델파이의 Project Group 으로 관련 Project나 최근 작업 중인 Project를 모아서 관리하는 경우가 많다.
Project Group만 열면 속해 있는 모든 Project가 목록으로 관리할 수 있으니까 일일이 proejct 마다 오픈할 필요가 없어 편리하다.
그러데 Project Group을 사용할 때는 조심해야 할 것이 있다. 바로 Data Module의 이름이다.
Data Module은 일반 폼과 달리 DataBase와 연결하기 위한 non-visulal 콤포넌트들을 모아두어 편리하게 사용하는 용도이다.
Data Module은 또한 Project Options에서 Auto create form의 최상위에 놓곤 한다. 실행중에 제일 먼저 항상 참조되므로 ...
TAdoConnection, TAdoQuery, TAdoTable, TDataSource 등...
물론 Indy의 TIdHttp, TIdFTP 나 TPopupMenu, TOpenDialog 등도 필요에 따라 Uses 절에 관련 unit을 추가하여 올릴 수 있다.
그런데 Data Module의 이름을 Project Group내에서 유일하게 주는 것이 좋다. 대부분의 Project에서 Data Module은 1개정도면 충분한데 그래서 인지 unit 이름을 DM으로 하고 폼이름을 frmDM 으로 많이들 사용한다.
이것은 1개 project 만 IDE에서 사용한다면 문제안되지만 Project Group내의 여러 Project에서 동일 이름의 DM을 사용한다면 디자인시 TdbGrid 등에서 참조가 없어질 수 있다.
자세하게 설명하자면 Datasouce가진 같은 이름의 Data Module Dm을 프로젝트 그룹내에 2개의 프로젝트가 가지고 있다고 가정하다.
각각 프로젝트1, 프로젝트2 이라고 하고 순서대로 프로젝트 그룹 목록에 표시된다고 가정하자.
DataSouce의 이름은 다르다고 하자. DataSource1, DataSource2
여기서 목록 표시순서가 중요한데 제일 처음 프로젝트의 DM이 암시적(자동)으로 오픈(메모리로드)되기 때문이다.
위의 경우 프로젝트1의 DM 모듈이 암시적으로 오픈된다.
그리고 디자인 타임에서 프로젝트1의 일반폼의 dbGrid가 Dm 모듈의 DataSource를 참조할 때 프로젝트2의 일반폼 dbGrid도 프로젝트1의 Dm 모듈을 참조한다.
예를 들어 위의 순서에서 프로젝트2의 Dm을 명시적으로 오픈해 놓고 프로젝트2의 일반폼의 dbGrid를 프로젝트2의 DM의 DataSource2를 연결하고 저장하자 그리고 프로젝트 그룹을 All Close하고 다시 프로젝트 그룹을 열고 프로제트2의 Dm 오픈없이 일반폼을 열어 dbGrid의 속성창의 DataSource를 확인해 보면 저장되었던 프로젝의2의 Dm모듈의 DataSource2 이름이 없어진다.
이유는 프로젝트1의 Dm 모듈을 암시적으로 참조하기 때문이다. 프로젝트1의 Dm 모듈에서는 DataSource2가 없기에...
물론 이 상태에서 프로젝트를 저장만 하지 않으면 문제되지 않는다.
나중에 다시 프로젝트 그룹을 오픈하고 프로젝트2의 DM 모듈을 오픈하고 일반폼을 오픈하면 dbGrid가 정상적으로 DataSource2와 연결된 것을 확인할 수 있다.
프로젝트 그룹이 열릴 때 첫번째 프로젝트의 DM(데이터모듈)이 자동 오픈된다는 것이다.
해결방법은 2가지다
첫번째(방법1)는 코딩으로 일반폼의 onCreate 이벤트 핸들러에 dbGrid의 DataSource 속성값을 직접할당한다.
예를 들어 dbGrid2 := frmDm.DataSource2
또 하나(방법2)는 데이터 모듈 DM의 이름을 프로젝트 그룹내에서 유일하게 주는 것이다
예를 들어 Dm_project1 으로 ... 프로젝트 명이 실행파일 명이니 이름을 유일하게 짓는 것은 어렵지 않을 것이다.
나는 현재 방법1을 사용한다. 이미 DM이라는 이름으로 많은 일반폼에서 참조하고 일일이 바꾸는 것이 큰 일이기 때문이다.
하지만 앞으로 새로운 프로젝트를 만들때 무조건 방법2 대로 프로젝트 명이 들어간 데이터 모듈을 만들겠다.
이와 같은 이치로 AdoConnection, PopupMenu 등도 프록젝트 그룹내에 프로젝트 순서에 따라 디자인 타임에 저장된 속성값이 안보일 수 있다.
재미나는 현상(?)은 대분의 프로젝트에서 TAdoConnection 은 하나 인데 이 이름을 AdoConn으로 모든 DM 모듈에서 사용하고 일반폼에 TAdoQuery가 Dm의 AdoConn을 참조한다면 위의 현상을 발견할 수 없다 왜냐하면 어느 Dm을 참조하든 AdoConn이 존재하니까 ㅎㅎ
설명이 장황한데 이해가 될지 모르겠다.
델파이 버전은 Delphi2007
어째든 어렵게 여러 날을 실험하고 구글링하여 얻은 결과다.
'델파이' 카테고리의 다른 글
리눅스 ssh, telnet, shell(쉘) 일괄파일 삭제 스크립트 (0) | 2013.08.21 |
---|---|
Windows Server 2008 시간 동기화 설정 (0) | 2013.08.09 |
ComboBox Item 선택시 이벤트 순서, CheckBox 클릭이베트, ComboBox 펼치기 (0) | 2013.06.14 |
rtf파일 다양한 인쇄, 열기 방법, ShellExecute사용 (0) | 2013.05.10 |
바코드 인쇄 관련 (0) | 2013.02.15 |