Q&A

  • 메시지와 이벤트 관해 질문 드립니다.
제가 아짐 윈도우즈 프로그래밍의 메시지 처리 방식에 대해 잘 이해를 못해서 질문이 좀 횡설수설 할꺼 같은데
이해 좀 부탁 드릴께요.

각 이벤트가 발생할 때 어플리케이션으로 어떤 메시지가 올까 싶어서 아래와 같이 실험을 해 봤습니다.
그냥 메세지 오는걸 그대로 메모장에 출력하는건데요.

제가 알기로는 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-->
2  COMMENTS
  • Profile
    김동원 2008.01.14 19:19

    답변1) B029, B014등 B000 이상의 메시지는 Controls.pas에 정의되어 있습니다.
              Delphi내에서 별도로 정의된 Borland만의 메시지라고 생각하시면됩니다.
    답변2) TStringGrid의 Cell에 대한 OnChange Event는 OnSetEditText를 이용하시면 됩니다.

    도움이 되셨길 바랍니다.


  • Profile
    황경수 2008.01.15 20:12
    정말 감사합니다~ *^^*

    그런데.. 한가지 더 여쭤 볼께요.

    한글짜 한글짜 입력할 때마다 change 이벤트가 발생하는게 아니라 글짜가 완전히 입력되어 (즉 enter키 친거처럼 셀에서 나왔을 때) 글짜가 바꼈는지에 대한 이벤트는 알 수 없을까요?