Delphi는 Borland Company의 객체 지향 시각적 소프트웨어 개발 도구입니다. Delphi는 Visual C++와 Visual Basic의 장점을 결합합니다. 즉, 사용하기 쉽고 강력하며 특히 인터페이스 디자인, 데이터베이스 프로그래밍 및 네트워크 프로그래밍 분야에서 고유한 장점을 가지고 있습니다.
델파이의 메시지
메시지는 이벤트가 발생했음을 응용 프로그램에 알리기 위해 Windows에서 보내는 알림입니다. Delphi에서는 대부분의 경우 Windows 메시지가 VCL 이벤트에 캡슐화되어 있지만 해당 VCL 이벤트만 처리하면 됩니다.
Delphi에서 메시지는 TMessage 레코드 형식으로 정의됩니다. Message.pas 파일을 열면 Tmessage가 다음과 같이 정의되어 있는 것을 볼 수 있습니다.
유형
TMessage = 압축된 기록
메시지: 추기경;
케이스 정수
0: (WParam: Longint;
LParam: Longint;
결과: Longint);
1: (WParamLo: 단어;
WParamHi: 단어;
LParamLo: 단어;
LParamHi: 단어;
결과Lo: 단어;
결과안녕: 단어);
끝;
그 중 Msg는 다른 메시지와 다른 상수값으로, 이러한 상수값은 윈도우 단위로 미리 정의된 상수일 수도 있고, 사용자가 정의한 상수일 수도 있다. Wparam은 일반적으로 메시지와 관련된 상수 값이거나 창이나 컨트롤에 대한 핸들일 수 있습니다. LParam은 일반적으로 메모리의 데이터에 대한 포인터입니다.
결과는 메시지 처리의 반환 값입니다. Wparam, Lparam 및 Result는 모두 32비트입니다. 하위 16비트 또는 상위 16비트에 액세스하려면 각각 WparamLo, WparamHi, LParamLo, LparamHi, ResultLo 및 ResultHi를 사용할 수 있습니다.
일반 Tmessage 외에도 Delphi에서는 각 Windows에 대해 특수 메시지 레코드가 정의됩니다. Message.pas 파일을 찾아볼 수 있으며 다음은 키보드 메시지 기록입니다.
TWMKey = 압축된 레코드
메시지: 추기경;
CharCode: 단어;
미사용: 단어;
주요데이터: Longint;
결과: 롱린트;
WM_KEYDOWN, WM_KEYUP, WM_CHAR, WM_SYSKEYDOWN, WM_SYSKEYUP 및 WM_SYSCHAR 레코드와 같은 키보드 관련 메시지도 TWMkey로 정의됩니다. Message.pas 파일에는 다음 명령문이 있습니다.
TWMChar=TWM키다운=
TWM키업=TWMsys;
-KeyDown=TWMysKeyUp=;
TWMkey;TWMSysChar=TWMkey;
메시지 보내기
메시지 처리는 애플리케이션이 Windows 메시지에 응답하는 방법을 정의하는 것입니다. Delphi에서 각 메시지에는 자체 처리 프로세스가 있어야 하며, 하나의 Tmessage 또는 기타 특수 메시지 레코드만 전달할 수 있습니다. 메서드 선언 뒤에는 메시지 명령이 있어야 하며 그 뒤에는 0부터 시작하는 메시지가 와야 합니다. 32767 사이의 상수로.
앞서 언급한 메시지는 모두 표준 Windows 메시지(WM_X)입니다. 그 외에도 VCL 내부 메시지, 알림 메시지 및 사용자 정의 메시지가 있습니다.
VCL 내부 메시지는 일반적으로 "CM_"으로 시작하며 VCL 내부 항목을 관리하는 데 사용됩니다. 구성 요소의 속성 값이나 기타 특성을 변경하는 경우 내부 메시지를 통해 다른 구성 요소에 변경 사항을 알려야 합니다. 예를 들어 입력 포커스 활성화 메시지는 입력 포커스를 수락하거나 포기하기 위해 활성화되거나 비활성화된 구성 요소로 전송됩니다.
알림 메시지도 있습니다. 창의 자식 컨트롤에 문제가 발생하면 부모 창에 알림 메시지를 보내야 합니다. 버튼, 목록 상자, 편집 상자 등과 같은 표준 창 컨트롤에서만 작동합니다. 표준 Windows 후에 알림 메시지가 선언된 후 Message.pas 파일을 엽니다.
const
{$EXTERNALSYM BN_CLICKED}
BN_CLICKED = 0;
{$EXTERNALSYM BN_PAINT}
BN_PAINT = 1;
{$EXTERNALSYM BN_HILITE}
BN_HILITE = 2;
위는 버튼에 대한 알림 메시지로, 각각 사용자가 버튼을 클릭했다는 것, 버튼을 다시 그려야 한다는 것, 사용자가 버튼을 강조했다는 것을 나타냅니다.
사용자는 자신의 메시지를 정의하고, 자신에게 메시지를 보내고, 메시지 처리 절차를 작성할 수도 있습니다. 메시지의 상수 값은 WM_USER+100 ~ $7FFF입니다. 이 범위는 Windows에서 사용자 정의 메시지용으로 예약되어 있습니다.
Delphi 메시지를 보내는 방법에는 세 가지가 있습니다.
1. Tcontrol 클래스의 객체 메소드를 수행합니다. 모든 폼이나 컨트롤에 메시지를 보낼 수 있으며, 폼이나 컨트롤의 인스턴스만 알면 됩니다. 그 진술은 다음과 같다:
함수 Tcontrol.Perform(Msg:Cardinal;Wparam,Lparam:Longint):Longint
2. Windows API 함수 SendMessage() 및 Postmessage(). 그 진술은 다음과 같다:
함수 SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
함수 SendMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
PostMessage 함수는 애플리케이션의 메시지 대기열에 메시지를 추가합니다. 애플리케이션의 메시지 루프는 메시지 큐에서 등록된 메시지를 추출한 다음 이를 해당 창으로 보냅니다.
SendMessage 함수는 메시지 큐를 통해 창 프로시저에 직접 메시지를 보낼 수 있습니다. 따라서 SendMessage는 Windows가 즉시 값을 반환해야 할 때 사용되고 PostMessage는 여러 응용 프로그램이 메시지를 순서대로 처리해야 할 때 사용됩니다. Perform은 기본적으로 SendMessage와 유사하며 창 프로시저로 직접 전송됩니다. SendMessage 및 Postmessage 함수는 메시지를 보내기 위해 창 핸들만 알아야 하므로 Delphi가 아닌 폼에 메시지를 보낼 수 있지만 Perform은 폼이나 컨트롤의 인스턴스를 알아야 합니다.
VCL 메시지 처리 메커니즘
Delphi 애플리케이션의 소스 코드에는 application.Run 문이 있습니다. 그 기능은 메시지 루프를 시작한 다음 Application.PROcessMessage를 호출하는 것입니다. 메시지 큐에서 메시지가 검색되면 Application.OnMessage 이벤트가 트리거됩니다. 이런 방식으로 Windows 자체가 메시지를 처리하기 전에 OnMessage 이벤트 처리에 응답하게 되며, 이는 어떤 메시지 처리보다 뛰어나며 위에서 언급한 것처럼 등록된 메시지, 즉 PostMessage에서 보낸 메시지만 받습니다. Application.OnMessage 이벤트에 응답하는 처리 프로세스는 다음과 같이 선언된 TmessageEvent 유형이어야 합니다.
type TMessageEvent = 객체의 프로시저(var Msg: TMsg; var Handled: Boolean);
TMsg가 Windows에 정의된 메시지 레코드인 경우 다음과 같이 선언할 수 있습니다.
프로시저 OnMyMessage(var Msg:TMsg;var Handled:Boolean);
그런 다음 이 메서드를 Application.OnMessage 이벤트에 할당합니다.
Application.OnMessage :=OnMyMessage;
OnMessage 이벤트는 응용 프로그램에 전송된 모든 메시지를 캡처합니다. 이는 매우 바쁜 이벤트이므로 메시지 처리를 위해 OnMessage 이벤트를 처리하는 동안 중단점을 설정하는 것은 현명하지 않습니다.
VCL 객체가 메시지를 수신하는 데 사용하는 메서드를 MainWndProc이라고 합니다. Twincontrol 클래스에 정의된 정적 메서드이며 오버로드될 수 없습니다. 메시지가 MainWndProc를 떠날 때 메시지는 개체의 WndProc 메서드로 전달됩니다. WndProc 메서드는 Dispatch 메서드를 호출하는 Tcontrol 클래스에 정의된 가상 메서드입니다. Dispatch는 들어오는 메시지를 기반으로 해당 처리 방법을 검색하고, 결국 찾을 수 없으면 찾을 때까지 상위 클래스에서 메시지 처리 방법을 계속 검색합니다. Defaulthandler 메서드는 메시지에 대한 최종 처리를 수행한 다음 메시지를 Windows DefWindowProc 함수 또는 기타 기본 창 프로시저에 전달합니다.