C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[11613] Re:Label 컴포넌트를 하나 만들어봤는데...
박지훈.임프 [cbuilder] 1670 읽음    2006-04-09 17:23
상당히 잘 만드셨습니다. ^^
그리고 실제 기능 구현.. 그라디언트나 베벨 관련으로는 아주 깔끔하네요.

의견을 달라고 하셨으니까... 자잘한.. 어떻게 보면 크게 의미가 없는 부분에 대해서만 몇마디 써보겠습니다.
기분 나쁘게 듣지 마시고 편하게 들어주시면 감사하겠습니다.

먼저 눈에 띄는 건... 내부의 네이밍이 일반적인 VCL의 표준 네이밍을 벗어나서 좀 알아보기가 불편하네요.
예를 들어 OnLeave 함수같은 메시지 핸들러는 보통 WmMouseLeave 이렇게 이름을 짓습니다.
그리고 속성이나 이벤트의 내부 필드 값을 m_.. 이런 식으로 지으셨는데, 아시겠지만 보통은 F... 이렇게 짓죠.

그리고.. WM_PAINT 메시지는 직접 받아서 처리할 수도 있지만, TGraphicControl과 TCustomControl에는 이미 버추얼
함수가 준비되어 있습니다. 메시지핸들러를 구현하는 대신 오버라이드만 하면 되죠.
virtual void __fastcall Paint(void);
TControl과 TWinControl 대신 TGraphicControl과 TCustomControl 컨트롤을 선택해서 상속받는 이유가 바로 이 Paint()
버추얼 함수와 Canvas 속성 때문입니다. Paint() 버추얼 함수 자체가 WM_PAINT 메시지를 처리하는 역할을 합니다.
어떤 이유로 이 두가지를 안쓸 거 같으면 그냥 TControl이나 TWinControl을 쓰는 편이 낫습니다. 게다가 VCL의 Paint
함수를 호출하는 부분을 보시면 아시겠지만, 캔바스에 락을 걸어서 DC 핸들 처리까지 다 해주므로 더 안전합니다.
(이 처리를 해주지 않으면 예상치 못한 버그가 발생할 수 있습니다)

그리고... Caption 속성을 직접 만들어주셨는데, 그렇게 해도 안될 것은 없지만, 이 Caption 속성은 TControl 레벨에서
protected로 이미 추가되어 있습니다. 따라서 __published로 비저빌리티를 변경하기만 하면 됩니다.

ZoomRect 함수는 왜 헤더에서 구현했는지 잘 모르겠네요. 외부에서 직접 호출할 필요가 없다면 cpp 파일에서 구현하는 게 보통이죠.

그리고 캡션을 그릴 때 TextOut 함수를 쓰셨는데, 어차피 API 함수를 쓰실 거라면 나중에 기능 확장을 위해서는 DrawText
함수를 쓰시는 것이 낫습니다. DrawText 함수를 쓰면 좌우 정렬이나 여러줄 출력 등 기능이 더 강력하죠.
캡션의 문자 길이가 컨트롤의 실제 너비보다 너무 길 때 자동 축약 표현(...)으로 나오게 할 수도 있고요.

VCL 컴포넌트를 만들다보면, 의외로 기존 VCL의 상속 구조를 잘 알 필요가 있습니다.
땀 뻘뻘 흘리면서 구현하고 나니까 이미 베이스 클래스에서 구현되어 있어서 오버라이딩만 하면 되었던 경우도 흔하고
상속하기로 선택한 베이스 클래스보다 다른 클래스가 더 나은 경우도 있습니다.
그중에서도 다음의 몇가지는 거의 필수적으로 알아둬야 합니다.
TPersistent, TComponent, TControl, TGraphicControl, TWinControl, TCustomControl

그리고 웬만한 기본적인 메시지들은 대체로 VCL에 이미 구현되어 있어서 오버라이딩만 하면 되는 경우가 많습니다.
말씀드렸던 Paint 함수가 그렇고, DoClick, DoMouseDown, KeyPress 등등등은 기본적으로 알고 있는 것이 좋습니다.

좀 설교조로 써진 거 같은데... 기분 나쁘게 들리지는 않았으면 좋겠습니다.
직접 컴포넌트를 만드는 개발자가 그리 많지는 않은데, 컴포넌트를 만드신다니까 저로서도 반갑고 해서 앞으로 갈 길을
알려드리고 싶었을 뿐이랍니다. ^^;;


WARSHIP 님이 쓰신 글 :
: 기본 TLabel의 기능이 너무 단순해서 한번 만들어봤습니다..
: 아무래도 빌더에대해 깊이 모르고 제작한 것이라서
: TNotifyEvent 같은것들을 원래 저렇게 쓰는건지 모르겠네요.
:
: 결과적으로 소스를 올려놨는데. 좀 보시고
: 개선점이나 소감등을 올려주시면 대단히 감사하겠습니다.
:
: 광고글 같기도 한데.. -_-; 안잘릴려나 모르겠습니다.
:
: 그럼 좋은 하루 보내시길 바랍니다~
WARSHIP [warship]   2006-04-09 21:53 X
감사합니다 ^^ 사실 제가 만들면서도... TPersistent 등에 대해 잘 알지 못한 상태에서 만든 것이 사실입니다. 거희 기존의 TLabelPlus 라는 컴포넌트를 만드신 분의 소스를 보고 따라가면서 만든것이라..  기능 구현을 뺀 그 외의 부분은 배꼈다고 보는것이 옳겠습니다. ^^; 좋은 지적 감사드립니다. 아무래도 최상위 클래스들의 공부를 한후에 만드는것이 훨씬 수고로움을 더는것이 되겠군요. 그럼 좋은하루 되세요~ ^^
WARSHIP [warship]   2006-04-09 21:56 X
ZoomRect는 ...
그런함수는 헤더에 선언하면 바로 인라인함수로 되지 않나요? ^^;
따로따로 하기 귀찮기도 하고..  그래서 그랬습니다 ^^;
클래스의 경우 헤더에 구현하면 바로 인라인으로 되는데.
함수는 갑자기 기억이 안나네요.. (치매증세가....)

+ -

관련 글 리스트
11608 Label 컴포넌트를 하나 만들어봤는데... WARSHIP 1542 2006/04/08
11613     Re:Label 컴포넌트를 하나 만들어봤는데... 박지훈.임프 1670 2006/04/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.