출처: http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=42&indx=196518&keyword1=TAction을&keyword2=활용하자

주정섭
(손님)

2004-06-24 오후 11:31:38
카테고리:팁
3105회 조회


TAction을 활용하자.

주위 사람들로부터 델파이 소스를 받아서 분석하다 보면, 델파이의 막강한 기능을 너무 무시(?)한 코드가 많다. 심지어 어떤 사람들로부터 비주얼 베이직에 비해서 델파이는 코딩량이 많기 때문에 생산성이 떨어진다는 이야기를 들은 적도 있다.

여러분들은 어떻게 생각하는가? 델파이는 정말 비베에 비해서 코딩량이 많은 개발툴이라고 생각하는가? 델파이는 노가다 코딩이 많은 개발툴이라고 생각하는가? 나의 경험에 의하면 현존하는 개발툴치고 델파이만큼 코딩 생산성이 뛰어난 언어는 지극히 드물다는 것이다. 비주얼 C++, 비주얼 베이직, 파워빌더, 모두들 델파이만큼의 생산성은 지원하지 못한다. C#은 이론적 언어 측면으로만 본다면 생산성이 매우 뛰어날 것 같으나, 현업에서의 실질적 생산성 측면에서는 아직은 좀더 많이 기다려봐야할 툴 같다.

문제는 상당수의 많은 델파이 개발자들이 너무 심한 노가다 코딩을 하고 있고, 그로 인해서 델파이의 뛰어난 생산성을 스스로 저버리는 실수를 범하고 있다는 것이다. 델파이는 다른 어떤 언어보다도 대부분의 경우 코딩을 매우 간략하게 할 수 있다. 파워 빌더의 경우 그 희안한 데이타 윈도우란 기능 때문에, 리포팅에서는 타 개발툴을 능가하지만, 순수 코딩적 측면에서는 결코 델파이를 능가할 수 없다. 왜냐하면 델파이는 오브젝트 파스칼이 객체지향을 거의 완벽하게 지원하며, VCL이라는 막강한 클래스 라이브러리를 가지고 있기 때문이다.

델파이 예찬론은 그만하고, 델파이의 막강한 기능 중에서, 의외로 잘 사용하지 않는 기능 중 하나인 TAction 콤포넌트에 대해서 논해 보려 한다. 많은 델파이 개발자들이 이 막강한 콤포넌트를 의외로 잘 사용하지 않는 것 같기 때문이다.

디자인 패턴을 배워 봤고 TAction을 사용해본 사람이라면, 델파이의 TAction 클래스는 Command 패턴을 적용한 것이라는 것을 잘 알 것이다. 사실 델파이 VCL 내부에는 여러 디자인 패턴들이 적용되어 있다. 디자인 패턴은 매우 오래된 개발방법론이며, 일종의 클래스 설계 정석 방법론 같은 것이므로, 볼랜드 델파이 개발자들이 당연히 이런 지식을 적용하여 델파이를 개발했다.

비주얼 C++는 ON_UPDATE_COMMND라는 요상한 매크로로 TAction과 비슷한 기능을 지원하지만, 델파이의 TAction보다는 기능이 정말로 미약하다. 어찌 일개 매크로가 객체지향적으로 설계된 TAction을 능가할 수 있겠는가? 어쨋든 TAction은 정말 기가 막힌 Non Visual 콤포넌트다. C#을 공부하면서 델파이의 TAction과 동일한 역할을 가진 클래스가 있는지 살펴 보았지만, 유감스럽게도 C#에는 이런 기능을 가진 클래스가 존재하지 않았다. 한때 델파이 설계자였던 앤델스 헤이즐버그가 TAction과 유사한 클래스를 닷넷 프레임웍에는 왜 포함하지 않았는지 참으로 납득하기 힘들다.

이론은 그만하고 TAction을 대체 어디에 사용하는지 알아보자. TAction 은 다음 세가지 핵심적 기능을 가진다.

1. 여러 UI(User Interface) 요소에 대해서 동일한 동작(기능)을 부여하고, 외향을 동일하게 하고 싶을 때.
2. 특정 UI 요소의 활성/비활성화(Enable/Disable)을 자동화하고 싶을 때.
3. 매우 복잡한 동작을 프라젝트 전반에 걸쳐 체계적으로 관리하고 싶을 때

이중 3항은 설명이 무지 어려우므로, 후일 시간이 나거나 다른 고수가 해줄 것으로 믿고, 1,2항의 기능에 대해서만 논해 보자.

이 강좌에 첨부한 예제는 다음과 같은 기능을 하는 프로그램이다.

[프로그램 기능]

1. 두개의 입력박스(TEdit)는 오로지 [정수]만을 입력 받는다.
2. 합계산 버튼을 누르면 하단 텍스트박스에 두 입력박스를 정수화하여 합한 값을 보여준다.
3. 값지우기 버튼을 클릭하면 두 입력박스의 내용을 지운다(Clear).
4. 메인메뉴에는 합계산과 값지우기 버튼과 동일한 역할을 하는 메뉴항목이 존재해야 한다. 즉 메뉴로던, 버튼으로든 동일한 기능 선택이 가능해야 함.

예제를 실행해보면 아주 간단한 프로그램이기 때문에 위 글 내용을 충분히 이해할 것이다. 그런데 이런 프로그램을 만들려면 중요한 UI 구성 요건이 필요하다.

[프로그램의 UI(User Interface) 제한 조건]

1. 두 입력박스에 모두 정수값 형태의 문자열이 입력된 상태에서만 합계산 버튼이 활성화되어야 한다. 합계산 메뉴 또한 마찬가지다.
2. 값지우기 버튼은 두 입력박스 중 어느 하나라도 입력 내용이 있을 때만 활성화 된다. 즉 두 입력박스 모두 빈상태라면 값지우기 버튼은 비활성화 되어야 한다. 값지우기 메뉴 항목도 마찬가지다.

만일 TAction을 사용하지 않았다면 이 프로그램에는 메뉴와 버튼의 활성/비활성화 처리를 위해서, 엄청나게도 많은 이벤트 메서드들을 만들어야 할 것이다. 그러나 TAction을 사용함으로써 단 몇개의 이벤트로만 해결할 수 있다.

예제 내용을 정리해보면..

1. 예제에서 TAction 콤포넌트들은 TActionList에 들어 있다. TActionList는 Action 콤포넌트들의 컨테이너(저장소) 역할을 한다. TAction 콤포넌트는 TActionList 콤포넌트 안에서 생성할 수 있다.

2. 메뉴와 버튼은 이벤트 메서서드를 속성창으로 만들지 않았고, Caption, Enabled 속성을 일일이 수동으로 지정하지도 않았다. 메뉴와 버튼의 Action 속성에 자신이 행해야 할 Action을 할당했을 뿐이다. 이로 인해서 연결된 Action 콤포넌트의 기능이 그대로 메뉴와 버튼에 전이된다. 예를 들면, 합계산 메뉴의 Caption이나 OnClick 이벤트는 actCalc를 Action 속성에 연결한 것만으로 자동 지정된다는 것이다. 합계산 버튼도 이런식으로 actCalc에 연결했다.

3. Action 콤포넌트의 OnExecute 이벤트는, 그 액션의 주된 역할인 작업 사항(할일들)을 기술하는 이벤트 메서드이다. 일반적으로 버트이나 메뉴의 OnClick 이벤트와 거의 비슷한 역할을 한다.

4. Action 콤포넌트의 OnUpdate 이벤트는, 그 Action 콤포넌트가 언제 활성/비활성화될지를 기술하는 코드가 들어간다. 이 이벤트 메서든 Idle 타임에 주기적으로 호출되고, 이로 인해서 그 액션에 연결된 모든 Control은 자동으로 활성/비활성화 된다.

결론인즉,

1. 복잡한 UI에서 특정 콘트롤을 활성/비활성화하는 로직이 복잡하다면 TAction을 사용하라.
2. 여러 콘트롤이 동일 동작을 수행해야 한다면, 역시 Action을 사용하라.

델파이 폼 코딩에서 중요한 사항 중 하나가 이벤트 메서드를 최대한 줄이라는 것이다. 그래야만 후일 소스 분석시 여러모로 편리하기 때문이다. TAction은 이런 이벤트 줄이기에 지대한 공헌을 할 수 있고, 코드를 한곳으로 모으는 역할도 한다.

그러나, TAction에는 이보다 더 황당무게하고 재밌는 기능들이 많다. TAction은 거의 콤포넌트같은 역할을 하기 때문에 새로운 TAction타입을 정의할 수도 있다. 이에 관한 다른 고수의 추가글을 기대해 본다.



 덧글 : 6 개 
  
김시준 (non)          삭제를 위한 암호를 넣어 주세요
    
저는 주로 펑션키를 사용할 때 주로 이용을 했었는데.. 많은 도움이 됐습니다..   2004-06-25 
 
민성기 (non)          삭제를 위한 암호를 넣어 주세요
    
좋은 글 항상 감사드리고 있습니다~ ^^;   2004-06-26 
 
신동훈 (non)          삭제를 위한 암호를 넣어 주세요
    
흠 액션은 상당히 좋은 기능입니다 예전에 메신져 만들때 연계되는 UI때문에 코드로 하기 귀찮아서 액션리스트로 해결해버린적이 있습니다. 코드가독성도좋고 괜찮더군요    2004-06-28 
 
신동훈 (non)          삭제를 위한 암호를 넣어 주세요
    
그리고 액션 리스트 뿐만아니라 액션메니져와 기타 에디셔널 탭에이는 액션관련 컴포넌트도 상당히 괜찮습니다    2004-06-28 
 
전희원 (non)          삭제를 위한 암호를 넣어 주세요
    
정말 많은 도움이 되었습니다.   2004-07-21 
 
블루판 (myselfcall)          삭제를 위한 암호를 넣어 주세요
    
소스코드에 형 변환에러가 있더군요
텍스트박스에 임의의값을 넣고 실행하시면됩니다.   2008-02-04 오후 2:48:07 
 
                

Posted by 세모아
,