Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 강좌/문서
Delphi Programming Tutorial&Documents
[102] 기존 콤포넌트를 다른 콤포넌트로 대체하는 방법 Part 1
주정섭 [jjsverylong] 6538 읽음    2006-07-08 14:27
델파이로 프로그램을 만들다 보면 어떤 콤포넌트들을 다른 콤포넌트로 대체하고 싶은 경우가 있다. 예를 들어 어떤 폼에 있는 TEdit 콤포넌트들을 TMyEdit 라는 콤포넌트로 모조리 대체하고 싶은 경우다. 이런 것이 필요하게 되는 이유는, 프로그램을 버전업하면서 새로운 기능을 추가해야 하는데, 기존 콤포넌트에 이런 기능이 없거나, 기존 콤포넌트의 소스가 없어서 수정 불가능하거나, 기존 콤포넌트의 소스가 있다고 해도 함부러 수정할 수 없는 경우이다. 특히 대체하려는 콤포넌트가 델파이 기본 콤포넌트라면, 함부로 델파이 기본 콤포넌트 소스를 고쳤다가는 득보다 실이 월등히 많다.

같은 이유로 델파이 최상위 유닛이나 다름없는 System.pas를 고치는 것도 매우 위험한 행위이다. 대부분의 경우, 델파이 기본 소스를 수정하는 것은 최후의 대안으로 남겨둬야 한다. 델파이 기본 소스를 수정하면 후일 엄청난 나비 효과를 당할 가능성이 매우 크다. 

기존 콤포넌트를 다른 콤포넌트로 대체하는 것에는 몇가지 유형이 있다.


1. 폼의  몇개의 콤포넌트를 다른 콤포넌트로 대체해야 한다.-----
예를 들면 A 폼에는 10개의 TEdit 콤포넌트가 가 있다고 가정하면 의 두개 TEdit만 TMyEdit로 대체하기를 원할 경우이다

2. 폼의 특정 클래스 콤포넌트 모두를 다른 콤포넌트로 대체해야 한다.  ----
예를 들면 A 폼에 10개의 TEdit 콤포넌트가 있는데, 이 10개의 TEdit 모두를 TMyEdit로 대체하기를 원할 경우이다.
   
3. 프라젝트의 모든 폼에 있는 TEdit 콤포넌트를 TMyEdit로 대체해야 한다.  ----
모든 폼의 TEdit를 TMyEdit로 반드시 대체해야만 할 경우이다. 예를 들자면, 폼의 모든 TEdit에 대해서 엔터키를 누르면,다음 Edit 박스로 포커스를 이동하게하는 기능을 추가해야할 경우이다.


1항은 비교적 쉽게 해결할 수 있으므로 각자 방법을 찾아보길 바라며, 이 강좌에서 소개할 내용은 2항에 관한 것이다.

기존 콤포넌트를 다른 콤포넌트로 대체하는 가장 무식한 방법은, 기존 콤포넌트를 폼에서 하나씩 제거하고, 다른 콤포넌트로 대체한 뒤에, 대체한  콤포넌트의 속성값과 이벤트를, 예전 콤포넌트의 속성값들로 일일이 새로 설정하는 방법이 있다. 그런데, 이 방법은 실수할 가능성이 너무 많기 때문에 아주 간단한 폼이 아니면 사실 적용 불가능한 방법이다.

또 다른 방법은 박지훈씨가 잘 사용한다는 방법으로, 폼 리소스 파일을 텍스트 형태로 보면서 기존 콤포넌트들을 다른 콤포넌트로 대체하는 것이다. 예를 들면 다음 소스는 두개의 TEdit 콤포넌트가 놓여진 폼 리소스 파일을 텍스트 형태로 본 것이다. 폼 리소스를 폼디자이너가 아닌 텍스트 파일로 보는 방법은, 마우스 오른쪽 버튼을 누른 뒤 View as Text 메뉴를 선택하면 된다. Alt+F12를 눌러도 되지만, 이 핫키는 델 7에서만 동작하는 것 같다.

object Form7: TForm7
  .... 중략
  object Edit1: TEdit
    Left = 112
    Top = 24
    Width = 121
    Height = 21
    ImeName = 'Microsoft IME 2003'
    TabOrder = 0
    Text = 'Edit1'
  end
  object Edit2: TEdit
    Left = 112
    Top = 72
    Width = 121
    Height = 21
    ImeName = 'Microsoft IME 2003'
    TabOrder = 1
    Text = 'Edit2'
  end
end

여기서 TEdit를 모조리 TMyEdit로 변경하고, 폼 소스 상단 uses 문에 TMyEdit 가 추가된 유닛을 추가하고, 폼을 저장했다가 새로 열면 기존 TEdit를 TMyEdit로 바꿀 수 있을 것이다.

그런데 이 방법은 몇가지 문제점이 있는데, 검색 치환 과정에서 실수할 가능성이 있다는 점과, 후일 이 폼에서는 더이상 TEdit 콤포넌트를 사용하면 안된다는 것을 숙지해야 하며, 이 작업을 하기 전에 델파이 IDE 에 TMyEdit 콤퍼넌트를 제대로 등록 시켜 둬야 한다는 번거로움이 있다. 

여러 가지 이유로 인해, 나는 내가 만든 클래스를 굳이 콤포넌트화시키지 않는다. 콤포넌트화 시키면 여러가지 부작용이 발생하는데, 첫째로 콤포넌트화 하기 위해서 실제 업무와는 별로 상관없는 쓰잘데 없는 노가다 코딩들이 수반되어야 하며, 둘째로 그 콤포넌트를 델파이 IDE에 반드시 설치해야 한다는 번거로움이 있다. 세째로 후일 버전관리가 무지 골치 아파진다는 것이다.

첫번째와 세번째 이유가 바로 내가 굳이 쓸데없이 콤퍼넌트화를 하지 않는 가장 큰 이유다. A 프라젝트는 버전 1의 TMyEdit 콤포넌트를 사용했다고 치자. A 프라젝트보다 나중에 작성한  B 프라젝트는 버전2의 TMyEdit를 사용했다고 치자. 그런데 이미 납품한 A 프라젝트에서 버그가 발생하여 A 프라젝트 소스를 수정해야 한다면, 버전 1의 TMyEdit를 설치한 상태에서 디버깅해야 할 것이다.

그런데, 델파이는 버전이 다른 동일한 콤포넌트를 두번 설치하는 것을 허용하지 않기 때문에, A 프라젝트 디버깅을 제대로 하려면, 현재 설치된 버전2 TMyEdit를 제거하고 버전1 TMyEdit를 새로 설치해야 할 것이다. 이는 매우 번거로울 뿐만 아니라, 기존 다른 프라젝트들의 버전 관리마저 엉망으로 만들 수 있는 위험한 행위이다.

그리고, 콤포넌트를 많이 설치하면 무지 번거로운 점이 많기 때문에, 어떻게든 콤포넌트 설치 갯수를 줄이는 것이 머리가 덜 아프다. 하여튼간에 쓰잘데 없이 쪼잔한 기능들의 콤포넌트들을 많이 만들면 무지 머리 아파진다. 그러면, 버전관리의 문제점도 없으면서, 콤포넌트 설치의 번거로움도 없으면서 깔끔하게 기존 콤포넌트를 대체하는 좋은 방법은 없을까?

<<< To Be Continued >>>

+ -

관련 글 리스트
102 기존 콤포넌트를 다른 콤포넌트로 대체하는 방법 Part 1 주정섭 6538 2006/07/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.