'프로그래밍/Delphi'에 해당되는 글 1건

  1. 2019.01.25 델파이의 이벤트 Sender란
2019. 1. 25. 15:11

procedure TForm1.Button1Click(Sender: TObject); 
begin 
… 
end; 

위의 Button1Click 메소드는 Sender라는 TObject 포인터를 매개변수로 받는다. 

델파이에서 모든 이벤트핸들러는 최소한 한 개의 Sender 매개변수를 가진다. 

버튼이 클릭될 때 OnClick에 대한 이벤트핸들러가 호출되는데 Sender라는 매개변수는 해당 이벤트핸들러를 호출하는데 사용된 버튼(여기서는 당연히 버튼)을 참조한다. Button1을 클릭하면 Button1Click이 호출되며 Button1이라는 객체의 포인터가 Sender라는 매개변수를 통해 전달받게 된다. 
그렇다면 왜 Sender라는 매개변수를 넘겨주는 것일까? 


Sender 매개변수의 역할은 해당 이벤트를 실행한 주체가 어떤 컴포넌트인지 알려준다. 

이를 통해 서로 다른 두 컴포넌트가 동일한 이벤트 핸들러를 사용하는 것이 가능해진다. 

예를 들어  button1과 button2이 동일한 기능을 수행하도록 할 때 이벤트 핸들러를 각각 작성하지 않고 한 개만 작성하여 두 컴포넌트가 이를 공유하도록 하면 된다. 


이벤트 핸들러를 공유하기 위해서 해주어야 할 작업은 다음과 같다. 


첫째,    컴포넌트에 대한 이벤트 핸들러를 작성한다. 
둘째,    컴포넌트를 작성한다. 
셋째,    Object Inspector에 event 페이지를 클릭한다. 
넷째,    컴포넌트의 액션에 해당하는 event에 기작성된 이벤트 핸들러 리스트를 연다. 
다섯째, 공유하고자 하는 첫번째 컴포넌트의 이벤트 핸들러를 선택한다. 


이제 한 이벤트 핸들러를 두 개(혹은 그 이상)의 컴포넌트가 공동으로 사용하는 것이 가능하다. 
그럼 다음 예제를 통해 어떤 컴포넌트가 이벤트 핸들러를 실행하고 있는지 Sender를 통해 확인해 보자. 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
if Sender = Button1 then 
  ShowMessage(‘Button1 clicked!’) 
else if Sender = MenuItem1 then 
  ShowMessage(‘Button2 clicked!’) 
else 
  ShowMessage(‘??? clicked’); 
end;          

procedure TForm1.Button2Click(Sender: TObject); 
begin 
    Button1Click(Button2); 
end; 

procedure TForm1.Button2Click(Sender: TObject);의 결과는 어떻게 될까? 


그렇다 ‘??? clicked’이 될 것이다.

Posted by 토실토실천재