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
[26936] Re:[TObject * Sender]에 관하여
posix.duo [posix] 1157 읽음    2003-08-27 01:35
TObject *Sender는 이벤트를 발생시킨 VCL 객체를 넘겨주는 객체 포인터입니다.
TObject는 모든 VCL 콤포넌트의 최상위 조상입니다. 따라서 어떤 VCL 콤포넌트이든 TObject로부터 파생되어 나온 것들이기 때문에 공통 파라미터 인자로 사용할 수가 있겠죠..
그래서 모든 VCL 이벤트에는 TObject *Sender라는 파라미터 인자가 있는 것입니다.
즉, 어떤 VCL 콤포넌트에서 발생시킨 이벤트인지를 구별할 수 있도록 하는 것입니다.

어디서 발생시켰는지를 굳이 구별하는 이유는 하나의 이벤트 함수를 여러 VCL 콤포넌트에 연결을 할 수 있기 때문에 그 이벤트가 발생한 시점에서 어떤 콤포넌트에서 발생시킨 것인지를 확인해야할 필요가 있는 경우가 종종 있습니다. 그럴 때는 아주 유용하게 쓰이지요.

이벤트를 공통으로 묶어주는 경우에 같은 클래스의 콤포넌트들로만 묶어줄 수도 있고(대부분의 경우), 다른 클래스의 콤포넌트들의 어떤 이벤트를 하나로 묶어서 쓰는 경우도 있습니다.

예를 들자면,
Form1에 Edit1, Label1, Image1, Memo1, Button1이 있다고 할때 이것들의 Click 이벤트를 하나로 묶어 줄 경우에 각 콤포넌트의 OnClick 이벤트를 'AnythingClick'이라는 이벤트로 연결했을 경우에 아래와 같이 이벤트를 작성했다면...

void __fastcall TForm1::AnythingClick(TObject *Sender)
{
    Memo1->Lines->Add(Sender->ClassName() + " : " + ((TComponent*)Sender)->Name);
}

메모 콤포넌트에 마우스로 클릭하는 콤포넌트의 클래스이름과 콤포넌트의 이름이 추가되는 것을 볼 수 있습니다.
이처럼 어떤 객체(콤포넌트)를 통한 이벤트가 발생했는지를 알 수 있도록 구별해주는 것이 TObject *Sender 입니다.
위 코드에서 보듯이 포인터를 넘긴다는 것은 이벤트를 발생시킨 객체의 주소를 넘기는 것이기 때문에 타입캐스팅을 통하여 캐스팅해주는 객체의 멤버 변수나 메소드를 호출할 수도 있습니다.

만약, 계산기를 만든다고 할 때 숫자키 역활을 하는 버튼들을 모두 하나의 이벤트로 묶는 경우에는 TButton으로 타입캐스팅하여 TButton의 모든 속성과 메소드를 사용할 수 있게 되는 것입니다.

글재주가 없어서 짧은 글로써 설명을 할려니 제대로 설명을 했는지 모르겠네요....
도움이 되셨길 바랍니다. 그럼 이만...

+ -

관련 글 리스트
26935 [TObject * Sender]에 관하여 마차 916 2003/08/27
26936     Re:[TObject * Sender]에 관하여 posix.duo 1157 2003/08/27
33259         Re:Re:[TObject * Sender]에 관하여 수야!╋ 928 2003/08/27
33258         Re:Re:[TObject * Sender]에 관하여 이진우 919 2003/08/27
26941         [냉무] 감사합니다. 많은 도움이 되었습니다. -초보마차- 이진우 746 2003/08/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.