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

델파이 Q&A
Delphi Programming Q&A
[4050] [답변] SHARPLY7/ 델파이-Procedure에서 Procedure부르
박지훈.임프 [cbuilder] 1274 읽음    1998-08-17 01:10
안녕하세요. 천리안 프로그래머 포럼 C++Builder 담당자 임펠리테리입니다.

댁스터님이 답변해주신 대로, 이벤트 핸들러에서 다른 이벤트 핸들러를 호출하는 것은

아무런 문제가 없습니다.

단지, 조금 주의해야 할것이 있는데.. 먼저 모든 컴퍼넌트의 이벤트 핸들러에 인자로

넘겨지는 Sender의 역할에 대해 설명부터 해야겠네요. Sender는 넘겨받은 이벤트 핸

들러 함수에서 현재 이벤트가 발생한 컴퍼넌트를 인식하기 위한 방법으로 넘겨지는

것입니다. 폼클래스 내의 모든 컴퍼넌트의 Owner는 그 폼자체로서 this(델파이라면

Self죠?)로서 참조가 가능하지만, 이벤트가 발생한 컴퍼넌트는 Sender를 통하지 않으

면 억세스가 불가능합니다. 다시말해, OnClick 이벤트가 발생한 컨트롤을 확인하려면

Sender를 검사해야 한다는 겁니다. 쉽게 생각해버리면, 하나의 이벤트 핸들러를 하나

의 컴퍼넌트에 할당해서 사용하니까 뭐 검사하고 말고 할 필요가 있나, 해버릴수도

있습니다만, 실제로는 여러개의 컴퍼넌트에 하나의 이벤트핸들러를 공유시켜 줄 경우

가 많이 생깁니다. 예를 들어, Button들이 대여섯개씩 되고, OnClick 이벤트 핸들러

가 하는 일이 모두 같다면 그걸 각각 핸들러를 작성한다면 무척 비효율적이겠죠?

그래서 여러 컴퍼넌트에 하나의 핸들러를 공유시킬 필요가 생기는데, 이런 경우에

그 핸들러를 공유하는 여러 컴퍼넌트중 어느 컴퍼넌트에서 이벤트가 발생했는지를

알아서 그 컴퍼넌트를 억세스할때 사용하는 겁니다.

이렇게 길게 Sender의 역할을 설명하는 이유는... 먼저 답변을 해주신 댁스터님께서

예를 든 경우, 즉 Edit1의 OnChange에서 Button1의 OnClick을 호출하려면

Button1Click(Sender);

해주면 된다는 것이, 경우에 따라 문제를 일으킬 수도 있다는 겁니다. 그 경우란, 당

연히 님께서 작성하신 Button1의 OnClick 이벤트 핸들러에서 Sender를 검사하거나 억

세스를 해야 할 경우를 말하는 것입니다. 그럼, 더 일반적이고 문제를 일으키지 않을

방법은, 이벤트핸들러를 코드로서 호출할때는 해당 컴퍼넌트를 Sender로서 넘겨주는

것이죠.

그러니까 위에서 예를 든 경우는,

Button1Click(Button1);

해주셔야 한다는 겁니다. 물론, 크게 문제가 되지 않을수도 있습니다만, 이런 조금의

문제거리가 될수 있는 코딩 습관으로 해서, 나중에 상당한 실력을 쌓은 프로그래머가

된 이후에도 쉽게 찾아내지 못하는 골치아픈 버그로 나타날수도 있다는 것을 유념하

셔야 합니다.

그럼 도움되시길 바라면서, 이만...





독립문에서 임펠리테리였습니다.

(cbuilder, skyhi18)



+ -

관련 글 리스트
4050 [답변] SHARPLY7/ 델파이-Procedure에서 Procedure부르 박지훈.임프 1274 1998/08/17
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.