|
posix.duo 님이 쓰신 글 :
: 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의 모든 속성과 메소드를 사용할 수 있게 되는 것입니다.
:
: 글재주가 없어서 짧은 글로써 설명을 할려니 제대로 설명을 했는지 모르겠네요....
: 도움이 되셨길 바랍니다. 그럼 이만...
:
|