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


1.7. VCL(Visual Component Library)

¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ¿¡°Ô VCLÀº ¾îÇø®ÄÉÀ̼ÇÀ» °³¹ßÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Â ÄÞÆ÷³ÍÆ®µéÀÇ ¸ðÀ½À̶ó ÇÒ ¼ö ÀÖÁö¸¸ ÄÞÆ÷³ÍÆ® °³¹ßÀÚ¿¡°Ô VCLÀº »õ·Î¿î ÄÞÆ÷³ÍÆ®¸¦ ¸¸µé ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾öû³­ ¾çÀÇ ±â´ÉÀ» °¡Áö°í Àִ Ŭ·¡½º ¶óÀ̺귯¸®¶ó ÇÒ ¼ö ÀÖ´Ù. ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÑ´Ù´Â °ÍÀº ÀÌ °Å´ëÇÑ VCLÀÇ °èÃþ ±¸Á¶ ¼Ó¿¡ ÀÚ½ÅÀÌ ¸¸µç Ŭ·¡½º¸¦ ³¢¿ö ³Ö´Â ÀÛ¾÷À̶ó ÇÒ ¼ö ÀÖ°Ú´Ù. À̹ø Àý¿¡¼­´Â ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ ÁÖ·Î »ç¿ëµÇ°í ÀÚÁÖ ¸¸³ª´Â Ŭ·¡½ºµé¿¡ ´ëÇØ ¾Ë¾Æ º¸µµ·Ï ÇÏÀÚ.
1.7.1. VCLÀÇ °èÃþ ±¸Á¶
µ¨ÆÄÀÌÀÇ ¸ðµç ÄÞÆ÷³ÍÆ®´Â VCLÀ̶ó´Â °Å´ëÇÑ Å¬·¡½º °èÃþ ±¸Á¶ÀÇ ÀϺκÐÀÌ´Ù. ±×¸² 1-10Àº ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ ÀÚÁÖ »ç¿ëÇϴ Ŭ·¡½ºµéÀ» ±âÁØÀ¸·Î VCLÀÇ °èÃþµµ¸¦ °£´ÜÇÏ°Ô Ç¥ÇöÇÑ °ÍÀÌ´Ù. Á¦ÀÏ À§¿¡´Â ¸ðµç Ŭ·¡½ºµéÀÇ ÃÖ»óÀ§ ºÎ¸ð Ŭ·¡½ºÀÎ TObject°¡ ÀÖ°í TObjectÀÇ ÀÚ¼ÕÀ¸·Î °´Ã¼¸¦ ½ºÆ®¸²(¸Þ¸ð¸® ½ºÆ®¸², ÆÄÀÏ ½ºÆ®¸² µî)¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» °¡Áø TPersistent Ŭ·¡½º°¡ ÀÖ´Ù. µ¨ÆÄÀÌ´Â Æû ÆÄÀÏÀ» ½ºÆ®¸²À» ÀÌ¿ëÇØ¼­ ±¸ÇöÇϹǷΠ¸ðµç ÄÞÆ÷³ÍÆ®µéÀÇ ºÎ¸ð Ŭ·¡½ºÀÎ TComponent´Â TPersistent Ŭ·¡½º¿¡¼­ »ó¼Ó ¹Þ¾Ò´Ù.

±×¸² 1-10 VCLÀÇ °èÃþ ±¸Á¶


TComponent¸¦ ½ÃÀÛÀ¸·Î ¿ì¸®°¡ ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÒ ¶§ ºÎ¸ð Ŭ·¡½º·Î ¼±ÅÃÇÒ ¼ö Àִ Ŭ·¡½ºµéÀÌ ³ªÅ¸³­´Ù. TComponent´Â TTimer, TTableó·³ ½Ã°¢ÀûÀÎ ±â´ÉÀÌ ÇÊ¿ä¾ø´Â ÄÞÆ÷³ÍÆ®ÀÇ ºÎ¸ð Ŭ·¡½º·Î »ç¿ëÇÏ¸ç ´Ù¸¥ ÄÞÆ÷³ÍÆ®¸¦ ¼ÒÀ¯ÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. TControl ÄÞÆ÷³ÍÆ®´Â ½Ã°¢ÀûÀÎ ÄÞÆ÷³ÍÆ®¸¦ ¸¸µé ¶§ »ç¿ëÇϴµ¥ ±×¸²À» º¸¸é ¾Ë°ÚÁö¸¸ ½Ã°¢ÀûÀÎ ÄÞÆ÷³ÍÆ®´Â µÎ °¡Áö Ŭ·¡½º·Î ³ª´©¾î Áø´Ù. TGraphicControl°ú TWinControl·Î¼­ µÑÀÇ Å« Â÷ÀÌÁ¡Àº TWinControlÀº À©µµ ÇÚµéÀ» °¡Áö±â ¶§¹®¿¡ À©µµ ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áú ¼ö ÀÖ°í TGraphicControlÀº ±×·¸Áö ¾Ê´Ù´Â °ÍÀÌ´Ù. ³ª¾Æ°¡¼­ À©µµ ÇÚµéÀ» °¡Áö´Â ÄÞÆ÷³ÍÆ®´Â µÎ °¡Áö ¹üÁÖ·Î ³ª´­ ¼ö Àִµ¥ Çϳª´Â ¿¡µðÆ®, üũ ¹öư, ¶óµð¿À ¹öư, ±×·ì ¹Ú½ºµî°ú °°ÀÌ °øÅë À©µµ ÄÜÆ®·ÑÀ» ¼­ºê Ŭ·¡½ÌÇÏ´Â ÄÞÆ÷³ÍÆ®µé·Î¼­ TWinControl¿¡¼­ Á÷Á¢ »ó¼Ó ¹Þ¾Æ¼­ ¸¸µé¾îÁø ÄÞÆ÷³ÍÆ®µéÀÌ°í ³ª¸ÓÁö´Â TCustomControl·Î¼­ TWinControl·ÎºÎÅÍ ÆÄ»ýµÇ±â ¶§¹®¿¡ À©µµ ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áú ¼ö ÀÖÀ¸¸ç ÀÚüÀûÀ¸·Î À©µµ ¸ð¾çÀ» ±×¸± ¼ö ÀÖµµ·Ï Canvas °´Ã¼¿Í Paint ¸Þ¼Òµå¸¦ Ãß°¡·Î °¡Áö°í ÀÖ´Â ÄÞÆ÷³ÍÆ®ÀÌ´Ù.
±× ¹Û¿¡ ÄÞÆ÷³ÍÆ® °³¹ßÀڵ鿡°Ô À¯¿ëÇÑ TStringList³ª TList, TRegistry, TCollection µîÀÇ Áö¿ø Ŭ·¡½ºµéÀÌ ¸¹ÀÌ ÀÖ´Ù.
1.7.2. TComponent
TComponent Ŭ·¡½º´Â Æû µðÀÚÀ̳ʰ¡ ÄÞÆ÷³ÍÆ®¸¦ °ü¸®ÇÒ ¶§ ÇÊ¿äÇÑ ÇÁ·ÎÆÛƼ¿Í ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. ¿©·¯°¡Áö ÇÁ·ÎÆÛƼ Áß¿¡¼­ ÄÞÆ÷³ÍÆ®ÀÇ ÇöÀç »óŸ¦ ³ªÅ¸³»´Â ÁýÇÕÇü ÇÁ·ÎÆÛƼÀÎ ComponentState°¡ ¾ÆÁÖ À¯¿ëÇѵ¥ ComponentState ÇÁ·ÎÆÛƼ¿¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â °ªµéÀº ¾Æ·¡ Ç¥¿Í °°´Ù.

Ç¥ 1-7 ComponentState Ç÷¡±×
°ªÀǹÌ
csAncestorÄÞÆ÷³ÍÆ®°¡ Á¶»ó ÆûÀ¸·ÎºÎÅÍ »ó¼Ó(Àü·¡)µÇ¾úÀ½À» ³ªÅ¸³»¸ç csDesiging Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÀ» ¶§¸¸ ¼³Á¤µÈ´Ù.
csDesigningÆû µðÀÚÀ̳ʰ¡ ÄÞÆ÷³ÍÆ®¸¦ Á¶ÀÛÇϰí ÀÖÀ½À» ³ªÅ¸³½´Ù.
csDestroyingÄÞÆ÷³ÍÆ®°¡ ÆÄ±«µÇ°í ÀÖÀ½À» ³ªÅ¸³½´Ù.
csFixupsÄÞÆ÷³ÍÆ®°¡ ¾ÆÁ÷ ·Îµå µÇÁö ¾ÊÀº Æû¿¡ ÀÖ´Â ÄÞÆ÷³ÍÆ®¿Í ¿¬°áµÇ¾î ÀÖÀ½À» ³ªÅ¸³½´Ù. ¿¬°áµÈ ÄÞÆ÷³ÍÆ®°¡ ¸ðµÎ ·ÎµåµÉ ¶§ ÇØÁ¦ µÈ´Ù.
csFreeNotificationÀÚ½ÅÀÌ ¼Ò¸êµÉ ¶§ ¾ÆÁ÷ ¼Ò¸êµÇÁö ¾ÊÀº ´Ù¸¥ Æû¿¡ ÀÚ½ÅÀÌ ¼Ò¸êµÊÀ» Åëº¸ÇØ ÁØ´Ù.
csInlineÄÞÆ÷³ÍÆ®°¡ ¼³°è ½Ã¿¡ º¯°æµÉ ¼ö ÀÖ´Â ÃÖ»óÀ§ ÄÞÆ÷³ÍÆ®ÀÌ¸ç Æû¿¡ »ðÀ﵃ ¼ö ÀÖÀ½À» ³ªÅ¸³½´Ù. ÀÌ Ç÷¡±×´Â Àаí ÀúÀåÇÒ ¶§ Áßø ÇÁ·¹ÀÓÀÓÀ» Áö½ÃÇϱâ À§ÇØ »ç¿ëÇÑ´Ù.
csLoadingFiler °´Ã¼°¡ ÄÞÆ÷³ÍÆ®¸¦ ÀÐ¾î µéÀ̰í ÀÖÀ½À» ³ªÅ¸³½´Ù. ÀÌ Ç÷¡±×´Â ÄÞÆ÷³ÍÆ®°¡ »ý¼ºµÉ ¶§ ¼³Á¤µÇ°í ÄÞÆ÷³ÍÆ®°¡ ¼ÒÀ¯Çϰí ÀÖ´Â ÀÚ½Ä ÄÞÆ÷³ÍÆ®µéÀÌ ¸ðµÎ ·Îµå µÉ ¶§±îÁö ÇØÁ¦ µÇÁö ¾Ê´Â´Ù.
csReadingÄÞÆ÷³ÍÆ® ÇÁ·ÎÆÛƼ °ªÀ» ½ºÆ®¸²À¸·ÎºÎÅÍ Àаí ÀÖÀ½À» ³ªÅ¸³½´Ù. csReadingÀÌ ¼³Á¤ µÇ¾î ÀÖÀ» ¶§´Â csLoading Ç÷¡±×µµ Ç×»ó ¼³Á¤µÇ¾î ÀÖ´Ù.
csUpdating»ó¼ÓµÈ ÄÞÆ÷³ÍÆ®°¡ Á¶»ó Æû¿¡¼­ ¹ß»ýÇÑ º¯È­¸¦ °»½ÅÇϰí ÀÖÀ½À» ³ªÅ¸³½´Ù. csAncestor Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÀ» ¶§¸¸ ¼³Á¤µÈ´Ù.
csWritingÄÞÆ÷³ÍÆ®°¡ ÇÁ·ÎÆÛƼ °ªÀ» ½ºÆ®¸²¿¡ ±â·ÏÇϰí ÀÖÀ½À» ³ªÅ¸³½´Ù.


ÄÞÆ÷³ÍÆ®´Â ComponentState ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ ¾î¶² ÀÛ¾÷À» ÇØ¾ß ÇÒ Áö ¸»¾Æ¾ß ÇÒÁö¸¦ °áÁ¤ÇÒ ¼ö Àִµ¥ ¾Æ·¡ ¿¹Á¦ ÄÚµåó·³ ¼³°è ½Ã¿¡´Â µ¿ÀÛÇÏÁö ¾Ê°í ½ÇÇà ½Ã¿¡¸¸ ¾î¶² ÀÛ¾÷À» ¼öÇàÇϵµ·Ï ÇÒ ¶§ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ ¿¹Á¦´Â extctrls.pas¿¡ Á¤ÀǵǾî ÀÖ´Â TImage ÄÞÆ÷³ÍÆ®ÀÇ Paint ÇÁ·Î½ÃÀúÀε¥ ¼³°è ½Ã¿¡¸¸ ÄÞÆ÷³ÍÆ®ÀÇ ¿Ü°û¿¡ Á¡¼±À» ±×·ÁÁÖµµ·Ï Çϱâ À§ÇØ ComponentState ÇÁ·ÎÆÛƼÀÇ csDesigning Ç÷¡±×¸¦ »ç¿ëÇϰí ÀÖ´Ù.

procedure TImage.Paint;
var
  Save: Boolean;
begin
{ ¼³°è ½Ã¿¡¸¸ ÄÞÆ÷³ÍÆ®ÀÇ ¿Ü°û¿¡ Á¡¼±À» ±×·ÁÁØ´Ù. }
  if csDesigning in ComponentState then
    with inherited Canvas do
    begin
      Pen.Style := psDash;
      Brush.Style := bsClear;
      Rectangle(0, 0, Width, Height);
    end;
  Save := FDrawing;
  FDrawing := True;
  try
    with inherited Canvas do
      StretchDraw(DestRect, Picture.Graphic);
  finally
    FDrawing := Save;
  end;
end;


µ¨ÆÄÀÌ 2.0ºÎÅÍ Æû »ó¼Ó ±â´ÉÀ» Áö¿øÇϸ鼭 ComponentStyle À̶ó´Â ÁýÇÕÇü ÇÁ·ÎÆÛƼ°¡ »ý°å´Âµ¥ ÀÌ ÇÁ·ÎÆÛƼ´Â ÆûÀÌ »ó¼ÓµÉ ¶§ ÄÞÆ÷³ÍÆ®°¡ ¾î¶»°Ô µ¿ÀÛÇØ¾ß ÇÒÁö¸¦ °áÁ¤ÇÑ´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â Ç÷¡±×´Â csInheritable°ú csCheckPropAvailÀÌ ÀÖ´Ù. ¸ðµç ÄÞÆ÷³ÍÆ®´Â »ý¼ºÀÚ¿¡¼­ ComponentStyle ÇÁ·ÎÆÛƼ¿¡ csInheritable Ç÷¡±×°¡ ¼³Á¤µÇ¸ç ±âº»ÀûÀ¸·Î Æû »ó¼ÓÀ» Áö¿øÇÑ´Ù. ComponentStyle ÇÁ·ÎÆÛƼ¿¡ csInheritable Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é ÀÌ ÄÞÆ÷³ÍÆ®¸¦ Æ÷ÇÔÇϰí ÀÖ´Â ÆûÀº »ó¼ÓµÉ ¼ö ¾ø´Ù. csCheckPropAvail Ç÷¡±×´Â COM(Component Object Model) ÄÜÆ®·Ñ¿¡¼­ »ç¿ëµÇ´Âµ¥ ÄÞÆ÷³ÍÆ®°¡ ÇÁ·ÎÆÛƼ¸¦ ÀÐÀ» ¼ö Àִ°¡¸¦ °Ë»çÇØ¾ß ÇÒÁö¸¦ ³ªÅ¸³½´Ù. ¿ÀºêÁ§Æ® ÀνºÆåÅÍ´Â Á÷Á¢ COM ÄÜÆ®·ÑÀÇ ÇÁ·ÎÆÛƼ °ªÀ» ÀÐÀ» ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ COM ÄÜÆ®·ÑÀº ¸ðµÎ ÀÌ Ç÷¡±×¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. ÇÏÁö¸¸ ´ëºÎºÐÀÇ °æ¿ì COM ÄÜÆ®·ÑÀ» ÀÓÆ÷Æ®ÇÒ ¶§ ºÎ¸ð Ŭ·¡½º·Î »ç¿ëÇÏ´Â TOLEControl Ŭ·¡½º¿¡¼­ ÀÌ Ç÷¡±×¸¦ ÀÚµ¿À¸·Î ¼³Á¤ÇØÁÖ´Ï±î ½Å°æ ¾²Áö ¾Ê¾Æµµ µÈ´Ù.
TComponent´Â ´Ù¸¥ ÄÞÆ÷³ÍÆ®¸¦ ¼ÒÀ¯ÇÒ ¼ö ÀÖÀ¸¸ç ´Ù¸¥ ÄÞÆ÷³ÍÆ®¿¡ ¼ÒÀ¯ µÉ ¼ö ÀÖ´Ù. TComponent´Â Owner ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ¼­ ÀÚ½ÅÀ» ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®°¡ ¹«¾ùÀÎÁö ¾Ë ¼ö ÀÖÀ¸¸ç Components ÇÁ·ÎÆÛƼ¸¦ ÅëÇØ¼­ ÀÚ½ÅÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®ÀÇ ¸®½ºÆ®¸¦ ¾Ë ¼ö ÀÖ´Ù. TComponentÀÇ »ý¼ºÀÚ´Â »õ·Î »ý¼ºµÇ´Â ÄÞÆ÷³ÍÆ®ÀÇ ¼ÒÀ¯ÁÖ¸¦ ÀÎÀÚ·Î ¹Þ°Ô µÇ¾î À־ ¼ÒÀ¯ÁÖ°¡ nilÀÌ ¾Æ´Ñ °æ¿ì¿¡ ¼ÒÀ¯ÁÖÀÇ Components ÇÁ·ÎÆÛƼ¿¡ ÀÚ½ÅÀ» Ãß°¡ÇÑ´Ù. ÄÞÆ÷³ÍÆ® ¸®½ºÆ®¸¦ ÀÌ¿ëÇØ¼­ TComponent´Â ÀÚ½ÅÀÌ ¼Ò¸êµÉ ¶§ ÀÚµ¿À¸·Î ÀÚ½ÅÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®µéÀ» ¼Ò¸êÇϵµ·Ï µÇ¾î ÀÖ´Ù. ¿¹¸¦ µé¾î¼­ Æû Ŭ·¡½ºÀÎ TFormÀº TComponentÀÇ ÀÚ¼Õ Å¬·¡½ºÀ̱⠶§¹®¿¡ ÆûÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ¸ðµç ÄÞÆ÷³ÍÆ® µéÀº ÆûÀÌ ¼Ò¸êµÉ ¶§ ÀÚµ¿À¸·Î ¼Ò¸êµÈ´Ù. µû¶ó¼­ ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ°¡ µ¿ÀûÀ¸·Î »ý¼ºÇÑ ÄÞÆ÷³ÍÆ®µµ ÀÏÀÏÀÌ ÇØÁ¦ÇØ ÁÖÁö ¾Ê¾Æµµ »ý¼ºÇÒ ¶§ ¼ÒÀ¯ÁÖ¸¸ Á¤»óÀûÀ¸·Î ÀÔ·ÂÇØ ÁÖ¾ú´Ù¸é ÀÚµ¿À¸·Î ¼Ò¸êµÈ´Ù. ComponentCount ÇÁ·ÎÆÛƼ´Â ÇÁ·ÎÆÛƼ À̸§¿¡¼­µµ ¾Ë ¼ö ÀÖ°ÚÁö¸¸ ÀÚ½ÅÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®ÀÇ °³¼ö¸¦ ³ªÅ¸³½´Ù. ±×¸®°í FindComponent ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½ÅÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ® Áß¿¡¼­ ƯÁ¤ À̸§À» °¡Áö´Â ÄÞÆ÷³ÍÆ®¸¦ ãÀ» ¼ö ÀÖ´Ù. ¾Æ·¡ ¿¹Á¦´Â Components ÇÁ·ÎÆÛƼ¸¦ ÀÌ¿ëÇØ¼­ ÆûÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ® Áß TButton ÄÞÆ÷³ÍÆ®ÀÎ °Í¸¸ ÃßÃâÇÏ´Â ¿¹ÀÌ´Ù.

procedure TForm1.FindButton(var ButtonList: TStrings);
var
  nIndex : Integer;
begin
  for nIndex := 0 to Pred(ComponentCount) do
  begin
    if Components[nIndex] is TButton then
    begin
      ButtonList.Add(Components[nIndex].Name);
    end;
  end;
end;


TComponent Ŭ·¡½º°¡ °¡Áö°í ÀÖ´Â ¸Þ¼Òµå Áß¿¡ Notification À̶ó´Â ¸Þ¼Òµå°¡ ÀÖ´Ù. ÄÞÆ÷³ÍÆ®ÀÇ Components ÇÁ·ÎÆÛƼ¿¡ »õ ÄÞÆ÷³ÍÆ®°¡ Ãß°¡µÇ¸é ÄÞÆ÷³ÍÆ®´Â ±âÁ¸¿¡ ¼ÒÀ¯Çϰí ÀÖ´ø °¢ ÄÞÆ÷³ÍÆ®µéÀÇ Notification ¸Þ¼Òµå¸¦ È£ÃâÇØ¼­ »õ·Î¿î ÄÞÆ÷³ÍÆ®°¡ Ãß°¡µÇ¾úÀ½À» ¾Ë·Á ÁØ´Ù. ¸¶Âù°¡Áö·Î ÄÞÆ÷³ÍÆ® ¸®½ºÆ®¿¡¼­ ÄÞÆ÷³ÍÆ®°¡ »èÁ¦µÇ¸é ´Ù¸¥ ÄÞÆ÷³ÍÆ®¿¡°Ô »èÁ¦µÇ¾úÀ½À» ¾Ë·Á ÁØ´Ù. ¿¹¸¦ µé¾î ¼³¸íÇÏÀÚ¸é ÆûÀ» ¼³°èÇÒ ¶§ Æû¿¡ »õ·Î¿î ÄÞÆ÷³ÍÆ®¸¦ ÆÈ·¹Æ®·ÎºÎÅÍ ²ø¾î´Ù ³õÀ¸¸é ÆûÀÇ ÄÞÆ÷³ÍÆ® ¸®½ºÆ®¿¡´Â ±× ÄÞÆ÷³ÍÆ®°¡ Ãß°¡ µÇ¸ç ÆûÀº ±âÁ¸¿¡ ¼ÒÀ¯Çϰí ÀÖ´ø ´Ù¸¥ ÄÞÆ÷³ÍÆ®¿¡°Ô Notification ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¼­ »õ ÄÞÆ÷³ÍÆ®°¡ Ãß°¡ µÇ¾úÀ½À» ¾Ë·ÁÁØ´Ù. ÀÌ °³³äÀº ½ÇÇà ½Ã¿¡´Â ¹°·ÐÀÌ°í ¼³°è ½Ã¿¡ ¾ÆÁÖ Áß¿äÇѵ¥ ¾Æ·¡¿Í °°Àº »óȲÀ» »ý°¢ÇØ º¸¸é ½±°Ô ÀÌÇØÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
»õ ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µé°í Æû¿¡ TLabel ÄÞÆ÷³ÍÆ®¿Í TEdit ÄÞÆ÷³ÍÆ®¸¦ Çϳª¾¿ ¿Ã·Á ³õÀÚ. ±×¸®°í ¾Æ·¡ ±×¸²Ã³·³ TLabel ÄÞÆ÷³ÍÆ®ÀÇ FocusControl ÇÁ·ÎÆÛƼ¸¦ TEdit ÄÞÆ÷³ÍÆ®·Î ¼³Á¤ÇÏÀÚ. ¾îÇø®ÄÉÀÌ¼Ç »ç¿ëÀÚ°¡ Űº¸µå¸¦ ÀÌ¿ëÇØ¼­ TLabel ÄÞÆ÷³ÍÆ®ÀÇ ´ÜÃà۸¦ ´©¸£¸é TLabel ÄÞÆ÷³ÍÆ®´Â ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áú ¼ö ¾ø±â ¶§¹®¿¡ Àڱ⿡°Ô ¿À´Â ÀÔ·Â Æ÷Ä¿½º¸¦ FocusControl¿¡ ¼³Á¤µÈ ÄÞÆ÷³ÍÆ®·Î ³Ñ°ÜÁÖµµ·Ï µÇ¾î ÀÖ´Ù. ±×·±µ¥ ¾Æ·¡ »óȲ¿¡¼­ TEdit ÄÞÆ÷³ÍÆ®¸¦ »èÁ¦ÇÏ°í ½ÇÇàÇÏ¸é ¾î¶»°Ô µÉ±î? ¸¸¾à¿¡ Notification ¸Þ¼Òµå°¡ ¾ø´Ù¸é TLabel ÄÞÆ÷³ÍÆ®´Â TEdit ÄÞÆ÷³ÍÆ®°¡ »èÁ¦µÇ¾ú´Ù´Â »ç½ÇÀ» ¾Ë ¼ö ¾ø°Ô µÇ°í °á±¹ FocusControl ÇÁ·ÎÆÛƼ´Â Á¸ÀçÇÏÁö ¾Ê´Â ÄÞÆ÷³ÍÆ®¿¡ ´ëÇÑ ·¹ÆÛ·±½º¸¦ °¡Áö°í ÀÖ°Ô µÈ´Ù. ÀÌ »óÅ¿¡¼­ »ç¿ëÀÚ°¡ ´ÜÃà۸¦ ´©¸£¸é Access Violation ¿¡·¯°¡ ³ª°Ô µÉ °ÍÀÌ´Ù. Notification ¸Þ¼Òµå´Â ÀÌ·± »óȲ¿¡¼­ ¾ÆÁÖ À¯¿ëÇÏ´Ù. ¾Æ·¡ ÄÚµå´Â TLabel ÄÞÆ÷³ÍÆ®ÀÇ ºÎ¸ð Ŭ·¡½ºÀÎ TCustomLabelÀÇ Notification ¸Þ¼ÒµåÀε¥ ¾î¶² ÄÞÆ÷³ÍÆ®°¡ »èÁ¦µÉ ¶§ »èÁ¦µÇ´Â ÄÞÆ÷³ÍÆ®°¡ ÀÚ½ÅÀÌ FocusControl ÇÁ·ÎÆÛƼ·Î ÂüÁ¶Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®À̸é FFocusControlÀ» nil °ªÀ¸·Î ¼³Á¤Çϵµ·Ï Çϰí ÀÖ´Ù. µ¶ÀÚ°¡ »õ·Î °³¹ßÇÏ´Â ÄÞÆ÷³ÍÆ®°¡ ´Ù¸¥ ÄÞÆ÷³ÍÆ®¸¦ ÂüÁ¶ÇÑ´Ù¸é ¹Ýµå½Ã Notification ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ÀûÀýÇÑ Á¶Ä¡¸¦ ÃëÇØÁÖ¾î¾ß ÇÔÀ» ¸í½ÉÇØ¾ß ÇÑ´Ù.

 
±×¸² 1-11 Notification ¿¹Á¦




procedure TCustomLabel.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited Notification(AComponent, Operation);
  if (Operation = opRemove) and (AComponent = FFocusControl) then
    FFocusControl := nil;
end;


±×·±µ¥ À§¿Í °°Àº »óȲÀÌ ÇϳªÀÇ Æû ³»¿¡¼­¸¸ ÀÌ·ç¾î Áø´Ù¸é ¾Æ¹« ¹®Á¦°¡ ¾ø´Ù. ÇÏÁö¸¸ ´Ù¸¥ Æû¿¡ ÀÖ´Â ÄÞÆ÷³ÍÆ®¸¦ ÂüÁ¶Çϵµ·Ï ¼³Á¤Çß´Ù¸é ¾î¶»°Ô µÉ±î? ¾ÈŸ±õ°Ôµµ Notification ¸Þ¼Òµå´Â ÀÚ½ÅÀÌ ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®¿¡ ´ëÇØ¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ TComponent´Â FFreeNotifies ¶ó´Â ¸®½ºÆ®¸¦ º°µµ·Î °ü¸®Çϴµ¥ ÀÚ½ÅÀÌ ¼Ò¸êµÉ ¶§ FFreeNotifies ¸®½ºÆ®¿¡ ÀÖ´Â ¸ðµç ÄÞÆ÷³ÍÆ®ÀÇ Notification ¸Þ¼Òµå¸¦ È£ÃâÇϵµ·Ï µÇ¾î ÀÖ´Ù. ±×·¸´Ù¸é FFreeNotifies ¸®½ºÆ®´Â ¾î¶»°Ô °ü¸®µÉ±î? TComponent´Â FreeNotification À̶ó´Â ¸Þ¼Òµå¸¦ Á¦°øÇϴµ¥ ¾Æ·¡ ¿¹Á¦¸¦ º¸¸é ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù.

procedure TCustomLabel.SetFocusControl(Value: TWinControl);
begin
  FFocusControl := Value;
  if Value <> nil then Value.FreeNotification(Self);
end;


Áï ÄÞÆ÷³ÍÆ®°¡ ´Ù¸¥ ÄÞÆ÷³ÍÆ®¸¦ ÂüÁ¶Çϵµ·Ï ¼³Á¤µÉ ¶§ ÂüÁ¶µÇ´Â ÄÞÆ÷³ÍÆ®ÀÇ FreeNotification ¸Þ¼Òµå¿¡ ÀÎÀÚ¸¦ Self·Î È£ÃâÇØ¼­ ÀÚ½ÅÀ» FFreeNotifies ¸®½ºÆ®¿¡ Ãß°¡Çϵµ·Ï ¿äûÇÑ´Ù. ÀÌ·¸°Ô µÇ¸é ÂüÁ¶µÇ´Â ÄÞÆ÷³ÍÆ®´Â ÀÚ½ÅÀÌ ¼Ò¸êµÉ ¶§ FFreeNotifies ¸®½ºÆ®¸¦ ÅëÇØ¼­ ÀÚ½ÅÀ» ÂüÁ¶Çϰí ÀÖ´Â ¸ðµç ÄÞÆ÷³ÍÆ®µé¿¡°Ô ÀÚ½ÅÀÌ ¼Ò¸êµÇ°í ÀÖÀ½À» ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù.
´ÙÀ½À¸·Î ÄÞÆ÷³ÍÆ® °³¹ßÀÚ¿¡°Ô À¯¿ëÇÑ ¸Þ¼Òµå°¡ Loaded¶ó´Â ¸Þ¼ÒµåÀε¥ ÀÌ ¸Þ¼Òµå´Â ÄÞÆ÷³ÍÆ®°¡ »ý¼ºµÇ°í ÀÚ½ÅÀÇ ÇÁ·ÎÆÛƼ¸¦ Æû ÆÄÀÏ¿¡¼­ ÀÐ¾î µéÀÎ Á÷ÈÄ¿¡ È£ÃâµÈ´Ù. Loaded ´Â °¡»ó ¸Þ¼ÒµåÀ̱⠶§¹®¿¡ ÇÁ·ÎÆÛƼ°¡ ÀÐÇôÁø ÈÄ¿¡ ¾î¶² ÀÛ¾÷À» ÇÏ°í ½ÍÀ¸¸é Loaded ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ÇÏ°í ½ÍÀº ÀÛ¾÷À» Ãß°¡ÇØÁÖ¸é µÈ´Ù. Loaded ¸Þ¼Òµå´Â ÄÞÆ÷³ÍÆ®°¡ È­¸é¿¡ º¸¿©Áö±â Àü¿¡ È£ÃâµÈ´Ù.
1.7.3. TControl
TControl Ŭ·¡½º¸¦ Á÷Á¢ ºÎ¸ð Ŭ·¡½º·Î »ç¿ëÇÒ ÀÏÀº ¾øÁö¸¸ ¸ðµç ºñÁÖ¾ó ÄÞÆ÷³ÍÆ®ÀÇ ºÎ¸ð Ŭ·¡½º·Î¼­ TControl Ŭ·¡½º´Â Áß¿äÇÑ ÇÁ·ÎÆÛƼ¸¦ °¡Áö°í ÀÖ´Ù.
TControl Ŭ·¡½º´Â Parent ¶ó´Â ÇÁ·ÎÆÛƼ¸¦ °¡Áö°í ÀÖ´Ù. Owner ÇÁ·ÎÆÛƼ¿Í Á¾Á¾ È¥µ·À» ÇÏ´Â °æ¿ì°¡ Àִµ¥ Owner¿Í ´Þ¸® ÄÞÆ÷³ÍÆ®ÀÇ Parent´Â ¹Ýµå½Ã À©µµ ÇÚµéÀ» °¡Áö°í ÀÖ¾î¾ß ÇÑ´Ù. Owner ´Â ¼ÒÀ¯ÀÇ °³³äÀÌÁö¸¸ Parent´Â Æ÷ÇÔÀÇ °³³äÀÌ´Ù. µû¶ó¼­ À©µµ ÇÚµéÀ» °¡Áö´Â ÄÞÆ÷³ÍÆ®¸¸ÀÌ Parent °¡ µÉ ¼ö Àֱ⠶§¹®¿¡ TWinControlÀ̳ª ±× ÀÚ¼Õ Å¬·¡½º¸¸ÀÌ Parent ÇÁ·ÎÆÛƼ·Î ¼³Á¤µÉ ¼ö ÀÖ´Ù.
´ÙÀ½À¸·Î TControlÀº ControlStyleÀ̶ó´Â ÁýÇÕÇü ÇÁ·ÎÆÛƼ¸¦ °¡Áö´Âµ¥ ÁÖ·Î ÄÞÆ÷³ÍÆ®ÀÇ »ý¼ºÀÚ¿¡¼­ ¼³Á¤µÈ´Ù. ¾Æ·¡ Ç¥´Â ControlStyle ÇÁ·ÎÆÛƼ¿¡ ¼³Á¤µÉ ¼ö ÀÖ´Â °ªµéÀ» ³ªÅ¸³½´Ù.

Ç¥ 1-8 ControlStyle Ç÷¡±×
Ç÷¡±×ÀǹÌ
csAcceptControlsÀ©µµ ÇÚµéÀ» °¡Áö´Â ÄÞÆ÷³ÍÆ®¿¡¸¸ À¯È¿ÇÑ Ç÷¡±×·Î¼­ ¼³°è ½Ã¿¡ ´Ù¸¥ ÄÞÆ÷³ÍÆ®ÀÇ Parent ÄÜÆ®·ÑÀÌ µÉ ¼ö ÀÖÀ½À» ³ªÅ¸³½´Ù.
csCaptureMouse¸¶¿ì½º À̺¥Æ®¸¦ ĸÃÄÇÑ´Ù. ÄÜÆ®·Ñ ¿µ¿ª ¾È¿¡¼­ ¸¶¿ì½º ¹öưÀ» ´©¸£°í ÄÜÆ®·Ñ ¿µ¿ª ¹Û¿¡¼­ ¶¼µµ MouseUp À̺¥Æ®¸¦ ¹ÞÀ» ¼ö ÀÖµµ·Ï ÇØ ÁØ´Ù.
csDesignInteractive¼³°è ½Ã¿¡ ÄÜÆ®·ÑÀ» Á¶ÀÛÇϱâ À§Çؼ­ ¿À¸¥ÂÊ ¸¶¿ì½º ¹öưÀÌ ´­·ÁÁö¸é ÀÌ ¸Þ½ÃÁö¸¦ ¿ÞÂÊ ¹öưÀÌ ´­·ÁÁø °ÍÀ¸·Î º¯È¯ÇØ ÁØ´Ù.
csClickEventsŬ¸¯ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù.
csFramedÄÜÆ®·Ñ ÇÁ·¹ÀÓÀÌ 3D È¿°ú¸¦ °¡Áú ¼ö ÀÖ´Ù. Ctl3D ÇÁ·ÎÆÛƼ°¡ µ¿ÀÛÇϱâ À§ÇØ ÇÊ¿äÇÏ´Ù.
csSetCaption»ç¿ëÀÚ°¡ Caption ÇÁ·ÎÆÛƼ¸¦ º°µµ·Î ¼³Á¤ÇÏÁö ¾Ê¾ÒÀ¸¸é Caption ÇÁ·ÎÆÛƼ¸¦ Name ÇÁ·ÎÆÛƼ¿Í °°°Ô ¸¸µç´Ù.
csOpaqueÀÚ½ÅÀÇ Å¬¶óÀÌ¾ðÆ® ¿µ¿ªÀ» ¸ðµÎ ±×¸°´Ù. ÀÌ Ç÷¡±×°¡ ¾øÀ¸¸é ÀÚ½Ä ÄÞÆ÷³ÍÆ®¿¡ ÀÇÇØ °¡·ÁÁö´Â Ŭ¶óÀÌ¾ðÆ® ¿µ¿ªÀº ±×¸®Áö ¾Ê´Â´Ù.
csDoubleClicksÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é ´õºí Ŭ¸¯ ¸Þ½ÃÁö¸¦ ¹ÞÀ» ¼ö ÀÖ´Ù. ¾Æ´Ï¸é Ŭ¸¯ ¸Þ½ÃÁö·Î º¯È¯ÇÑ´Ù.
csFixedWidthÄÜÆ®·ÑÀÇ ÆøÀÌ ½ºÄÉÀÏÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù.
csFixedHeightÄÜÆ®·ÑÀÇ ³ôÀ̰¡ ½ºÄÉÀÏÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù.
csNoDesignVisible¼³°è ½Ã¿¡ º¸ÀÌÁö ¾Ê°Ô ÇÑ´Ù.
csReplicatablePaintTo ¸Þ¼Òµå¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½ÅÀÇ À̹ÌÁö¸¦ ´Ù¸¥ Canvas¿¡ º¹»çµÉ ¼ö ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. ½±°Ô TDBCtrlGrid¿¡¼­ º¹Á¦µÉ ¼ö ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù°í º¸¸é µÈ´Ù.
csNoStdEvents¸¶¿ì½º³ª Űº¸µåµîÀÇ Ç¥ÁØ À̺¥Æ®¸¦ ¹«½ÃÇÑ´Ù.
csDisplayDragImage¸¶¿ì½º·Î ÀÚ½ÅÀÌ µå·¡±×µÉ ¶§ À̹ÌÁö ¸®½ºÆ®¿¡¼­ À̹ÌÁö¸¦ °¡Á®¿Í ³ªÅ¸³¾ Áö¸¦ ¼³Á¤ÇÑ´Ù.
csActionClient¾×¼Ç °´Ã¼¿¡ ¿¬°áµÉ ¼ö ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù. Action ÇÁ·ÎÆÛƼ°¡ ¼³Á¤µÇ¸é ÀÌ Ç÷¡±×µµ ¼³Á¤µÇ°í Action ÇÁ·ÎÆÛƼ°¡ ÇØÁ¦µÇ¸é ÀÌ Ç÷¡±×µµ ÇØÁ¦µÈ´Ù.
csMenuEvents½Ã½ºÅÛ ¸Þ´º¿¡ ¹ÝÀÀÇÑ´Ù.


TControl Ŭ·¡½º´Â ±âº»ÀûÀ¸·Î [csCaptureMouse,csClickEvents, csSetCaption, csDoubleClicks] °ªÀ¸·Î ControlStyle ÇÁ·ÎÆÛƼ¸¦ ÃʱâÈ­ÇÑ´Ù. ControlStyle ÇÁ·ÎÆÛƼ´Â ÄÜÆ®·ÑÀÇ ¼ºÁúÀ» ³ªÅ¸³»±â ¶§¹®¿¡ ÀνºÅϽº¸¶´Ù ´Ù¸£°Ô ¼³Á¤µÉ ¼ö ¾øÀ¸¸ç ½ÇÇà ½Ã¿¡ ´Ù¸¥ °ªÀ¸·Î ¹Ù²ð ¼ö ¾ø´Ù. ´ÙÀ½À¸·Î TControl Ŭ·¡½º´Â ½ÇÇà ½Ã¿¡ ÄÜÆ®·ÑÀÇ ÇöÀç »óŸ¦ ³ªÅ¸³»´Â ControlState¶ó´Â ÁýÇÕÇü ÇÁ·ÎÆÛƼ¸¦ Á¦°øÇϴµ¥ ¾Æ·¡ Ç¥´Â »ç¿ë °¡´ÉÇÑ »óŰªµéÀ» º¸¿©ÁØ´Ù.

Ç¥ 1-9 ControlState Ç÷¡±×
Ç÷¡±×ÀǹÌ
csLButtonDown¿ÞÂÊ ¸¶¿ì½º ¹öưÀÌ ´­¸° ä ¾ÆÁ÷ ¶¼Áö ¾Ê¾Ò´Ù.
csClickedcsLButtonDown°ú °°Áö¸¸ ControlStyle ÇÁ·ÎÆÛƼ¿¡ csClickEvents°¡ ¼³Á¤µÇ¾î ÀÖÀ» ¶§¸¸ ¼³Á¤µÇ¸ç ButtonDown ¸Þ½ÃÁö°¡ ClickÀ¸·Î ÇØ¼®µÇ¾úÀ½À» ³ªÅ¸³½´Ù.
csPalette½Ã½ºÅÛ ÆÈ·¹Æ®°¡ º¯°æµÇ¾úÁö¸¸ ÄÜÆ®·Ñ°ú ÀÚ½Ä ÄÜÆ®·ÑµéÀÌ ¾ÆÁ÷ ÀÚ½ÅÀÇ ÆÈ·¹Æ®¸¦ ¸®¾ó¶óÀÌÁîÇÏÁö ¾Ê¾ÒÀ½À» ³ªÅ¸³»´Ù.
csReadingState½ºÆ®¸²À¸·ÎºÎÅÍ ÀÚ½ÅÀÇ »óŸ¦ ÀоîµéÀ̰í ÀÖÀ½À» ³ªÅ¸³½´Ù.
csAlignmentNeededÀÚ½ÅÀÇ À§Ä¡¸¦ ÀçÁ¶Á¤ÇØ¾ß ÇÒ Çʿ䰡 ÀÖÀ½À» ³ªÅ¸³½´Ù.
csFocusingÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áöµµ·Ï ÇØ ÁÖ´Â ¸Þ½ÃÁö¸¦ ó¸®Çϰí ÀÖÀ½À» ³ªÅ¸³½´Ù.
csCreatingÀڽŰú ÀÚ½Ä ÄÜÆ®·ÑµéÀÌ »ý¼ºµÇ°í ÀÖÀ½À» ³ªÅ¸³»¸ç ¸ðµÎ »ý¼ºµÇ¸é ÇØÁ¦µÈ´Ù.
csPaintCopyÄÜÆ®·ÑÀÌ º¹Á¦µÇ°í ÀÖÀ½À» ³ªÅ¸³½´Ù. ControlStyle ÇÁ·ÎÆÛƼ¿¡ csReplicatable Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖ¾î¾ß¸¸ ÀÌ Ç÷¡±×µµ ¼³Á¤µÉ ¼ö ÀÖ´Ù.
csCustomPaint»ç¿ëÀÚ Paint ¸Þ½ÃÁö¸¦ ó¸®Çϰí ÀÖÀ½À» ³ªÅ¸³½´Ù.
csDestroyingHandleÀ©µµ ÇÚµéÀ» ÇØÁ¦Çϰí ÀÖÀ½À» ³ªÅ¸³½´Ù.
csDockingDocking µÇ°í ÀÖÀ½À» ³ªÅ¸³½´Ù.


1.7.4. TGraphicControl
TGraphicControlÀº ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áú Çʿ䰡 ¾ø°í ´Ù¸¥ ÄÜÆ®·ÑÀÇ ºÎ¸ð°¡ µÉ Çʿ䰡 ¾ø´Â ºñÁÖ¾ó ÄÜÆ®·ÑÀ» ¸¸µé ¶§ ºÎ¸ð Ŭ·¡½º·Î ¼±ÅÃÇϴ Ŭ·¡½ºÀÌ´Ù. TGraphicControlÀº »ç¿ëÀÚ¿ÍÀÇ »óÈ£ ÀÛ¿ëÀÌ ÇÊ¿äÄ¡ ¾ÊÀº ÄÜÆ®·ÑÀ» ¸¸µé ¶§ ¸¹ÀÌ »ç¿ëÇÑ´Ù. Windows 95³ª Windows 98¿¡¼­´Â ÀÌÀü ¹öÀüº¸´Ù »ç¿ëÇÒ ¼ö ÀÖ´Â ¸®¼Ò½ºÀÇ ¾çÀÌ ¸¹ÀÌ ´Ã±ä ÇßÁö¸¸ ¿©ÀüÈ÷ ÇѰ谡 ÀÖ´Ù. À©µµ Çڵ鵵 À©µµÀÇ ¸®¼Ò½ºÀ̱⠶§¹®¿¡ ºñÁÖ¾ó È¿°ú´Â °¡Áö¸é¼­µµ À©µµ ÇÚµéÀ» ¾Æ³¥ ¼ö ÀÖ´Â ¹æ¹ýÀ» TGraphicControlÀº Á¦°øÇØ ÁØ´Ù. ÇÏÁö¸¸ À©µµ ÇÚµéÀ» °¡Áú ¼ö ¾ø±â ¶§¹®¿¡ TGraphicControl°ú ÀÚ¼Õ Å¬·¡½ºµéÀº ÀÔ·Â Æ÷Ä¿½º¸¦ °¡ÁöÁö´Â ¸øÇÏÁö¸¸ ¸¶¿ì½º À̺¥Æ®´Â ¹ÞÀ» ¼ö ÀÖ´Ù. À̰ÍÀÌ °¡´ÉÇÑ ÀÌÀ¯´Â TGraphicControlÀÇ ºÎ¸ð À©µµ¿¡ ÀÖ´Ù. TGraphicControlÀÇ ºÎ¸ð À©µµ´Â ¹Ýµå½Ã TWinControlÀÇ ÀÚ¼Õ Å¬·¡½ºÀ̾î¾ß ÇÑ´Ù. (Æûµµ TWinControlÀÇ ÀÚ¼Õ Å¬·¡½ºÀÓÀ» »ý°¢ÇÏ¸é ½±°Ô ÀÌÇØµÉ °ÍÀÌ´Ù.) TWinControlÀº Àڽſ¡°Ô ¿Â ¸¶¿ì½º ¸Þ½ÃÁö°¡ ÀÚ½ÅÀÇ ÀÚ½Ä ÄÜÆ®·Ñ À§¿¡¼­ ¹ß»ýÇß´Ù¸é ±× ÄÜÆ®·Ñ¿¡°Ô·Î ¸Þ½ÃÁö¸¦ Àü´ÞÇØ ÁØ´Ù. (TWinControlÀÇ IsControlMouseMsg ÇÔ¼ö°¡ ÀÌ ¿ªÇÒÀ» ÇÑ´Ù.)
TGraphicControlÀº ÀÚ½ÅÀ» È­¸é¿¡ ±×¸± ¼ö ÀÖµµ·Ï Çϱâ À§Çؼ­ À©µµ µð¹ÙÀ̽º ÄÜÅØ½ºÆ®¸¦ »ç¿ëÇϱ⠽±°Ô Àß Æ÷ÀåÇØ ³õÀº TCanvas Ŭ·¡½º ÇüÀÇ Canvas ÇÁ·ÎÆÛƼ¿Í ÀÚ½ÅÀÌ ±×·ÁÁú Çʿ䰡 ÀÖÀ» ¶§ ¸¶´Ù È£ÃâµÇ´Â Paint ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´Ù. TGraphicControlÀÇ ÀÚ¼Õ Å¬·¡½º´Â Paint ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇϰí Canvas¸¦ ÀÌ¿ëÇØ¼­ ÀÚ½ÅÀ» È­¸é¿¡ ±×·ÁÁÖ¸é µÈ´Ù.
TGraphicControlÀ» »ç¿ëÇÒ ¶§ ÁÖÀÇÇØ¾ß ÇÒ °ÍÀº TGraphicControl°ú ±× ÀÚ¼Õ Å¬·¡½ºµµ ControlStyle ÇÁ·ÎÆÛƼ¿¡ csAcceptControls Ç÷¡±×¸¦ ¼³Á¤ÇÒ ¼ö´Â ÀÖÁö¸¸ ÀÌ Ç÷¡±×¸¦ ¼³Á¤ÇÑ ÄÞÆ÷³ÍÆ®¿¡ ´Ù¸¥ ÄÜÆ®·ÑÀ» ÀÚ½ÄÀ¸·Î ³ÖÀ¸·Á°í ÇÏ¸é µ¨ÆÄÀÌ´Â »õ·Î »ý¼ºÇÒ ÄÞÆ÷³ÍÆ®ÀÇ ºÎ¸ð°¡ µÉ ÄÞÆ÷³ÍÆ®¿¡¼­ À©µµ ÇÚµéÀ» ãÀ¸·Á ÇÒ °ÍÀ̱⠶§¹®¿¡ Access Violation ¿¡·¯¸¦ ¹ß»ý½ÃŰ°Ô µÈ´Ù´Â °ÍÀÌ´Ù.
1.7.5. TWinControl
TWinControlÀº À©µµ ½Ã½ºÅÛ¿¡¼­ Á¦°øÇÏ´Â ÄÜÆ®·Ñµé(TEdit, TButton, TTreeView, TListView, TToolbarµî)À» ¼­ºê Ŭ·¡½ÌÇÒ ¶§ »ç¿ëÇϴ Ŭ·¡½º·Î¼­ À©µµ ÇÚµéÀº °¡ÁöÁö¸¸ ½º½º·Î ÀÚ½ÅÀ» È­¸é¿¡ ¾Ë¾Æ¼­ ±×·ÁÁֱ⠶§¹®¿¡ ±âº»ÀûÀ¸·Î º°µµ·Î ÀÚ½ÅÀ» ±×¸± ¶§ ÇÊ¿äÇÑ ¸Þ¼Òµå³ª ÇÁ·ÎÆÛƼ¸¦ Á¦°øÇÏÁö ¾Ê´Â´Ù. TWinControlÀº À©µµ ½Ã½ºÅÛ ±âº» ÄÜÆ®·Ñ »Ó¸¸ÀÌ ¾Æ´Ï°í º¼·£µå C++ ½ÃÀý »ç¿ëÇß´ø BWCC.DLL°ú °°ÀÌ DLL·Î ±¸ÇöµÈ ÄÜÆ®·ÑµéÀ» ¼­ºê Ŭ·¡½ÌÇÒ ¶§µµ »ç¿ëÇÑ´Ù.
¾Õ¿¡¼­ ±âº»ÀûÀ¸·Î¶ó´Â ¸»À» Çߴµ¥ ±âº»ÀûÀ¸·Î´Â ±×·¸Áö¸¸ ¹æ¹ýÀÌ ¾ø´Â °ÍÀº ¾Æ´Ï´Ù. À©µµ ±âº» ÄÜÆ®·Ñ Áß XX_OWNERDRAW ¼Ó¼ºÀ» °¡Áú ¼ö ÀÖ´Â ÄÜÆ®·Ñ µéÀÌ Àִµ¥ ÀÌ ¼Ó¼ºÀ» ¼³Á¤ÇØÁÖ¸é ±âº»ÀûÀ¸·Î ±×·ÁÁö´Â °ÍÀ» ³» ÀÔ¸À¿¡ ¸Â°Ô È®ÀåÇÒ ¼ö ÀÖ´Ù. ¹°·Ð WM_PAINT ¸Þ½ÃÁö¸¦ °¡·Îä¼­ ÇÒ ¼öµµ ÀÖ´Ù.
TWinControlÀº Handle À̶ó´Â ÇÁ·ÎÆÛƼ¸¦ Á¦°øÇÏ´Â µ¥ ÀÌ ÇÁ·ÎÆÛƼ°¡ ÇöÀç ¼­ºê Ŭ·¡½ÌÇÑ ÄÜÆ®·ÑÀÇ À©µµ ÇÚµéÀ̸ç ÇÚµéÀ» ÇÊ¿ä·Î ÇÏ´Â °¢Á¾ À©µµ API¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÀÔ·Â Æ÷Ä¿½º¸¦ °¡Áú ¼ö Àֱ⠶§¹®¿¡ CanFocus, Focused, TabStop, TabOrder, OnKeyDown, OnKeyPressµî ÀÔ·Â Æ÷Ä¿½º ¹× Űº¸µå¿Í °ü·ÃµÈ ¿©·¯°¡Áö ÇÁ·ÎÆÛƼ, ¸Þ¼Òµå, À̺¥Æ®µµ ÇÔ²² Á¦°øÇÑ´Ù.
TWinControl¸¦ ºÎ¸ð·Î ÇÏ´Â ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÏ·Á°í ÇÏ´Â °³¹ßÀÚ¿¡°Ô À¯¿ëÇÑ ÇÁ·ÎÆÛƼ¿Í ¸Þ¼Òµå¸¦ ¾Ë¾Æº¸ÀÚ.
ù¹øÂ°·Î CreateParams ¿Í CreateWnd ¸Þ¼ÒµåÀε¥ ÀÌ µÎ °¡»ó ¸Þ¼Òµå´Â TWinControlÀÌ ¼­ºê Ŭ·¡½ÌÇÏ´Â À©µµ ÄÜÆ®·ÑÀÇ ÇÚµéÀ» »ý¼ºÇÒ ¶§ È£ÃâµÈ´Ù.
CreateHandle ¸Þ¼Òµå´Â CreateWnd ¸Þ¼Òµå¸¦ È£ÃâÇϰí CreateWnd´Â CreateParams¸¦ È£ÃâÇØ¼­ À©µµ »ý¼º Á¤º¸¸¦ ¸¸µç ´ÙÀ½ CreateWindowHandle ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. CreateWindowHandle ¸Þ¼Òµå´Â CreaetParams ¸Þ¼Òµå·Î ¾ò¾îÁø À©µµ »ý¼º Á¤º¸¸¦ °¡Áö°í CreateWindowEx API¸¦ È£ÃâÇØ¼­ ½ÇÁ¦·Î À©µµ ÇÚµéÀ» ¸¸µç´Ù. ÀÌ °úÁ¤¿¡¼­ CreateParams´Â À©µµ »ý¼º Á¤º¸¸¦ ¸¸µå´Âµ¥ ÄÞÆ÷³ÍÆ® °³¹ßÀÚ´Â ÀÌ ¸Þ¼Òµå¸¦ Á¾Á¾ ¿À¹ö¶óÀ̵å ÇØ¼­ »ý¼ºÇÒ À©µµÀÇ ½ºÅ¸ÀϵéÀ» ¹Ù²Ù°ï ÇÑ´Ù. ¿¹¸¦ µé¾î º¸ÀÚ. TButton ÄÞÆ÷³ÍÆ®´Â À©µµ ±âº» ÄÜÆ®¸¦ Áß BUTTON À©µµ Ŭ·¡½º·Î ¸¸µé¾î Áö´Âµ¥ TButtonÀº À̹ÌÁö¸¦ Ç¥½ÃÇÒ ¼ö ¾ø±â ¶§¹®¿¡ µ¨ÆÄÀÌ¿¡¼­´Â TBitBtn ÄÞÆ÷³ÍÆ®¸¦ ¸¸µé¾î ³õ¾Ò´Ù. À©µµ BUTTON ÄÜÆ®·ÑÀº ¹öư¿¡ À̹ÌÁö¸¦ ±×·Á ÁÖ±â À§Çؼ­ CreateWindowEx·Î ¹öưÀ» »ý¼ºÇÒ ¶§ ¹öư ½ºÅ¸ÀÏ¿¡ BS_OWNERDRAW ½ºÅ¸ÀÏÀ» Ãß°¡ÇØ ÁÖ¾î¾ß Çϴµ¥ ÀÌ·± ½ºÅ¸ÀÏÀ» º¯°æÇØ ÁÙ ¼ö ÀÖ´Â ¸Þ¼Òµå°¡ ¹Ù·Î CreateParamsÀÌ´Ù. TBitBtn ÄÞÆ÷³ÍÆ®´Â Buttons.pas¿¡¼­ ¹ßÃéÇÑ ¾Æ·¡ Äڵ忡¼­ º¸´Â ¹Ù¿Í °°ÀÌ CreateParams¸¦ ¿À¹ö¶óÀ̵åÇϰí Params.Style¿¡ BS_OWNERDRAW Ç÷¡±×¸¦ ¼³Á¤Çϰí ÀÖ´Ù.


TBitBtn = class(TButton)
  private
{ »ý ·« }
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { »ý ·« }
  published
    { »ý ·« }
  end;
     
procedure TBitBtn.CreateParams(var Params: TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do Style := Style or BS_OWNERDRAW;
end;


TBitBtn¿¡¼­ ½ÇÁ¦·Î ¹öư¿¡ À̹ÌÁö¸¦ ±×·ÁÁÖ´Â ·çƾÀº buttons.pas À¯´ÖÀ» º¸¸é ¾Ë°ÚÁö¸¸ WM_DRAWITEM ¸Þ½ÃÁö¸¦ ¹Þ¾Æ¼­ ó¸®ÇØ ÁØ´Ù.

CreateWnd ¸Þ¼Òµå´Â À©µµ ÇÚµéÀÌ ¿ÏÀüÈ÷ »ý¼ºµÈ ÈÄ¿¡ º°µµÀÇ ÃʱâÈ­ ÀÛ¾÷ÀÌ ÇÊ¿äÇÑ °æ¿ì¿¡ »ç¿ëÇÑ´Ù. EDIT À©µµ Ŭ·¡½º¸¦ ¼­ºê Ŭ·¡½ÌÇÏ´Â TCustomEdit ÄÞÆ÷³ÍÆ®ÀÇ °æ¿ì EDIT ÄÜÆ®·ÑÀÇ ÀÔ·Â Å©±â Á¦ÇÑ ÇÁ·ÎÆÛƼ¸¦ ¼³Á¤Çϱâ À§Çؼ­ CreateWnd ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇϴµ¥ StdCtrls.pas À¯´ÖÀ» º¸¸é ¾Æ·¡¿Í °°ÀÌ Á¤ÀÇÇϰí ÀÖ´Ù.

procedure TCustomEdit.CreateWnd;
begin
  FCreating := True;
  try
    inherited CreateWnd;
  finally
    FCreating := False;
  end;
  DoSetMaxLength(FMaxLength);
  Modified := FModified;
  if FPasswordChar <> #0 then
    SendMessage(Handle, EM_SETPASSWORDCHAR, Ord(FPasswordChar), 0);
  UpdateHeight;
end;


±×·±µ¥ ÄÞÆ÷³ÍÆ®¸¦ °³¹ßÇÏ´Ù º¸¸é ¾î¶² ÀÛ¾÷À» ¼öÇàÇϱâ À§Çؼ­´Â ¹Ýµå½Ã À©µµ ÇÚµéÀÌ »ý¼ºµÇ¾î ÀÖ¾î¾ß µÇ´Â °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ¾îÇø®ÄÉÀ̼ÇÀÌ ½ÇÇàµÉ ¶§ Æû ÆÄÀÏ¿¡¼­ ÇÁ·ÎÆÛƼ °ªÀ» ÀÐ¾î ¿Í¼­ ¼³Á¤Çϸé ÇÁ·ÎÆÛƼ ¾²±â ¸Þ¼Òµå°¡ ½ÇÇà µÇ´Âµ¥ ÀÌ ¸Þ¼Òµå¿¡¼­ À©µµ ÇÚµéÀÌ ÇÊ¿äÇÒ °æ¿ì°¡ »ý±ä´Ù. ÀÌ·² °æ¿ì HandleAllocated ¸Þ¼Òµå¿Í HandleNeeded ¸Þ¼Òµå¸¦ »ç¿ëÇϴµ¥ HandleAllocated ¸Þ¼Òµå´Â À©µµ ÇÚµéÀÌ »ý¼ºµÇ¾ú´ÂÁö¸¦ ¾Ë ¼ö ÀÖÀ¸¸ç HandleNeeded ¸Þ¼Òµå´Â ÇÚµéÀÌ »ý¼ºµÇ¾î ÀÖÁö ¾ÊÀº °æ¿ì¿¡ CreateHandle ¸Þ¼Òµå¸¦ È£ÃâÇØ¼­ ÇÚµéÀ» »ý¼ºÇØ ÁØ´Ù. ¾Æ·¡ ¿¹Á¦´Â TCustomEditÀÇ ÇÁ·ÎÆÛƼ ¾²±â ¸Þ¼ÒµåÀÎ SetMaxLength ¸Þ¼Òµå¿Í TCustomComboBoxÀÇ ÇÁ·ÎÆÛƼ ¾²±â ¸Þ¼ÒµåÀÎ SetSelText ¸Þ¼ÒµåÀÌ´Ù. SetSelText ¸Þ¼ÒµåÀÇ °æ¿ì SendMessage ¸¦ ÀÌ¿ëÇϰí Àֱ⠶§¹®¿¡ HandleNeeded ¸Þ¼Òµå¸¦ »ç¿ëÇØ¼­ ¹Ýµå½Ã À©µµ ÇÚµéÀ» »ý¼ºÇϵµ·Ï Çϰí ÀÖ´Ù.

procedure TCustomEdit.SetMaxLength(Value: Integer);
begin
  if FMaxLength <> Value then
  begin
    FMaxLength := Value;
    if HandleAllocated then DoSetMaxLength(Value);
  end;
end;

procedure TCustomComboBox.SetSelText(const Value: string);
begin
  if FStyle < csDropDownList then
  begin
    HandleNeeded;
    SendMessage(FEditHandle, EM_REPLACESEL, 0, Longint(PChar(Value)));
  end;
end;


1.7.6. TCustomControl
TCustomControlÀº TWinControl¿¡ TGraphicControlÀÇ ±â´ÉÀ» Ãß°¡Çß´Ù°í º¸¸é µÈ´Ù. ÀÚ½ÅÀ» È­¸é¿¡ ±×·ÁÁÙ ¶§ »ç¿ëÇÒ Canvas¿Í Paint ¸Þ¼Òµå°¡ ÁغñµÇ¾î ÀÖ´Ù. ´ëºÎºÐÀÇ °æ¿ì »õ·Î¿î ºñÁÖ¾ó ÄÞÆ÷³ÍÆ®¸¦ ¸¸µé °æ¿ì TCustomControlÀ» ºÎ¸ð Ŭ·¡½º·Î »ç¿ëÇÏ°Ô µÈ´Ù.
1.7.7. Æû ÆÄÀÏÀÌ ÀúÀåµÇ´Â ¹æ¹ý
¾Õ¿¡¼­µµ ¸î ¹ø ¾ê±âÇßÁö¸¸ µ¨ÆÄÀÌ´Â ÆûÀ» ÀúÀåÇÒ ¶§ DFM È®ÀåÀÚ¸¦ °¡Áö´Â Æû ÆÄÀÏÀ» »ç¿ëÇÑ´Ù. µ¨ÆÄÀÌ´Â ÆûÀ» ÀúÀåÇÒ ¶§ classes.pas¿¡ Á¤ÀǵǾî ÀÖ´Â WriteComponentResFile ÇÁ·Î½ÃÀú¸¦ ÀÌ¿ëÇÑ´Ù. WriteComponentResFile ÇÁ·Î½ÃÀúÀÇ ¿øÇüÀº ¾Æ·¡¿Í °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

procedure WriteComponentResFile(const FileName: string; Instance: TComponent);


ÀúÀåÇÒ ÆÄÀÏ À̸§°ú TComponentÀÇ ÀνºÅϽº¸¦ ÀÎÀÚ·Î ¹Þ´Â´Ù. Æûµµ TComponent¸¦ ºÎ¸ð Ŭ·¡½º·Î »ç¿ëÇϰí Àֱ⠶§¹®¿¡ ¾Æ·¡¿Í °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

WriteComponentResFile('Unit1.dfm', Form1);


WriteComponentResFile ÇÁ·Î½ÃÀú´Â TFileStream °´Ã¼¸¦ ¸¸µé°í TFileStreamÀÇ WriteComponentRes ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ½ÇÁ¦·Î TFileStream ÀÇ ºÎ¸ð Ŭ·¡½ºÀÎ TStream¿¡ ¼±¾ðµÇ¾î ÀÖ´Â WriteComponentRes ¸Þ¼Òµå´Â WriteDescendentRes¸¦ È£ÃâÇϰí WriteDescendentRes´Â WriteResourceHeader, WriteDescendent, FixupResourceHeader¸¦ Â÷·Ê´ë·Î È£ÃâÇÑ´Ù. ¸¶Áö¸·À¸·Î WriteDescendent ¸Þ¼Òµå´Â TWriter °´Ã¼¸¦ »ý¼ºÇÏ°í ½ÇÁ¦·Î ÆûÀ» ÀúÀåÇÏ´Â ·çƾÀÎ TWriter °´Ã¼ÀÇ WriteDescendent ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. ÀÌ ¸Þ¼Òµå´Â Æû ÀڽŰú ÆûÀÇ ÀÚ½Ä ÄÜÆ®·ÑµéÀÇ Published ÇÁ·ÎÆÛƼ ¸®½ºÆ®¸¦ RTTI¸¦ ÅëÇØ ±¸Çϰí À̵éÀ» Â÷·Ê´ë·Î ÀúÀåÇÑ´Ù.
WriteComponentResFileÀº Àü¿ªÀ¸·Î ¼±¾ðµÇ¾î Àֱ⠶§¹®¿¡ ÀÚ½ÅÀÇ ÄÞÆ÷³ÍÆ®¸¦ º°µµ ÆÄÀÏ·Î ÀúÀåÇÏ°í ½Í´Ù¸é ÀÌ ÇÁ·Î½ÃÀú¸¦ È£ÃâÇØ¼­ ½±°Ô ÇØ°á ÇÒ ¼ö ÀÖ´Ù. ¸¶Âù°¡Áö·Î Æû ÆÄÀÏ¿¡¼­ ÀÐ¾î µéÀÏ ¶§´Â ReadComponentResFile ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù.
1.7.8. Published µÇÁö ¾ÊÀº ÇÁ·ÎÆÛƼ¸¦ ÀúÀåÇÏ´Â ¹ý
±âº»ÀûÀ¸·Î ÀÌÀü Àý¿¡¼­ ¾ê±âÇÑ ¹æ¹ýÀ¸·Î µ¨ÆÄÀÌ´Â Published ÇÁ·ÎÆÛƼ¸¸ Æû ÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù. ÇÏÁö¸¸ µ¨ÆÄÀÌ´Â Published µÇÁö ¾ÊÀº ÇÁ·ÎÆÛƼµµ ÀúÀåÇÒ ¼ö ÀÖÀ» »Ó¸¸ ¾Æ´Ï¶ó ³Ê¹« º¹ÀâÇØ¼­ µ¨ÆÄÀ̰¡ ¾î¶»°Ô ÀúÀåÇϰí ÀÐ¾î µé¿©¾ß ÇÒÁö ¸ð¸£´Â ÇÁ·ÎÆÛƼµµ ÀúÀåÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇÑ´Ù. VCLÀÇ °èÃþµµ¸¦ »ìÆìº¸¸é TComponent Ŭ·¡½º´Â TPersistent Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýµÇ´Âµ¥ TPersistent Ŭ·¡½º´Â DefineProperties ¶ó´Â °¡»ó ¸Þ¼Òµå¸¦ °¡Áö°í ÀÖ´Ù. ÀÌ ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÏ¸é µ¨ÆÄÀÌ¿¡°Ô Published µÇÁö ¾ÊÀº Á¶±ÝÀº Ư¼öÇÑ ÇÁ·ÎÆÛƼ¸¦ ¾î¶»°Ô ÀÐ°í ¾²´ÂÁö¸¦ °¡¸£ÃÄ ÁÙ ¼ö ÀÖ´Ù.
DefineProperties ¸Þ¼Òµå´Â TFiler Çü ÀÎÀÚ¸¦ Çϳª Á¦°øÇϴµ¥ TFiler´Â TReader¿Í TWriterÀÇ ºÎ¸ð Ŭ·¡½º·Î¼­ Ãß»ó Ŭ·¡½ºÀÌ´Ù. µû¶ó¼­ DefineProperties ¸Þ¼Òµå´Â ÇÁ·ÎÆÛƼ¸¦ ÀÐ°í ¾µ ¶§ °°ÀÌ »ç¿ëµÈ´Ù. TFiler´Â DefineProperty ¸Þ¼Òµå¸¦ Á¦°øÇϴµ¥ ÀÌ ¸Þ¼Òµå·Î °¢ ÇÁ·ÎÆÛƼ¸¦ ¾î¶»°Ô Ãë±ÞÇÒ Áö¸¦ ÁöÁ¤ÇÑ´Ù. DefineProperty ¸Þ¼Òµå´Â ÇÁ·ÎÆÛƼ À̸§, Àбâ ÇÔ¼ö, ¾²±â ÇÔ¼ö, ÀúÀåÇÒ µ¥ÀÌÅͰ¡ ÀÖ´ÂÁö ¾ø´ÂÁö¸¦ °áÁ¤ÇÏ´Â ³í¸®Çü ÀÌ·¸°Ô ³× °¡Áö ÀÎÀÚ¸¦ °¡Áø´Ù.
¾Æ·¡ ¿¹Á¦´Â grids.pas À¯´Ö¿¡ Á¤ÀǵǾî ÀÖ´Â TCustomGrid¿¡¼­ DefindProperties¸¦ ¿À¹ö¶óÀ̵åÇÑ ¿¹ÀÌ´Ù.

procedure TCustomGrid.ReadColWidths(Reader: TReader);
var
  I: Integer;
begin
  with Reader do
  begin
    ReadListBegin;
    for I := 0 to ColCount - 1 do ColWidths[I] := ReadInteger;
    ReadListEnd;
  end;
end;

procedure TCustomGrid.ReadRowHeights(Reader: TReader);
var
  I: Integer;
begin
  with Reader do
  begin
    ReadListBegin;
    for I := 0 to RowCount - 1 do RowHeights[I] := ReadInteger;
    ReadListEnd;
  end;
end;

procedure TCustomGrid.WriteColWidths(Writer: TWriter);
var
  I: Integer;
begin
  with Writer do
  begin
    WriteListBegin;
    for I := 0 to ColCount - 1 do WriteInteger(ColWidths[I]);
    WriteListEnd;
  end;
end;

procedure TCustomGrid.WriteRowHeights(Writer: TWriter);
var
  I: Integer;
begin
  with Writer do
  begin
    WriteListBegin;
    for I := 0 to RowCount - 1 do WriteInteger(RowHeights[I]);
    WriteListEnd;
  end;
end;

procedure TCustomGrid.DefineProperties(Filer: TFiler);

  function DoColWidths: Boolean;
  begin
    if Filer.Ancestor <> nil then
      Result := not CompareExtents(TCustomGrid(Filer.Ancestor).FColWidths, FColWidths)
    else
      Result := FColWidths <> nil;
  end;

  function DoRowHeights: Boolean;
  begin
    if Filer.Ancestor <> nil then
      Result := not CompareExtents(TCustomGrid(Filer.Ancestor).FRowHeights, FRowHeights)
    else
      Result := FRowHeights <> nil;
  end;


begin
  inherited DefineProperties(Filer);
  if FSaveCellExtents then
    with Filer do
    begin
      DefineProperty('ColWidths', ReadColWidths, WriteColWidths, DoColWidths);
      DefineProperty('RowHeights', ReadRowHeights, WriteRowHeights, DoRowHeights);
    end;
end;


grids.pas À¯´ÖÀ» º¸¸é ¾Ë°ÚÁö¸¸ RowHeights¿Í ColWidths ÇÁ·ÎÆÛƼ´Â ³»ºÎ º¯¼ö·Î Æ÷ÀÎÅ͸¦ »ç¿ëÇϰí Column °³¼ö¿Í Row °³¼ö°¡ º¯°æµÉ ¶§¸¶´Ù µ¿ÀûÀ¸·Î ¸Þ¸ð¸®¸¦ ÇÒ´çÇØ¼­ »ç¿ëÇϰí ÀÖ´Ù. ÀÌ µÎ ÇÁ·ÎÆÛƼ´Â µ¨ÆÄÀÌ¿¡¼­ ±âº»ÀûÀ¸·Î ÀúÀåÇÒ ¼ö ÀÖ´Â ¹æ¹ýÀ» Á¦°øÇØ ÁÖÁö ¾Ê±â ¶§¹®¿¡ Published ¿µ¿ª¿¡ µÑ ¼ö ¾ø´Ù. ÇÏÁö¸¸ »ç¿ëÀÚ°¡ ColumnÀÇ ÆøÀ» ¸¶¿ì½º·Î Á¶ÀýÇß´Ù¸é ±× °ªÀ» À¯ÁöÇϰí ÀÖ¾î¾ß ÇÒ Çʿ䰡 ÀÖ´Ù. ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ°¡ ColumnÀÇ ÆøÀ» Á¶ÀýÇߴµ¥ ½ÇÇà ½Ã¿¡ ¿ø·¡ ±âº» Å©±â·Î µ¹¾Æ°£´Ù°í »ý°¢ÇØ º¸¶ó. µû¶ó¼­ º°µµ·Î DefineProperties¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ColWidths¿Í RowHeights¶ó´Â À̸§À¸·Î ¸®½ºÆ®¸¦ ÀúÀåÇϵµ·Ï Çϰí ÀÖ´Ù.
1.7.9. TCollection°ú TCollectionItem
¸¸¾à¿¡ µ¶ÀÚ°¡ °³¹ßÇÏ´Â ÄÞÆ÷³ÍÆ®¿¡¼­ TList¸¦ »ç¿ëÇϰí ÀÖ°í TListÀÇ °¢ ¾ÆÀÌÅÛÀ¸·Î ¿©·¯ °³ÀÇ Published ÇÁ·ÎÆÛƼ¸¦ °¡Áö°í Àִ Ŭ·¡½º¸¦ »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏ°í ±× °ªµéÀ» Æû ÆÄÀÏ¿¡ ÀúÀåÇØ¾ß ÇÒ Çʿ伺ÀÌ ÀÖ´Ù°í »ý°¢ÇØ º¸ÀÚ. TList´Â TPersistent¿¡¼­ »ó¼Ó ¹ÞÀº Ŭ·¡½º°¡ ¾Æ´Ï±â ¶§¹®¿¡ ±âº»ÀûÀ¸·Î´Â Æû ÆÄÀÏ¿¡ ÀúÀåÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ ¾Õ Àý¿¡¼­ ¾ê±âÇÑ DefineProperties¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ±¸ÇöÇÑ´Ù°í »ý°¢ÇØ º¸ÀÚ. À§ÀÇ TCustomGridÀÇ °æ¿ì ó·³ ÀúÀåÇÒ ÇÁ·ÎÆÛƼÀÇ ³»¿ëÀÌ °£´ÜÇÑ °æ¿ì¿¡´Â ±îÁþ°Å Çϸ鼭 ±¸ÇöÇÒ ¼ö ÀÖ°ÚÁö¸¸ ³»¿ëÀÌ º¹ÀâÇÑ °æ¿ì¿¡´Â À̰͵µ ¾çÀÌ ¸¸¸¸Ä¡ ¾Ê´Ù.
ÀÌ·² ¶§ »ç¿ëÇϸé ÁÁÀº Ŭ·¡½º°¡ ¹Ù·Î TCollection°ú TCollectionItemÀÌ´Ù. TCollectionÀº TList ´ë½Å TCollectionItemÀº TListÀÇ °¢ ItemÀ» ´ë½ÅÇØ¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. TCollection°ú TCollectionItemÀº ¸ðµÎ TPersistent Ŭ·¡½º¿¡¼­ ÆÄ»ýµÈ Ŭ·¡½ºÀ̹ǷΠÇÁ·ÎÆÛƼ¸¦ Published¿¡ ½á Áֱ⸸ Çϸé ÀúÀå ¹®Á¦´Â °£´ÜÇÏ°Ô ÇØ°áµÈ´Ù. ¶ÇÇÑ TList¸¦ »ç¿ëÇÏ¸é ¸Þ¸ð¸® ´©¼ö ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Êµµ·Ï ¸¹Àº ½Å°æÀ» ½á¾ß ÇÏÁö¸¸ TCollectionÀº °ÆÁ¤ÇÒ Çʿ䰡 ¾ø´Ù. ±×¸®°í TList¸¦ »ç¿ëÇÑ ÇÁ·ÎÆÛƼ¸¦ ¾îÇø®ÄÉÀÌ¼Ç °³¹ßÀÚ°¡ ¼³°è ½Ã¿¡ º¯°æÇÒ ¼ö ÀÖ°Ô ÇÏ·Á¸é ÇÁ·ÎÆÛƼ ¿¡µðÅ͵µ ¸¸µé¾î ÁÖ¾î¾ß ÇÑ´Ù. ÇÏÁö¸¸ TCollectionÀº ÀÌ ¹®Á¦µµ ÇØ°áÇØ ÁØ´Ù. µ¨ÆÄÀÌ´Â ±âº»ÀûÀ¸·Î Collection ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ °¡Áö°í Àֱ⠶§¹®ÀÌ´Ù.
´ç¿¬ÇÑ ¾ê±â°ÚÁö¸¸ TCollection°ú TCollectionItem Ŭ·¡½º¸¦ Á÷Á¢ »ç¿ëÇÏÁö´Â ¾Ê´Â´Ù. TCollection°ú TCollectionItemÀº À§¿¡¼­ ¾ê±âÇÑ ¹®Á¦Á¡µéÀ» ÇØ°áÇØ ÁÖ´Â »À´ë¸¸ Á¦°øÇϱ⠶§¹®¿¡ À̵é Ŭ·¡½º¸¦ ºÎ¸ð·Î ÇÏ´Â ÆÄ»ý Ŭ·¡½º¸¦ ¸¸µé¾î¼­ »ç¿ëÇÑ´Ù.
TCollection°ú TCollectionItemÀº µ¨ÆÄÀÌ ±âº» ÄÞÆ÷³ÍÆ®¿¡¼­µµ ¸¹ÀÌ »ç¿ëµÇ°í Àִµ¥ ´ëÇ¥ÀûÀ¸·Î TDBGridÀÇ TDBGridColumns¿Í TColumn, TStatusBarÀÇ TStatusPanels¿Í TStatusPanel, TCoolBarÀÇ TCoolBands¿Í TCoolBand, TTableÀÇ TIndexDefs¿Í TIndexDef µîÀÌ ÀÖ´Ù. TStatusBar¿¡¼­ »ç¿ëÇϰí ÀÖ´Â ¿¹¸¦ Àá±ñ »ìÆì º¸ÀÚ.

TStatusPanel = class(TCollectionItem)
  private
    { »ý·« }
  protected
    { »ý·« }
    function GetDisplayName: string; override;
  public
    { »ý·« }
    procedure Assign(Source: TPersistent); override;
  published
    { »ý·« }
  end;

  TStatusPanels = class(TCollection)
  private
    FStatusBar: TStatusBar;
    function GetItem(Index: Integer): TStatusPanel;
    procedure SetItem(Index: Integer; Value: TStatusPanel);
  protected
    function GetOwner: TPersistent; override;
    procedure Update(Item: TCollectionItem); override;
  public
    constructor Create(StatusBar: TStatusBar);
    function Add: TStatusPanel;
    property Items[Index: Integer]: TStatusPanel read GetItem write SetItem; default;
  end;

  { »ý·« }

  TStatusBar = class(TWinControl)
  private
    { »ý·« }
    FPanels: TStatusPanels;
    { »ý·« }
    procedure SetPanels(Value: TStatusPanels);
  protected
    { »ý·« }
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    { »ý·« }
  published
    { »ý·« }
    property Panels: TStatusPanels read FPanels write SetPanels;
  end;

implementation

{ TStatusPanel }

procedure TStatusPanel.Assign(Source: TPersistent);
begin
  if Source is TStatusPanel then
  begin
    Text := TStatusPanel(Source).Text;
    Width := TStatusPanel(Source).Width;
    Alignment := TStatusPanel(Source).Alignment;
    Bevel := TStatusPanel(Source).Bevel;
    Style := TStatusPanel(Source).Style;
  end
  else inherited Assign(Source);
end;

function TStatusPanel.GetDisplayName: string;
begin
  Result := Text;
  if Result = '' then Result := inherited GetDisplayName;
end;

{ TStatusPanels }

constructor TStatusPanels.Create(StatusBar: TStatusBar);
begin
  inherited Create(TStatusPanel);
  FStatusBar := StatusBar;
end;

function TStatusPanels.Add: TStatusPanel;
begin
  Result := TStatusPanel(inherited Add);
end;

function TStatusPanels.GetItem(Index: Integer): TStatusPanel;
begin
  Result := TStatusPanel(inherited GetItem(Index));
end;

function TStatusPanels.GetOwner: TPersistent;
begin
  Result := FStatusBar;
end;

procedure TStatusPanels.SetItem(Index: Integer; Value: TStatusPanel);
begin
  inherited SetItem(Index, Value);
end;

procedure TStatusPanels.Update(Item: TCollectionItem);
begin
  if Item <> nil then
    FStatusBar.UpdatePanel(Item.Index, False) else
    FStatusBar.UpdatePanels(True, False);
end;

{ TStatusBar }

constructor TStatusBar.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  { »ý·« }
  FPanels := TStatusPanels.Create(Self);
  { »ý·« }
end;

destructor TStatusBar.Destroy;
begin
  { »ý·« }
  FPanels.Free;
  inherited Destroy;
end;

procedure TStatusBar.SetPanels(Value: TStatusPanels);
begin
  FPanels.Assign(Value);
end;


TStatusBar¿¡¼­ »ç¿ëÇÒ °¢ ÆÇ³ÚÀ» TCollectionItem¿¡¼­ »ó¼Ó ¹Þ¾Æ TStatusPanelÀ» ¸¸µé°í ÆÇ³ÚÀÇ ¸®½ºÆ®¸¦ º¸°üÇÒ Å¬·¡½º·Î TCollection¿¡¼­ »ó¼Ó ¹Þ¾Æ¼­ TStatusPanels¸¦ ¸¸µé¾ú´Ù. TCollectionItemÀº DisplayName À̶ó´Â ÇÁ·ÎÆÛƼ¸¦ °¡Áö°í Àִµ¥ ÀÌ ÇÁ·ÎÆÛƼ´Â ÄÝ·º¼Ç ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿¡ °¢ ¾ÆÀÌÅÛÀ» Ç¥½ÃÇÒ ¶§ »ç¿ëÇÏ´Â ÇÁ·ÎÆÛƼÀÌ´Ù. ÀÌ ÇÁ·ÎÆÛƼÀÇ ±âº»°ªÀº TCollectionItem ÆÄ»ý Ŭ·¡½ºÀÇ Å¬·¡½º À̸§Àε¥ ÀÌ·¸°Ô µÇ¸é ¾Æ·¡ ±×¸²Ã³·³ °¢ ¾ÆÀÌÅÛÀ» ±¸ºÐÇϱⰡ ¾î·Á¿ö Áø´Ù.

±×¸² 1-12 DisplayName ÇÁ·ÎÆÛƼ°¡ ±âº» °ªÀÏ ¶§ÀÇ ÄÝ·º¼Ç ÇÁ·ÎÆÛƼ ¿¡µðÅÍ


±×·¡¼­ °¡»ó ¸Þ¼Òµå·Î ¼±¾ðµÇ¾î ÀÖ´Â ÀÌ ÇÁ·ÎÆÛƼÀÇ Àб⠸޼ҵåÀÎ GetDisplaynameÀ» º¸Åë ¿À¹ö¶óÀ̵åÇØ¼­ ¿©·¯ °¡Áö 󸮸¦ ÇØ ÁØ´Ù. ¿¹¸¦ µé¾î TStatusBarÀÇ Panels ÇÁ·ÎÆÛƼÀÇ °æ¿ì °¢ PanelÀÇ Text ÇÁ·ÎÆÛƼ¸¦ º¯°æÇÏ¸é ¾Æ·¡¿Í °°ÀÌ º¸ÀÏ °ÍÀÌ´Ù.

±×¸² 1-13 GetDisplayName ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇÑ ÈÄÀÇ ÄÝ·º¼Ç ÇÁ·ÎÆÛƼ ¿¡µðÅÍ


´ÙÀ½À¸·Î TPersistent Ŭ·¡½º´Â AssignÀ̶ó´Â °¡»ó ¸Þ¼Òµå¸¦ °¡Áö°í Àִµ¥ ÀÚ½ÅÀÌ °¡Áö°í ÀÖ´Â °ªµéÀ» °°Àº ÇüÀÇ ´Ù¸¥ °´Ã¼¿¡ º¹»çÇÒ ¶§ ÁÖ·Î »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î

var
  SourceList : TStrings;
  DestList : TStrings;
begin
  SourceList := TStringList.Create;
  DestList := TStringList.Create;
  try
    SourceList.LoadFromFile('example.Text');
    DestList.Assign(SourceList);
  finally
    DestList.Free;
    SourceList.Free;
  end;
end;


SourceListÀÇ °ªÀ» DestList¿¡ º¹»çÇÒ ¶§ Assign ¸Þ¼Òµå¸¦ »ç¿ëÇϰí ÀÖ´Ù. ¸¶Âù°¡Áö·Î TCollectionItem¿¡¼­ »ó¼Ó ¹Þ´Â Ŭ·¡½ºÀÇ °æ¿ì ÀڽЏ¸ÀÇ ÇÁ·ÎÆÛƼ¸¦ Ãß°¡Çß´Ù¸é ¹Ýµå½Ã Assign ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ÀÚ½ÅÀÇ ÇÁ·ÎÆÛƼ°¡ Á¤»óÀûÀ¸·Î º¹»çµÉ ¼ö ÀÖµµ·Ï ÇØ ÁÖ¾î¾ß ÇÑ´Ù. TCollectionItem Ŭ·¡½º »Ó¸¸ÀÌ ¾Æ´Ï°í ´ëºÎºÐÀÇ °æ¿ì TPersistent¿¡¼­ »ó¼Ó ¹Þ¾Æ¼­ ¸¸µé¾îÁö´Â Ŭ·¡½º´Â °¡±ÞÀû Assign ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ÀûÀýÇÑ Ã³¸®¸¦ ÇØ ÁÖ´Â °ÍÀÌ ÁÁ´Ù.
±×¸®°í À§ÀÇ ¿¹Á¦¿¡¼­ º¸´Â ¹Ù¿Í °°ÀÌ TCollection Ŭ·¡½ºÀÇ GetOwner ¸Þ¼ÒµåÀÇ ¹Ýȯ °ªÀÌ TCollectionÀ» ¼ÒÀ¯Çϰí ÀÖ´Â ÄÞÆ÷³ÍÆ®°¡ µÇµµ·Ï ÇØ ÁÖ´Â °ÍÀÌ ÁÁ´Ù. ¸¸¾à¿¡ GetOwner¸¦ ¿À¹ö¶óÀ̵å ÇÏÁö ¾Ê°í »ó¼ÓµÈ °ªÀÌ ¹ÝȯµÇ¸é ÄÝ·º¼Ç ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ Á¤»óÀûÀ¸·Î µ¿ÀÛÇÏÁö ¾Ê´Â´Ù.
¸¶Áö¸·À¸·Î TCollection Ŭ·¡½º¸¦ ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ·Î »ç¿ëÇϸé ÄÞÆ÷³ÍÆ®°¡ ÀúÀåµÉ ¶§ TCollectionÀÇ °ªµéµµ ÀÚµ¿À¸·Î ÀúÀåµÈ´Ù. ÇÏÁö¸¸ TCollection Ŭ·¡½º¸¦ ´Üµ¶À¸·Î »ç¿ëÇϰí À̸¦ º°µµÀÇ ÆÄÀÏ·Î ÀúÀåÇÏ·Á¸é ¾î¶»°Ô ÇÏ¸é µÉ±î? °£´ÜÇÏ´Ù. TWriter¿Í TReader Ŭ·¡½ºÀÇ WriteCollection, ReadCollection ¸Þ¼Òµå¸¦ »ç¿ëÇÏ¸é µÈ´Ù. ¾Æ·¡¿¡ °£´ÜÇÑ ÇÁ·Î½ÃÀú¸¦ Çϳª ¸¸µé¾î º¸¾ÒÀ¸´Ï Âü°íÇϱ⠹ٶõ´Ù.

procedure WriteCollectionToFile(const AFileName : String; ACollection : TCollection);
var
  Stream : TMemoryStream;
  Writer: TWriter;
begin
  Stream := TMemoryStream.Create;
  try
    Writer := TWriter.Create(Stream, 1024);
    try
      Writer.WriteCollection(ACollection);
    finally
      Writer.Free;
    end;
    Stream.SaveToFile(AFileName);
  finally
    Stream.Free;
  end;
end;


procedure ReadCollectionFromFile(const AFileName : String; ACollection : TCollection);
var
  Stream : TMemoryStream;
  Reader: TReader;
begin
  Stream := TMemoryStream.Create;
  try
    Stream.LoadFromFile(AFileName);
    Reader := TReader.Create(Stream, 1024);
    try
      Reader.ReadValue;
      Reader.ReadCollection(ACollection);
    finally
      Reader.Free;
    end;
  finally
    Stream.Free;
  end;
end;





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