제가 아짐 윈도우즈 프로그래밍의 메시지 처리 방식에 대해 잘 이해를 못해서 질문이 좀 횡설수설 할꺼 같은데
이해 좀 부탁 드릴께요.
각 이벤트가 발생할 때 어플리케이션으로 어떤 메시지가 올까 싶어서 아래와 같이 실험을 해 봤습니다.
그냥 메세지 오는걸 그대로 메모장에 출력하는건데요.
제가 알기로는 WM_KEYUP이나, WM_KEYDOWN 등 모든 메세지가 Messages Unit안에 상수로 정의 되어 있어야 한다고 생각 했습니다. 그런데 막상 모든 메시지를 다 찍어보니 상수로 정의 되어 있지 않은 코드가
있었습니다. 예를 들어 F는 WM_PAINT, 20은 WM_SETCURSOR 처럼 각 신호에 대한 상수가 다 Messages
유닛 안에 정의있는데, B029, B014등 정의 되어 있지 않은 신호가 있었습니다.
질문 1) B029, B014 등 이런 신호는 무엇인고 어떻게 확인 할수 있는지가 궁굼합니다.
질문 2) stringgrid 같은 경우는 Onchange 이벤트가 없는데, stringgrid에서 한 셀에 어떤 값을 입력한 후
OnChange 이벤트처럼 발생 시키려면 어떻게 해야 하는지 궁굼합니다.
제가 알기로는 WM_KEYDOWN 신호가 발생하면 자동으로 OnKEYDown이벤트가 발생하는 걸로 알고 있는데
OnChange 이벤트가 발생 하려면 어떤 신호를 받아야 할까요?
※ 윈도우즈와 어플리케이션의 메시지와 이벤트 처리 방식등에 대해서 구체적으로 설명 주시면 감사 하겠습니다. 친절한 답변 부탁 드릴께요~
<!--CodeS-->
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
StringGrid1: TStringGrid;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
SGProc : TWndMethod;
procedure SGHandler(var msg : TMessage);
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure Tform1.SGHandler(var msg : TMessage);
begin
SGProc(msg);
memo1.Lines.Add(IntToHex(msg.Msg, 0));
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
SGProc := StringGrid1.WindowProc;
StringGrid1.WindowProc := SGHandler;
end;
end.
<!--CodeE-->
답변1) B029, B014등 B000 이상의 메시지는 Controls.pas에 정의되어 있습니다.
Delphi내에서 별도로 정의된 Borland만의 메시지라고 생각하시면됩니다.
답변2) TStringGrid의 Cell에 대한 OnChange Event는 OnSetEditText를 이용하시면 됩니다.
도움이 되셨길 바랍니다.