ÀúÀ۱ǿ¡ ´ëÇÑ °øÁö
ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ ¸ðµç ±Û°ú ¼Ò½º ÄÚµå´Â ÀÛÀÚÀÎ Àú ±è¼ºµ¿ÀÇ ÁöÀû Àç»êÀÌÁö¸¸ ¹«´ÜÀ¸·Î ¹èÆ÷Çϰųª Ã¥À̳ª °­ÀÇ ±³ÀçµîÀ» À§ÇÑ º¹Á¦ µî ÀúÀÛ±ÇÀ» ÀúÇØÇÏ´Â ÇàÀ§¸¦ Á¦¿ÜÇϰí´Â ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ÇÇÑ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©´Â ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖÀ¸³ª Àü¹®À» ÀüÁ¦ÇÏ´Â ÀÏÀº Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.


1.5. ¸Þ¼Òµå

1.5.1. °³¿ä
ºñ·Ï ÇÁ·ÎÆÛƼ°¡ ÄÞÆ÷³ÍÆ®¿Í »ç¿ëÀÚ°£ÀÇ ±âº»ÀûÀÎ ÀÎÅÍÆäÀ̽º¸¦ Á¦°øÇØ ÁÖÁö¸¸ ÇÁ·ÎÆÛƼ´Â ´ÜÁö ÄÞÆ÷³ÍÆ®ÀÇ ¼Ó¼º¸¸À» °ü¸®ÇÏÁö ÄÞÆ÷³ÍÆ®ÀÇ ±â´ÉÀ» Ç¥ÇöÇÒ ¼ö´Â ¾ø´Ù. ¿¹¸¦ µé¾î ¸¹Àº ÄÞÆ÷³ÍÆ®µéÀÌ ÀÚ½ÅÀÇ µ¥ÀÌÅ͸¦ Ŭ¸³º¸µå¿¡ º¹»çÇϱâ, Àß¶ó³»±â, ºÙÀ̱⠵îÀÇ ±â´ÉÀ» °¡Áö°í Àִµ¥ ÀÌ·± ÀÛ¾÷µéÀº ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ¼­ ¼öÇàµÉ ¼ö ¾ø´Ù. ÀÌó·³ ÇÁ·ÎÆÛƼ·Î Ç¥ÇöÇÒ ¼ö ¾ø´Â ÄÞÆ÷³ÍÆ®ÀÇ ±â´ÉÀ» Á¤ÀÇÇÒ ¶§ »ç¿ëÇÏ´Â °ÍÀÌ ¸Þ¼ÒµåÀÌ´Ù. ¸Þ¼Òµå´Â ÀÏ¹Ý ÇÔ¼ö³ª ÇÁ·Î½ÃÀúó·³ Á¤ÀÇÇÏÁö¸¸ ÇØ´ç Ŭ·¡½º¿Í °­ÇÑ °á¼Ó·ÂÀ» °¡Áö°Ô µÈ´Ù.
¸Þ¼Òµå¸¦ Á¤ÀÇÇÒ ¶§
  • ÄÞÆ÷³ÍÆ®¸¦ »ç¿ëÇÏ·Á¸é ¹Ýµå½Ã È£ÃâÇØ ÁÖ¾î¾ß ÇÏ´Â ¸Þ¼Òµå
  • ƯÁ¤ ¼ø¼­´ë·Î È£ÃâÇØ Áà¾ß µ¿ÀÛÇÏ´Â ¸Þ¼Òµå
  • ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ³ª À̺¥Æ®¸¦ ºñÁ¤»óÀûÀÎ »óÅ·Π¸¸µé¾î ¹ö¸®´Â ¸Þ¼Òµå
µîÀº °¡±ÞÀû ¸¸µéÁö ¸»¾Æ¾ß ÇÑ´Ù.
¸Þ¼ÒµåÀÇ À̸§Àº Ãà¾à ÇüÅ·Π¸¸µéÁö ¸»°í °¡±ÞÀû ±â´ÉÀ» ³ªÅ¸³»´Â µ¿»ç¸¦ ¸ðµÎ »ç¿ëÇØ¼­ ¸Þ¼Òµå À̸§¸¸ ºÁµµ ¾î¶² ±â´ÉÀ» ÇÏ´Â ¸Þ¼ÒµåÀÎÁö ¾Ë ¼ö ÀÖµµ·Ï ÀÛ¼ºÇØ¾ß ÇÑ´Ù. ¸Þ¼Òµå°¡ ÇÔ¼ö¶ó¸é ¹ÝȯÇÏ´Â °ªÀÌ ¹«¾ùÀÎÁöµµ ¾Ë ¼ö ÀÖµµ·Ï ÇØ ÁÖ¸é ÁÁ´Ù. ¾Æ·¡ Ç¥´Â Àß ÀÛ¼ºµÈ ¸Þ¼Òµå À̸§°ú ±×·¸Áö ¸øÇÑ ¸Þ¼ÒµåÀÇ ¿¹¸¦ º¸¿© ÁØ´Ù.

Ç¥ 1-4 ÁÁÀº ¸Þ¼Òµå À̸§
ÁÁ´Ù³ª»Ú´Ù
procedure CutToClipboardProcedure CutClip
procedure SetHeightProcedure SetH
function GetTextLengthFunction GetLen


1.5.2. ¸Þ¼Òµå Æ÷ÀÎÅÍ(Method Pointers)
¸Þ¼Òµå Æ÷ÀÎÅÍ´Â ÇÁ·Î½ÃÀú Æ÷ÀÎÅÍ¿Í ´Þ¸® µ¶¸³ ÇÁ·Î½ÃÀú¸¦ °¡¸®Å°Áö ¾Ê°í Ŭ·¡½ºÀÇ ¸Þ¼Òµå¸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍÀÌ´Ù. ¸Þ¼Òµå Æ÷ÀÎÅÍ´Â µ¨ÆÄÀÌ¿¡¼­ ÁÖ·Î À̺¥Æ®¸¦ ´Ù·ê ¶§ »ç¿ëÇϴµ¥ Ŭ·¡½º¿Í Ŭ·¡½º»çÀÌ¿¡ ¼­·ÎÀÇ ¸Þ¼Òµå¸¦ ¿¬°áÇϴµ¥ »ç¿ëÇϸé À¯¿ëÇÏ´Ù.
¸Þ¼Òµå Æ÷ÀÎÅÍ ÇüÀº ÇÁ·Î½ÃÀú Æ÷ÀÎÅÍ Çü°ú °°ÀÌ ¼±¾ðÇÏÁö¸¸ ¸¶Áö¸·¿¡ of object Ű¿öµå°¡ Ãß°¡µÈ´Ù.
¾Æ·¡ ¿¹Á¦¸¦ º¸¸é ProcShow´Â ÇÁ·Î½ÃÀú Æ÷ÀÎÅÍ º¯¼ö·Î MethodShow´Â ¸Þ¼Òµå Æ÷ÀÎÅÍ º¯¼ö·Î ¼±¾ðµÇ¾ú´Ù. btnExecProcÀ» ´©¸£¸é ProcShow º¯¼ö¿¡ ShowValue ÇÁ·Î½ÃÀú¸¦ ´ëÀÔÇÑ µÚ ProcShow¸¦ ½ÇÇàÇϰí btnExecMethod¸¦ ´©¸£¸é TMethodPointerExam Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÑ µÚ¿¡ ÀνºÅϽºÀÇ ShowValue ÇÁ·Î½ÃÀú¸¦ MethodShow º¯¼ö¿¡ ´ëÀÔÇÏ°í ½ÇÇàÇÑ´Ù. ¸¸¾à¿¡ ÇÁ·Î½ÃÀú Æ÷ÀÎÅÍ¿¡ ¸Þ¼Òµå Æ÷ÀÎÅ͸¦ ´ëÀÔÇϰųª ±× ¹Ý´ëÀÇ °æ¿ì·Î ÄÚµùÇÏ¸é ¾Æ·¡ ±×¸²°ú °°ÀÌ ÇüÀÌ ´Ù¸£´Ù´Â ÄÄÆÄÀÏ ¿¡·¯¸¦ º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸®½ºÆ® 1.11 ¸Þ¼Òµå Æ÷ÀÎÅÍ ¿¹Á¦
unit fMethodPointerExam;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TProcedurePointerType = procedure (Value : Integer);
  TMethodPointerType = procedure (Value : Integer) of object;

  TMethodPointerExam = class
    procedure ShowValue(Value : Integer);
  end;

  TForm1 = class(TForm)
    btnExecProc: TButton;
    btnExecMethod: TButton;
    procedure btnExecProcClick(Sender: TObject);
    procedure btnExecMethodClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ProcShow : TProcedurePointerType;
    MethodShow : TMethodPointerType;
  end;

var
  Form1: TForm1;

procedure ShowValue(Value : Integer);

implementation

{$R *.DFM}

procedure ShowValue(Value : Integer);
begin
  Application.MessageBox(PChar('Value = ' + IntToStr(Value)),
                         PChar('ÇÁ·Î½ÃÀú Æ÷ÀÎÅÍ'),
                         MB_ICONINFORMATION + MB_OK);
end;

{ TMethodPointerExam }

procedure TMethodPointerExam.ShowValue(Value: Integer);
begin
  Application.MessageBox(PChar('Value = ' + IntToStr(Value)),
                         PChar('¸Þ¼Òµå Æ÷ÀÎÅÍ'),
                         MB_ICONINFORMATION + MB_OK);
end;

procedure TForm1.btnExecProcClick(Sender: TObject);
begin
  Self.ProcShow := ShowValue;
  Self.ProcShow(1004);
  // Self.MethodShow := ShowValue;
  // À§¿Í °°ÀÌ ´ëÀÔÇϸé ÄÄÆÄÀÏ ½Ã Çü ȣȯ ¿¡·¯°¡ ³­´Ù.
end;

procedure TForm1.btnExecMethodClick(Sender: TObject);
var
  TempClass : TMethodPointerExam;
begin
  TempClass := TMethodPointerExam.Create;
  try
    Self.MethodShow := TempClass.ShowValue;
    Self.MethodShow(1004);
    // Self.ProcShow := TempClass.ShowValue;
    // À§¿Í °°ÀÌ ´ëÀÔÇϸé ÄÄÆÄÀÏ ½Ã Çü ȣȯ ¿¡·¯°¡ ³­´Ù.
  finally
    TempClass.Free;
  end;
end;

end.




±×¸² 1-9 Çü ȣȯ ÄÄÆÄÀÏ ¿¡·¯


1.6. À̺¥Æ®

1.6.1. °³¿ä
¾îÇø®ÄÉÀÌ¼Ç »ç¿ëÀÚ°¡ È­¸é¿¡¼­ ¹öưÀ» ´©¸£¸é ¹öư ÄÞÆ÷³ÍÆ®´Â OnClick À̺¥Æ®¸¦ ¹ß»ý½ÃŲ´Ù. ¹öư À§¿¡¼­ ¸¶¿ì½º¸¦ ¿òÁ÷ÀÌ¸é ¸¶¿ì½º Æ÷ÀÎÅÍÀÇ À§Ä¡°¡ º¯°æ µÇ¾ú´Ù´Â À̺¥Æ®ÀÎ OnMouseMove°¡ ¹ß»ýÇÑ´Ù. Űº¸µå·Î ±ÛÀÚ¸¦ ÀÔ·ÂÇϸé OnKeyPress À̺¥Æ®°¡ ¹ß»ýÇÑ´Ù. ÀÌó·³ À̺¥Æ®´Â ÄÞÆ÷³ÍÆ® ³»ºÎ¿¡¼­ ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ°¡ ó¸®ÇØ ÁÙ Çʿ䰡 ÀÖ´Â ¾î¶² »ç°ÇÀÌ ¹ß»ýÇß´Ù´Â °ÍÀ» ¾Ë·Á ÁÖ°í »ç°ÇÀ» ó¸®ÇÒ ½ÃÀÛÁ¡À» Á¦°øÇÏ´Â ¿ªÇÒÀ» ÇÑ´Ù.
¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ´Â À̺¥Æ® Çڵ鷯¸¦ ÀÛ¼ºÇؼ­ À̺¥Æ®¿¡ ´ëÇÑ ÀûÀýÇÑ Ã³¸®¸¦ ÇØÁØ´Ù. À̺¥Æ® Çڵ鷯´Â º¸Åë À̺¥Æ®¸¦ ¹ß»ý½ÃŲ ÄÞÆ÷³ÍÆ®¸¦ Æ÷ÇÔÇϰí ÀÖ´Â Æû Ŭ·¡½ºÀÇ ¸Þ¼Òµå·Î Á¤ÀǵȴÙ. ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ°¡ À̺¥Æ® Çڵ鷯¸¦ ÀÛ¼ºÇØ Áشٴ °ÍÀº ÄÞÆ÷³ÍÆ®·ÎºÎÅÍ »ó¼Ó ¹Þ¾Æ¼­ ¿øÇÏ´Â ±â´ÉÀ» ÇÏ´Â »õ·Î¿î ÄÞÆ÷³ÍÆ®¸¦ ÀÛ¼ºÇÏÁö ¾Ê°í ÄÞÆ÷³ÍÆ®ÀÇ ±â´ÉÀ» È®ÀåÇÑ´Ù¶ó°í ¾ê±âÇÒ ¼ö ÀÖ´Ù. Áï À̺¥Æ®´Â »õ ÄÞÆ÷³ÍÆ®¸¦ ¸¸µéÁö ¾Ê°í ¿øÇÏ´Â ±â´ÉÀ» ±× ÄÞÆ÷³ÍÆ®¿¡ Ãß°¡ÇÒ ¼ö ÀÖ´Â ¿©Áö¸¦ ³²°Ü Áشٴ ¸»ÀÌ µÈ´Ù.
¿¹¸¦ µé¾î ¹öư ÄÞÆ÷³ÍÆ®´Â OnClick À̺¥Æ®¸¦ °¡Áö°í Àִµ¥ »ç¿ëÀÚ°¡ ¹öưÀ» ´©¸¦ ¶§¸¶´Ù OnClickÀ̺¥Æ®´Â °è¼Ó ¹ß»ýÇÏ°í ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ´Â ¿ÀºêÁ§Æ® ÀνºÆåÅÍ·Î OnClick À̺¥Æ® Çڵ鷯¸¦ ÀÛ¼ºÇؼ­ ¹öưÀÌ ´­·ÁÁú ¶§ ¸¶´Ù Àû´çÇÑ ÀÀ´äÀ» ÇØÁÖµµ·Ï ÄÞÆ÷³ÍÆ®ÀÇ ±â´ÉÀ» È®ÀåÇÒ ¼ö ÀÖ´Ù.
À̺¥Æ®´Â ½ÇÁ¦·Î ¸Þ¼Òµå Æ÷ÀÎÅÍ·Î ±¸ÇöµÇ´Âµ¥ ¸®½ºÆ® 6.12¿¡¼­ ¹öư ÄÞÆ÷³ÍÆ® btnExecProcÀÇ OnClick ¸Þ¼Òµå Æ÷ÀÎÅÍ¿¡ Æû Ŭ·¡½ºÀÇ btnExecProcClick ¸Þ¼Òµå°¡ ¿¬°áµÇ´Â °Íó·³ ÇÑ Å¬·¡½º¿Í ´Ù¸¥ Ŭ·¡½º »çÀÌ¿¡ ¼­·ÎÀÇ ¸Þ¼Òµå¸¦ ¿¬°á½ÃÄÑÁÖ´Â ¿ªÇÒÀ» ÇÑ´Ù.
À̺¥Æ®¸¦ ¸¸µé·Á¸é ¸Þ¼Òµå Æ÷ÀÎÅÍ ÇüÀÇ º¯¼ö¸¦ Çϳª ¸¸µé°í ÀÌ º¯¼ö¸¦ Á÷Á¢ Á¶ÀÛÇÏ´Â ÇÁ·ÎÆÛƼ¸¦ ¼±¾ðÇØ ÁÖ¸é µÈ´Ù. À̺¥Æ®µµ ÇÁ·ÎÆÛƼÀ̱⠴빮¿¡ Published ¿µ¿ª¿¡ ¼±¾ðÇÏ¸é ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ À̺¥Æ® Çڵ鷯¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ°í PublicÀ¸·Î ¼±¾ðÇÏ¸é ½ÇÇà½Ã¿¡ À̺¥Æ® Çڵ鷯¸¦ ´ëÀÔÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
¾Æ·¡ ¸®½ºÆ®´Â controls.pas¿¡ ÀÖ´Â TControl ÄÞÆ÷³ÍÆ®ÀÇ ÀϺκÐÀ» ¹ßÃéÇÑ °ÍÀ¸·Î À̺¥Æ®¸¦ ¾î¶»°Ô ¼±¾ðÇÏ°í »ç¿ëÇÏ´ÂÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

¸®½ºÆ® 1.12 À̺¥Æ® ¼±¾ð
type
  TMouseEvent = procedure(Sender: TObject; Button: TMouseButton;
    Shift: TShiftState; X, Y: Integer) of object;
  TMouseMoveEvent = procedure(Sender: TObject; Shift: TShiftState;
    X, Y: Integer) of object;
  TDragOverEvent = procedure(Sender, Source: TObject; X, Y: Integer;
    State: TDragState; var Accept: Boolean) of object;
  TDragDropEvent = procedure(Sender, Source: TObject;
    X, Y: Integer) of object;

  TControl = class(TComponent)
  private
    { »ý·« }
    FOnMouseDown: TMouseEvent;
    FOnMouseMove: TMouseMoveEvent;
    FOnMouseUp: TMouseEvent;
    FOnDragDrop: TDragDropEvent;
    FOnDragOver: TDragOverEvent;
    FOnResize: TNotifyEvent;
    //  TNotifyEvent = procedure(Sender: TObject) of object;
    //  TNotifyEvent ÇüÀº classes.pas¿¡ Á¤ÀǵǾî ÀÖ´Ù.
    FOnClick: TNotifyEvent;
    FOnDblClick: TNotifyEvent;
    { »ý·« }
  protected
    { »ý·« }
    property OnClick: TNotifyEvent
      read FOnClick
      write FOnClick
      stored IsOnClickStored;
    property OnDblClick: TNotifyEvent
      read FOnDblClick
      write FOnDblClick;
    property OnDragDrop: TDragDropEvent
      read FOnDragDrop
      write FOnDragDrop;
    property OnDragOver: TDragOverEvent
      read FOnDragOver
      write FOnDragOver;
    property OnMouseDown: TMouseEvent
      read FOnMouseDown
      write FOnMouseDown;
    property OnMouseMove: TMouseMoveEvent
      read FOnMouseMove
      write FOnMouseMove;
    property OnMouseUp: TMouseEvent
      read FOnMouseUp
      write FOnMouseUp;
    property OnResize: TNotifyEvent
      read FOnResize
      write FOnResize;
  public
    { »ý·« }
  published
    { »ý·« }
  end;


1.6.2. Ç¥ÁØ À̺¥Æ®
µ¨ÆÄÀÌ¿¡ Æ÷ÇÔµÈ ¸ðµç ÄÞÆ÷³ÍÆ®µéÀº ¿©·¯ °¡Áö Ç¥ÁØ À̺¥Æ®¸¦ protected ¸â¹ö·Î °¡Áö°í ÀÖ´Ù. Ç¥ 6.5¿¡ ÀÖ´Â À̺¥Æ®µéÀº ¸ðµç ÄÞÆ÷³ÍÆ®µéÀÌ °¡Áö°í ÀÖ°í Ç¥ 6.6¿¡ ÀÖ´Â À̺¥Æ®´Â À©µµ ÄÞÆ÷³ÍÆ®(À©µµ ÇÚµéÀ» °¡Áö´Â ÄÞÆ÷³ÍÆ®)µé¸¸ÀÌ °¡Áö°í Àִ ǥÁØ À̺¥Æ®ÀÌ´Ù. À̵é Ç¥ÁØ À̺¥Æ®µéÀº protected ¸â¹ö·Î ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ ÀÚ½ÅÀÌ ¸¸µç ÄÞÆ÷³ÍÆ®¿¡¼­ ¼³°è ½Ã ¶Ç´Â ½ÇÇà ½Ã¿¡ »ç¿ëÇÏ·Á¸é ¹Ýµå½Ã publicÀ̳ª published ¿µ¿ªÀ¸·Î ´Ù½Ã ¼±¾ðÇØ ÁÖ¾î¾ß ÇÑ´Ù.

Ç¥ 1-5 ¸ðµç ÄÞÆ÷³ÍÆ®°¡ °¡Áö°í Àִ ǥÁØ À̺¥Æ®
À̺¥Æ®À̺¥Æ® ¹ß»ý ½Ã±â
OnClick¿ÞÂÊ ¸¶¿ì½º ¹öưÀ¸·Î ÄÞÆ÷³ÍÆ®¸¦ Ŭ¸¯ÇÏ¸é ¹ß»ýÇÑ´Ù.
OnDblClick¿ÞÂÊ ¸¶¿ì½º ¹öưÀ¸·Î ÄÞÆ÷³ÍÆ®¸¦ ´õºí Ŭ¸¯ÇÏ¸é ¹ß»ýÇÑ´Ù.
OnMouseDownÄÞÆ÷³ÍÆ® ¿µ¿ª À§¿¡¼­ ¸¶¿ì½º ¹öưÀ» ´­·¶À» ¶§ ¹ß»ýÇÑ´Ù.
OnMouseMoveÄÞÆ÷³ÍÆ® ¿µ¿ª À§¿¡¼­ ¸¶¿ì½º Æ÷ÀÎÅͰ¡ ¿òÁ÷ÀÌ¸é ¹ß»ýÇÑ´Ù.
OnMouseUpÄÞÆ÷³ÍÆ® ¿µ¿ª À§¿¡¼­ ¸¶¿ì½º ¹öưÀ» ´­·¶´Ù ¶ÃÀ» ¶§ ¹ß»ýÇÑ´Ù.
OnDragOver°´Ã¼¸¦ ÄÞÆ÷³ÍÆ® ¿µ¿ª À§·Î ²ø°í ¿À¸é(Drag) ¹ß»ýÇÑ´Ù.
OnDragDrop²ø°í ¿Â °´Ã¼¸¦ ÄÞÆ÷³ÍÆ® À§¿¡¼­ ³õÀ¸¸é(Drop) ¹ß»ýÇÑ´Ù.
OnStartDragÄÞÆ÷³ÍÆ® ¿µ¿ª À§¿¡¼­ ¸¶¿ì½º ¿ÞÂÊ ¹öưÀ» ´©¸£°í µå·¡±×ÇÏ¸é ¹ß»ýÇÑ´Ù.
OnEndDragÄÞÆ÷³ÍÆ® ÀÚ½ÅÀÇ µå·¡±× ÀÛ¾÷ÀÌ Á¾·áÇÏ¸é ¹ß»ýÇÑ´Ù.




Ç¥ 1-6 ¸ðµç À©µµ ÄÞÆ÷³ÍÆ®°¡ °¡Áö°í Àִ ǥÁØ À̺¥Æ®
À̺¥Æ®À̺¥Æ® ¹ß»ý ½Ã±â
OnEnterÄÞÆ÷³ÍÆ®°¡ Űº¸µå ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áö¸é ¹ß»ýÇÑ´Ù.
OnExitÄÞÆ÷³ÍÆ®°¡ °¡Áö°í ÀÖ´ø Űº¸µå ÀÔ·Â Æ÷Ä¿½º¸¦ ÀÒ¾î ¹ö¸®¸é ¹ß»ýÇÑ´Ù.
OnKeyDownÄÄÆ÷³ÍÆ®°¡ Űº¸µå ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖ´Â »óÅ¿¡¼­ ۸¦ ´©¸¦ ¶§ ¹ß»ýÇÑ´Ù.
OnKeyPress¹®ÀÚ°¡ ÀÔ·ÂµÇ¸é ¹ß»ýÇÑ´Ù.
OnKeyUpÄÄÆ÷³ÍÆ®°¡ Űº¸µå ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áö°í ÀÖ´Â »óÅ¿¡¼­ ۸¦ ´­·¶´Ù ¶¿ ¶§ ¹ß»ýÇÑ´Ù.


¸¸¾à¿¡ ÀÚ½ÅÀÇ ÄÞÆ÷³ÍÆ®¿¡¼­ À̵é Ç¥ÁØ À̺¥Æ®µéÀÌ ¹ß»ýÇßÀ» ¶§ ¾î¶² 󸮸¦ ÇÏ°í ½ÍÀ¸¸é À̺¥Æ® Çڵ鷯¸¦ ÀÛ¼ºÇϰí À̵é À̺¥Æ® Çڵ鷯¸¦ °¢ À̺¥Æ®¿¡ ´ëÀÔÇØ ÁÖ¸é µÈ´Ù. ÇÏÁö¸¸ ÀÌ·± ¹æ¹ýÀ¸·Î ó¸®ÇßÀ» °æ¿ì ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚµéÀº ÀÌ À̺¥Æ®¸¦ »ç¿ëÇÒ ¼ö ¾ø°Ô µÈ´Ù.(»ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸ ÄÞÆ÷³ÍÆ® °³¹ßÀÚ°¡ ÁöÁ¤ÇÑ À̺¥Æ® Çڵ鷯¸¦ ´ëÃ¼ÇØ ¹ö¸°´Ù.) ÀÌ·± ¹®Á¦ ¶§¹®¿¡ °¢°¢ÀÇ À̺¥Æ®¿¡´Â À̺¥Æ®¸¦ ½ÇÁ¦·Î ¹ß»ý½ÃÄÑÁÖ´Â °¡»ó ¸Þ¼ÒµåµéÀÌ À¯»çÇÑ À̸§À¸·Î Á¤ÀǵǾî ÀÖ´Ù. ¿¹¸¦ µé¾î OnClick À̺¥Æ®¿¡´Â Click ¸Þ¼Òµå, OnEndDrag ¿¡´Â DoEndDrag ÀÌ·± ½ÄÀ¸·Î Á¤ÀǵǾî ÀÖ´Ù. ÀÌµé ¸Þ¼Òµå µéÀº protected ¿µ¿ª¿¡ °¡»ó ¸Þ¼Òµå·Î ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ ÆÄ»ý Ŭ·¡½º¿¡¼­ ¿À¹ö¶óÀ̵åÇØ¼­ ³»ºÎ À̺¥Æ® ó¸® ¹æ¹ýÀ» º¯°æÇØ ÁÙ ¼ö°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î OnClick À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§ ¸¶´Ù ½Ã½ºÅÛ ³»ºÎ ½ºÇÇÄ¿·Î °æ°íÀ½À» ³»°í ½ÍÀº °æ¿ì ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

type
  TMyButton = class(TButton)
  protected
    procedure Click; override;
    // Click ¸Þ¼Òµå ¿À¹ö¶óÀ̵å
  end;

{ »ý·« }

procedure TMyButton.Click;
begin
  // ¿ø·¡ ¸Þ¼Òµå ½ÇÇà
  inherited Click;
  // °æ°íÀ½ Ãâ·Â
  MessageBeep(0);
end;


1.6.3. »õ À̺¥Æ® ¸¸µé±â
´ëºÎºÐÀÇ °æ¿ì ±âº» À̺¥Æ®¸¸À¸·Î ÃæºÐÇÏÁö¸¸ °¡²û¾¿ ³ª¸¸ÀÇ À̺¥Æ®¸¦ ¸¸µé¾î¾ß ÇÒ °æ¿ì°¡ »ý±ä´Ù. À̺¥Æ®¸¦ »õ·Î ¸¸µå´Â ÀÛ¾÷Àº ±×¸® ¾î·Á¿î ÀÏÀÌ ¾Æ´Ï´Ù. ¾ðÁ¦ À̺¥Æ®°¡ ¹ß»ýÇØ¾ß ÇÏ´ÂÁö °áÁ¤Çϰí À̺¥Æ® Çڵ鷯°¡ »ç¿ëÇÒ ¸Þ¼Òµå ÇüÀ» °áÁ¤Çϰí À̺¥Æ® Çڵ鷯¸¦ ÀúÀåÇÒ µ¥ÀÌÅÍ Çʵ带 ¸¸µé¾î ÁÖ°í ÀûÀýÇÑ »óȲ¿¡¼­ À̺¥Æ®¸¦ ¹ß»ý½ÃÄÑÁֱ⸸ ÇÏ¸é µÈ´Ù.
º¸Åë ¹ß»ý »óȲÀ» ±âÁØÀ¸·Î À̺¥Æ®¸¦ Å©°Ô µÎ °¡Áö Á¾·ù·Î ±¸ºÐÇØ º¼ ¼ö Àִµ¥ Çϳª´Â ½Ã½ºÅÛ À̺¥Æ®, Áï WM_LBUTTONDOWN °°Àº À©µµ¿¡¼­ ¹ß»ýÇÏ´Â ¸Þ½ÃÁö¿¡ ´ëÀÀÇÏ´Â À̺¥Æ®ÀÌ°í ´Ù¸¥ Çϳª´Â ÄÞÆ÷³ÍÆ®ÀÇ »óŰ¡ º¯°æµÇ¾úÀ½À» ¾Ë·Á ÁÖ´Â À̺¥Æ®ÀÌ´Ù. À̺¥Æ®¸¦ ¾ðÁ¦ ¹ß»ý½ÃÄÑ¾ß ÇÒÁö¸¦ °áÁ¤Çß´Ù¸é ´ÙÀ½Àº À̺¥Æ® Çڵ鷯ÀÇ ¸Þ¼Òµå ÇüÀ» °áÁ¤ÇØ¾ß ÇÑ´Ù. ´Ü¼øÈ÷ »ç°ÇÀÇ ¹ß»ý¸¸ ¾Ë·Á ÁÖ´Â À̺¥Æ®ÀÏ ¼öµµ ÀÖ°í »ç°ÇÀÇ ¹ß»ý°ú ÇÔ²² ¾î¶² Á¤º¸¸¦ °°ÀÌ ÁÙ ¼öµµ ÀÖ°í ¾Æ´Ï¸é »ç¿ëÀڷκÎÅÍ ¾î¶² ¹Ýȯ °ªÀ» ¹ÞÀ» ¼öµµ ÀÖ´Ù.
´Ü¼øÈ÷ »ç°ÇÀÇ ¹ß»ý¸¸ ¾Ë·Á ÁÖ´Â À̺¥Æ®ÀÇ °æ¿ì À̺¥Æ®¸¦ ´©°¡ ¹ß»ý½ÃÄ×´ÂÁö¸¦ ¾Ë·Á ÁÖ´Â Sender ÀÎÀÚ Çϳª¸¸ °¡Áö°í ÀÖ´Â TNotifyEvent ÇüÀ» »ç¿ëÇÏ¸é µÈ´Ù. Á¤º¸¸¦ Á¦°øÇÏ´Â À̺¥Æ®ÀÇ °æ¿ì´Â MouseMove À̺¥Æ®¸¦ ¿¹·Î µéÀÚ¸é ¸¶¿ì½º Æ÷ÀÎÅͰ¡ ¿òÁ÷¿´´Ù´Â »ç°Ç°ú ÇÔ²² ¸¶¿ì½º Æ÷ÀÎÅͰ¡ ¾î´À À§Ä¡¿¡ ÀÖ´ÂÁöµµ ¾Ë·Á ÁØ´Ù. ÀÌó·³ Á¦°øÇϰíÀÚ ÇÏ´Â Á¤º¸¸¦ ¸Þ¼ÒµåÀÇ ÀÎÀÚ·Î Á¦°øÇÏ¸é µÈ´Ù. ¹Ýȯ °ªÀ» ÇÊ¿ä·Î ÇÏ´Â °æ¿ì¿¡´Â ¸Þ¼ÒµåÀÇ ÀÎÀÚ¸¦ var ÇüÀ¸·Î ¼±¾ðÇØ ÁÖ¸é µÈ´Ù. ¿¹¸¦ µé¾î Űº¸µå À̺¥Æ®(KeyDown, KeyPress, KeyUp) °°Àº °æ¿ì Key ÀÎÀÚ¸¦ var ÇüÀ¸·Î °¡Áö°í Àִµ¥ Key ÀÎÀÚ·Î µé¾î ¿Â Ű Äڵ带 »ç¿ëÀÚ°¡ º¯ÇüÇØ¼­ ´Ù¸¥ Äڵ带 ³Ñ°Ü ÁÙ ¼ö ÀÖ´Ù.
ÀÌÇØ¸¦ µ½±â À§·¡ °£´ÜÇÑ À̺¥Æ®¸¦ Çϳª ¸¸µé¾î º¸ÀÚ. ÇÑ/¿µ Àüȯ۰¡ ´­·¯Áú ¶§ ¸¶´Ù Űº¸µå ÀÔ·Â ¸ðµå°¡ º¯°æµÇ¾ú´Ù´Â °ÍÀ» ¾Ë·Á ÁÖ´Â À̺¥Æ®¸¦ °¡Áö°í ÀÖ´Â ÄÞÆ÷³ÍÆ®¸¦ Çϳª ¸¸µé¾î º¸ÀÚ.
À̺¥Æ®¸¦ ¾ðÁ¦ ¹ß»ý½ÃÄÑ¾ß ÇÏ´Â Áö´Â °áÁ¤ÇßÀ¸´Ï±î À̺¥Æ® Çڵ鷯°¡ »ç¿ëÇÒ ¸Þ¼Òµå ÇüÀ» ¼±¾ðÇØ º¸ÀÚ. À̺¥Æ®°¡ ¹ß»ýÇÒ ¶§ ¸¶´Ù ÇöÀç Űº¸µå ÀÔ·Â ¸ðµå°¡ ¹«¾ùÀÎÁö¸¦ ¾Ë·ÁÁÖ¸é ÁÁÀ» °ÍÀÌ´Ù. ±×·¡¼­ ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÑ´Ù.

type
  TdpbImeInputMode = ( dimHangul, dimEnglish );
  TdpbImeInputModeChange = procedure (Sender : TObject;
    ImeInputMode : TdpbImeInputMode) of object;


´ÙÀ½ À̺¥Æ® Çڵ鷯¸¦ ÀúÀåÇÒ µ¥ÀÌÅÍ Çʵå FOnImeInputModeChange¸¦ ¸¸µé¾î ÁÖ°í À̺¥Æ® ÇÁ·ÎÆÛƼ OnImeInputModeChange¸¦ ¸¸µé¾îÁØ´Ù. À̺¥Æ® ÇÁ·ÎÆÛƼÀÇ À̸§Àº ÀϹÝÀûÀ¸·Î On À¸·Î ½ÃÀÛÇÑ´Ù.
¸¶Áö¸·À¸·Î ÀûÀýÇÑ À§Ä¡¿¡¼­ À̺¥Æ®¸¦ ¹ß»ý½Ã۵µ·Ï ÄÚµùÇÑ´Ù. ¿©±â¼­´Â ÇÑ/¿µ Àüȯ ۰¡ ´­·¯Áö´ÂÁö¸¦ °Ë»çÇØ¾ß ÇϹǷΠKeyDown ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ¼­ ´­·ÁÁø Ű Äڵ尡 VK_HANGULÀ̸é À̺¥Æ®¸¦ ¹ß»ý½Ã۵µ·Ï Çß´Ù. ÇöÀç IMEÀÇ ÀÔ·Â ¸ðµå´Â IME API¸¦ ÀÌ¿ëÇØ¼­ ¾Ë ¼ö ÀÖ´Ù. IME API¸¦ »ç¿ëÇÏ·Á¸é uses Àý¿¡ Imm À¯´ÖÀ» Ãß°¡ÇØ ÁÖ¾î¾ß ÇÑ´Ù.

¸®½ºÆ® 1.13 dpbEdit.pas
unit dpbEdit;

{ dpb = Delphi Programming Bible }

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls,
  { IME °ü·Ã ·çƾ }
  Imm;

type
  TdpbImeInputMode = ( dimHangul, dimEnglish );
{ À̺¥Æ® Çڵ鷯°¡ »ç¿ëÇÒ ¸Þ¼Òµå Çü }
  TdpbImeInputModeChange = procedure (Sender : TObject;
    ImeInputMode : TdpbImeInputMode) of object;

  TdpbEdit = class(TCustomEdit)
  private
    { Private declarations }
    FOnImeInputModeChange : TdpbImeInputModeChange;

    function GetImeInputMode: TdpbImeInputMode;
    procedure DoImeInputModeChange;
  protected
    { Protected declarations }
    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
  public
    { Public declarations }
  published
    { Published declarations }
    property OnImeInputModeChange : TdpbImeInputModeChange
      read FOnImeInputModeChange
      write FOnImeInputModeChange;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('DPB', [TdpbEdit]);
end;

function TdpbEdit.GetImeInputMode: TdpbImeInputMode;
var
  dwSentence : DWORD;
  dwConversion : DWORD;
  IMC : HIMC;  { IME ÇÚµé }
begin
  IMC := ImmGetContext(Handle);
  ImmGetConversionStatus(IMC, dwConversion, dwSentence);
  if (dwConversion and IME_CMODE_HANGUL) = IME_CMODE_HANGUL then
    Result := dimHangul
  else
    Result := dimEnglish;
  ImmReleaseContext(Handle, IMC);
end;

{ TdpbEdit }
procedure TdpbEdit.DoImeInputModeChange;
begin
  if Assigned(FOnImeInputModeChange) then
    FOnImeInputModeChange(Self, GetImeInputMode);
end;

procedure TdpbEdit.KeyDown(var Key: Word; Shift: TShiftState);
begin
  inherited KeyDown(Key, Shift);
  if Key = VK_HANGUL then DoImeInputModeChange;
end;

end.





ÀúÀ۱ǿ¡ ´ëÇÑ °øÁö
ÀÌ ¹®¼­¿¡ Æ÷ÇÔµÈ ¸ðµç ±Û°ú ¼Ò½º ÄÚµå´Â ÀÛÀÚÀÎ Àú ±è¼ºµ¿ÀÇ ÁöÀû Àç»êÀÌÁö¸¸ ¹«´ÜÀ¸·Î ¹èÆ÷Çϰųª Ã¥À̳ª °­ÀÇ ±³ÀçµîÀ» À§ÇÑ º¹Á¦ µî ÀúÀÛ±ÇÀ» ÀúÇØÇÏ´Â ÇàÀ§¸¦ Á¦¿ÜÇϰí´Â ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.
¶ÇÇÑ ÀÌ ÆäÀÌÁö¿¡ ´ëÇÑ ¸µÅ©´Â ÀÚÀ¯·Ó°Ô ÇÒ ¼ö ÀÖÀ¸³ª Àü¹®À» ÀüÁ¦ÇÏ´Â ÀÏÀº Çã¿ëÇÏÁö ¾Ê½À´Ï´Ù.