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

C++빌더 Q&A
C++Builder Programming Q&A
[2777] Re:[질문] 트리뷰의 OnExpanding 이벤트 오버라이드하기
박지훈.임프 [cbuilder] 4114 읽음    2000-01-19 00:00
임문환 님이 쓰신 글 :
: 앞전의 TImageList 문제는 말씀하신대로 비트맵의 높이가 만들 때와는 달리 15가 되어 있더군요(황당).
: 그래서 무조건 높이를 16으로 지정해버렸읍니다. 이제 그부분에 있어서 컴포넌트는 문제가 없습니다.
: 그런데 유심히 살펴보니 TCustomTreeView의 OnExpanding은 제대로 호출되는 반변
: 제가 만든 컴포넌트 내부의 OnExpanding 이벤트 핸들러가 호출되지 않습니다.
: (오버라이딩이 제대로 되지 않는 듯합니다.)
: 이 이벤트 핸들러는 말 그대로 트리가 확장될 때 호출되는 것으로 알고 있습니다.
: 그런데 아래의 다른 이벤트 핸들러들은 모두 제대로 호출됩니다.
:
: 이 핸들러가 하는 일은 트리뷰의 '+' 단추를 클릭했을 때 트리가 확장되게 되는데 이 때 해당 디렉터리의
: 바로 밑의 자식 디렉터리뿐만아니라 자식의 자식(손자) 디렉터리까지 찾아 트리뷰에 추가하는 것입니다.
: 그렇게 해야 현재 디렉터리가 확장되었을 때 자식 디렉터리의 왼쪽에 '+' 단추를 표시할 수 있습니다.
: 자식 디렉터리가 있는데도 '+' 단추가 없으면 답답하게 보이고 하위 디렉터리 존재유무를 알려면
: 반드시 현재 디렉터리의 이름을 더블클릭해야만하므로 복잡하게 됩니다.
:
: 그리고 한 가지 덧붙이면, 이 컴포넌트를 IDE에 등록한 후 응용 프로그램의 폼에 놓고 응용 프로그램에 OnExpanding 이벤트
: 핸들러를 설치하면 그 것은 호출되더군요. 그 곳에서 컴포넌트 내부의 OnExpanding 이벤트 핸들러를 명시적으로 호출하면
: 호출이 됩니다. 하지만 이런식으로 컴포넌트를 사용한다면 문제가 많겠지요.
:
: 수고스럽더라도 도와주시면 감사하겠습니다.
:
: .H 파일에서
: class TCustomDirectoryListBox : public TCustomTreeView
: {
:  .
:  .
:  .
: protected:
:     virtual void __fastcall DblClick();
:     virtual void __fastcall Change(TTreeNode *Node);
:     virtual void __fastcall KeyPress( char &Key);
:     virtual void __fastcall Expanding( TTreeNode *Node, bool &AllowExpansion);
: published:
:  __property OnChange;
:  __property OnDblClick;
:  __property OnExpanding;
:  __property OnKeyPress;
: }
:
: .Cpp 파일에서
: void __fastcall TCustomDirectoryListBox::Expanding(TTreeNode *Node,bool &AllowExpansion)
: {
:  .
:  .
:  .
: }
:
: 감사합니다.
:
:




임펠리테리입니다.

이해가 조금 부족해서 설계를 잘못하신 것 같습니다. TCustomTreeView를 상속받아 새로운 컨트롤을
만들면서 Expanding()이라는 함수를 오버라이드한다고 생각하신 듯한데, TCustomTreeView에는 Expanding()이란
함수가 처음부터 없습니다. 그러므로 새로 만드신 Expanding() 함수는 오버라이드된 것이 아니라 없는
함수를 새로 만든 것이 되는 겁니다. 그래서 TCustomTreeView 내부에서 호출해주지도 않습니다.

보여주신 소스에서 짐작할 수 있는 정보가 워낙 적어서 확신할 수는 없습니다만, 오버라이드를
시도한 것은 아마도 OnExpanding 이벤트도 계속 동작하도록 두고, 그 이벤트의 직전이나 직후에 특정
작업을 하도록 하기 위해서였겠죠? 그러려면 CanExpand() 메소드를 오버라이드해야 합니다.
트리뷰 컨트롤의 선언이 포함되어있는 ComCtrls.hpp 헤더파일을 뒤져보면, 이 함수의 선언은 다음과
같습니다.
DYNAMIC bool __fastcall CanExpand(TTreeNode* Node);
그러므로 이와 똑같은 형식으로 선언하고 함수를 만들어야하죠. (virtual이 아닌 DYNAMIC이라는 것을
주의하세요.)
리턴값이 bool로 되어있는데, 상속받은 원래의 CanExpand()로부터 돌려받은 값을 그대로 리턴하면
되겠죠?

그럼 참고하시길...

+ -

관련 글 리스트
2767 [질문] 사용자 정의 컴포넌트에서 이벤트 핸들러가 실행되지 않음. 임문환 3963 2000/01/18
2777     Re:[질문] 트리뷰의 OnExpanding 이벤트 오버라이드하기 박지훈.임프 4114 2000/01/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.