메시지 메서드
메시지 메서드
클래스에 새로 등장한 메서드 종류가 메시지 메서드(message method)예요. 메시지 메서드의 포인터는 정수 또는 문자열 상수와 함께 특별한 테이블에 저장돼요.
출처: Message methods
본문
메시지 메서드는 주로 Win32나 GTK 같은 GUI 툴킷에서 콜백 함수를 쉽게 다루려는 목적으로 만들어졌어요. 델파이와 달리 Free Pascal은 문자열을 메시지 식별자로도 받아들여요. 메시지 메서드는 항상 가상(virtual)이에요.
클래스 선언 다이어그램에서 볼 수 있듯이, 메시지 메서드는 Message 키워드 뒤에 정수 상수 표현식과 함께 선언해요.
메시지 메서드는 타입 있는/없는 var 인자를 하나만 받을 수 있어요.
Procedure TMyObject.MyHandler(Var Msg); Message 1;
메시지 함수의 구현은 일반 메서드와 다르지 않아요. 메시지 메서드를 직접 호출하는 것도 가능하지만 그렇게 하지 않는 게 좋아요. 대신 TObject.Dispatch 메서드를 사용해야 해요. 메시지 메서드는 자동으로 가상이 돼서, 하위 클래스에서 오버라이드할 수 있어요.
TObject.Dispatch 메서드로 메시지 핸들러를 호출할 수 있어요. 이 메서드는 system 유닛에 선언되어 있고, 첫 번째 위치에 호출할 메시지 ID(cardinal)를 가진 var 매개변수를 받아요. 예를 들어:
Type
TMsg = Record
MSGID : Cardinal;
Data : Pointer;
Var
Msg : TMSg;
MyObject.Dispatch (Msg);
이 예시에서 Dispatch 메서드는 객체와 모든 조상(객체에서 시작해 상속 클래스 트리를 따라 올라가며)을 살펴서 MSGID 메시지를 가진 메시지 메서드가 선언됐는지 확인해요. 그런 메서드를 찾으면 호출하고 Msg 매개변수를 전달해요.
그런 메서드가 없으면 DefaultHandler가 호출돼요. DefaultHandler는 TObject의 가상 메서드로 아무것도 하지 않지만, 필요한 처리를 제공하려고 오버라이드할 수 있어요. DefaultHandler는 다음과 같이 선언돼요.
procedure DefaultHandler(var message);virtual;
정수 식별자를 쓰는 메시지 메서드 외에도, Free Pascal은 문자열 식별자를 쓰는 메시지 메서드도 지원해요.
Procedure TMyObject.MyStrHandler(Var Msg); Message 'OnClick';
문자열 메시지 핸들러의 동작 방식은 일반 정수 메시지 핸들러와 같아요.
TObject.DispatchStr 메서드로 메시지 핸들러를 호출할 수 있어요. system 유닛에 선언되어 있고, 첫 번째 위치에 호출할 메시지 ID(short string)를 가진 매개변수 하나를 받아요. 예를 들어:
Type
TMsg = Record
MsgStr : String[10]; // Arbitrary length up to 255 characters.
Data : Pointer;
Var
Msg : TMSg;
MyObject.DispatchStr (Msg);
이 예시에서 DispatchStr 메서드는 객체와 모든 조상을 살펴 MsgStr 메시지가 있는 메시지 메서드가 선언됐는지 확인해요. 찾으면 호출하고 Msg 매개변수를 전달해요.
그런 메서드가 없으면 DefaultHandlerStr이 호출돼요. DefaultHandlerStr은 TObject의 가상 메서드로 아무것도 하지 않지만, 필요한 처리를 위해 오버라이드할 수 있어요. 선언은 다음과 같아요.
procedure DefaultHandlerStr(var message);virtual;
더 알아보기
- 클래스 메서드(Class methods)
- 정적 클래스 메서드(Static class methods)