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


3.3. ÇÁ·ÎÆÛƼ ¿¡µðÅÍ(Property Editor)

3.3.1. °³¿ä
µ¨ÆÄÀÌ´Â ÀÚ½ÅÀÇ IDE¸¦ »ç¿ëÀÚ°¡ È®ÀåÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» Á¦°øÇØ ÁØ´Ù. ÀÌ·± ±â´ÉÀ» ÃÑÄªÇØ¼­ Open Tools API¶ó°í Çϴµ¥ µ¨ÆÄÀÌ ¼Ò½º µð·ºÅ丮ÀÇ ToolsApi µð·ºÅ丮¿¡ º¸¸é Open Tools API¸¦ »ç¿ëÇϱâ À§ÇØ ÇÊ¿äÇÑ ¿©·¯ °³ÀÇ À¯´Ö ÆÄÀÏÀ» º¼ ¼ö ÀÖ´Ù. ÁÙ¿©¼­ OTA¶ó°í ¾ê±âÇÏ´Â Open Tools API´Â °³¹ßÀÚ·Î ÇÏ¿©±Ý µ¨ÆÄÀÌÀÇ ¿ÀºêÁ§Æ® ÀνºÆåÅÍ, ¸¶¹ý»ç, IDEÀÇ ¸Þ´º ½Ã½ºÅÛ ½ÉÁö¾î ÄÚµå ¿¡µðÅÍÀÇ ±â´É±îÁö È®ÀåÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁØ´Ù. OTA¸¦ »ç¿ëÇÏ´Â ´ëÇ¥ÀûÀÎ ÅøÀÌ ToolsFactory»çÀÇ ClassExplorer³ª Eagle Software »çÀÇ CodeRush, °ø°³·Î À¯¸íÇÑ GExpertsµîÀÌ ÀÖ´Ù. À̹ø Àý°ú ´ÙÀ½ Àý¿¡¼­´Â ÄÞÆ÷³ÍÆ® °³¹ßÀÚ¿¡°Ô ²À ÇÊ¿äÇÑ OTA ±â´É Áß¿¡ ÇϳªÀÎ ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿Í ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸°Ú´Ù.
ÇÁ·ÎÆÛƼ ¿¡µðÅÍ´Â ¿ì¸®°¡ ÆûÀ» µðÀÚÀÎÇÒ ¶§ »ç¿ëÇÏ´Â ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÆûÀ̳ª ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ¸¦ ¼³Á¤ÇÒ ¶§ »ç¿ëÇÏ´Â µ¨ÆÄÀÌ IDEÀÇ È®Àå ±â´ÉÀ» ¸»ÇÑ´Ù. ¿¹¸¦ µé¾î Color ÇÁ·ÎÆÛƼ¸¦ »ìÆì º¸¸é ¿ì¸®°¡ ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ Color ÇÁ·ÎÆÛƼ¸¦ ¼³Á¤Çϱâ À§ÇØ µå·Ó ´Ù¿î ¹öưÀ» ´©¸£¸é µå·Ó ´Ù¿î ¸®½ºÆ® ¹Ú½º°¡ ³ªÅ¸³ª°í ¼³Á¤ÇÒ ¼ö ÀÖ´Â »öÀ» »öÀÇ À̸§°ú ÇÔ²² ¸®½ºÆ®·Î º¸¿© ÁØ´Ù. ÀÌ ¸®½ºÆ®¿¡¼­ ¼³Á¤ÇÏ°í ½ÍÀº »öÀ» ¼±ÅÃÇϸé Color ÇÁ·ÎÆÛƼ¿¡´Â ¿ì¸®°¡ ¼±ÅÃÇÑ »öÀÌ ¼³Á¤µÈ´Ù. ¿©±â¼­ µå·Ó ´Ù¿î ¸®½ºÆ®¸¦ º¸¿© ÁÖ°í ¿øÇÏ´Â »öÀ» ¼±ÅÃÇÒ ¼ö ÀÖ°Ô ÇØÁÖ´Â °Í À̰ÍÀÌ ¹Ù·Î ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÌ´Ù. ¿ì¸®°¡ ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ °¢Á¾ ÇÁ·ÎÆÛƼ¸¦ ¼³Á¤ÇÒ ¶§ ¹«ÀǽÄÀûÀ¸·Î »ç¿ëÇϰí ÀÖÀ» »Ó Color, Cursor, Fontµî ±âº»ÀûÀÎ ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ¼­´Â ¿©·¯ °¡Áö ÇÁ·ÎÆÛƼ ¿¡µðÅ͵éÀÌ ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Ù. ±×·¯³ª ÀÌ¹Ì ¸¸µé¾îÁ® ÀÖ´Â ±âº» ÇÁ·ÎÆÛƼ ¿¡µðÅ͵éÀÌ »ç¿ëÀÚÀÇ ¸ðµç ¿ä±¸ »çÇ×À» ¸¸Á·½ÃÄÑ ÁÖÁö´Â ¸øÇÑ´Ù. ÇѰ¡Áö ¿¹¸¦ µéÀÚ¸é Hint ÇÁ·ÎÆÛƼ °°Àº °æ¿ì¿¡ ±âº»ÀûÀ¸·Î String ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ µ¿ÀÛÇÑ´Ù. ÇÏÁö¸¸ ÀÌ String ÇÁ·ÎÆÛƼ ¿¡µðÅÍ´Â ¿©·¯ ÁÙÀ» ÀÔ·ÂÇÒ ¼ö°¡ ¾ø´Ù. HintWindow´Â ¿©·¯ ÁÙÀ» ÀÔ·ÂÇØµµ ¾Ë¸Â°Ô À©µµ Å©±â¸¦ ¼³Á¤Çؼ­ º¸¿© ÁÙ ¼ö ÀÖÁö¸¸ ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿¡¼­ ¿©·¯ ÁÙÀ» ÀÔ·ÂÇÒ ¼ö°¡ ¾øÀ¸´Ï ºÒÆíÇÒ ¼ö ¹Û¿¡ ¾ø´Ù. ÀÌ·± °æ¿ì ³ª¸¸ÀÇ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ¸¸µé¾î¼­ ¿©·¯ ÁÙ·Î Hint¸¦ ÆíÇÏ°Ô ÀÔ·ÂÇÒ ¼ö ÀÖÀ¸¸é ÁÁÀ» °ÍÀÌ´Ù.
ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ¸¸µé·Á¸é uses Àý¿¡ dsgnintf À¯´ÖÀ» Ãß°¡ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÀÌ À¯´Ö¿¡´Â µ¨ÆÄÀ̰¡ ±âº»ÀûÀ¸·Î °¡Áö°í ÀÖ´Â ÇÁ·ÎÆÛƼ ¿¡µðÅ͵éÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù. ¾î¶² ÇÁ·ÎÆÛƼ ¿¡µðÅ͵éÀÌ ÀÖ´ÂÁö »ìÆìº¸ÀÚ.
3.3.2. ±âº» ÇÁ·ÎÆÛƼ ¿¡µðÅÍ
¾Õ¿¡¼­µµ ¾ê±âÇßÁö¸¸ µ¨ÆÄÀÌ´Â ´ëºÎºÐÀÇ µ¥ÀÌÅÍ Å¸ÀÔ¿¡ ´ëÇØ ±âº»ÀûÀÎ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ °¡Áö°í ÀÖÀ¸¸ç À̵éÀº dsgnintf.pas À¯´Ö¿¡ Á¤ÀǵǾî ÀÖ´Ù. ¸ðµç ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ ºÎ¸ð Ŭ·¡½º´Â TPropertyEditor·Î¼­ ÀÌ ¶ÇÇÑ dsgnintf.pas À¯´Ö¿¡ Á¤ÀǵǾî ÀÖ´Ù.
¾Æ·¡ ¸®½ºÆ®´Â dsgnintf.pas¿¡¼­ TPropertyEditor Ŭ·¡½ºÀÇ ¼±¾ðºÎ¸¸ ¹ßÃéÇѰÍÀÌ´Ù.

TPropertyEditor = class
private
  FDesigner: IFormDesigner;
  FPropList: PInstPropList;
  FPropCount: Integer;
  function GetPrivateDirectory: string;
  procedure SetPropEntry(Index: Integer; AInstance: TPersistent;
    APropInfo: PPropInfo);
protected
  constructor Create(const ADesigner: IFormDesigner; APropCount: Integer); virtual;
  function GetPropInfo: PPropInfo;
  function GetFloatValue: Extended;
  function GetFloatValueAt(Index: Integer): Extended;
  function GetInt64Value: Int64;
  function GetInt64ValueAt(Index: Integer): Int64;
  function GetMethodValue: TMethod;
  function GetMethodValueAt(Index: Integer): TMethod;
  function GetOrdValue: Longint;
  function GetOrdValueAt(Index: Integer): Longint;
  function GetStrValue: string;
  function GetStrValueAt(Index: Integer): string;
  function GetVarValue: Variant;
  function GetVarValueAt(Index: Integer): Variant;
  procedure Modified; 
  procedure SetFloatValue(Value: Extended);
  procedure SetMethodValue(const Value: TMethod);
  procedure SetInt64Value(Value: Int64);
  procedure SetOrdValue(Value: Longint);
  procedure SetStrValue(const Value: string);
  procedure SetVarValue(const Value: Variant);
public
  destructor Destroy; override;
  procedure Activate; virtual;
  function AllEqual: Boolean; virtual;
  function AutoFill: Boolean; virtual;
  procedure Edit; virtual;
  function GetAttributes: TPropertyAttributes; virtual;
  function GetComponent(Index: Integer): TPersistent;
  function GetEditLimit: Integer; virtual;
  function GetName: string; virtual;
  procedure GetProperties(Proc: TGetPropEditProc); virtual;
  function GetPropType: PTypeInfo;
  function GetValue: string; virtual;
  function GetVisualValue: string;
  procedure GetValues(Proc: TGetStrProc); virtual;
  procedure Initialize; virtual;
  procedure Revert;
  procedure SetValue(const Value: string); virtual;
  function ValueAvailable: Boolean;
  procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas;
    var AWidth: Integer); dynamic;
  procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas;
    var AHeight: Integer); dynamic;
  procedure ListDrawValue(const Value: string; ACanvas: TCanvas;
    const ARect: TRect; ASelected: Boolean); dynamic;
  procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect;
    ASelected: Boolean); dynamic;
  procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect;
    ASelected: Boolean); dynamic;
  property Designer: IFormDesigner read FDesigner;
  property PrivateDirectory: string read GetPrivateDirectory;
  property PropCount: Integer read FPropCount;
  property Value: string read GetValue write SetValue;
end;


ÇÁ·ÎÆÛƼ ¿¡µðÅÍ´Â ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ¼±ÅÃµÈ Çϳª ¶Ç´Â ±× ÀÌ»óÀÇ ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ¸¦ Á¶ÀÛÇÑ´Ù. ¿ÀºêÁ§Æ® ÀνºÆåÅÍ´Â ÄÞÆ÷³ÍÆ®°¡ ¼±ÅÃµÇ¸é ±× ÄÞÆ÷³ÍÆ®ÀÇ Published ¿µ¿ª¿¡ ¼±¾ðµÈ ÇÁ·ÎÆÛƼ ¸®½ºÆ®¸¦ ±¸ÇÏ°í °¢ ÇÁ·ÎÆÛƼÀÇ µ¥ÀÌÅÍ Å¸ÀÔ¿¡ µû¶ó µî·ÏµÈ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ý¼ºÇÑ´Ù. TPropertyEditorÀÇ GetName°ú GetValue ÇÔ¼ö´Â ¿ÀºêÁ§Æ® ÀνºÆåÅͰ¡ ÇÁ·ÎÆÛƼÀÇ À̸§°ú ÇöÀç °ªÀ» ÀÐÀ» ¶§ È£ÃâµÇ¸ç SetValue´Â »ç¿ëÀÚ°¡ ÇÁ·ÎÆÛƼÀÇ °ªÀ» º¯°æÇÒ ¶§ È£ÃâµÈ´Ù. Edit ÇÔ¼ö´Â ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÇÁ·ÎÆÛƼ¸¦ ´õºí Ŭ¸¯Çϸé È£ÃâµÇ¸ç GetValues ¸Þ¼Òµå´Â ¿­°ÅÇü ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ µå·Ó ´Ù¿î ¸®½ºÆ®¸¦ º¸¿© ÁÙ ¶§ È£ÃâµÈ´Ù. AllEqual ¸Þ¼Òµå´Â Çϳª ÀÌ»óÀÇ ÄÞÆ÷³ÍÆ®°¡ ¼±ÅõǾúÀ» ¶§ °°Àº ÇÁ·ÎÆÛƼ °ªÀ» º¸¿© ÁÙÁö¸¦ °áÁ¤ÇÒ ¶§ È£ÃâµÈ´Ù.
¾Æ·¡ Ç¥´Â µ¨ÆÄÀÌ¿¡¼­ ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ °èÃþ ±¸Á¶¿Í °£´ÜÇÑ ¼³¸íÀ» ´ã°í ÀÖ´Ù.

Ç¥ 3-2 µ¨ÆÄÀÌ¿¡¼­ ±âº»ÀûÀ¸·Î Á¦°øÇÏ´Â ÇÁ·ÎÆÛƼ ¿¡µðÅÍ
ÇÁ·ÎÆÛƼ ¿¡µðÅͼ³¸í
TPropertyEditor¸ðµç ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ ºÎ¸ð Ŭ·¡½º
TordinalProperty¼­¼öÇü ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ ºÎ¸ð Ŭ·¡½º·Î¼­ AllEqual ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ¼­ ¼±ÅÃµÈ ÄÞÆ÷³ÍÆ®°¡ ¿©·¯ °³ÀÏ °æ¿ì °°Àº ÇÁ·ÎÆÛƼ °ªÀ» º¸¿© ÁÙÁö¸¦ °áÁ¤ÇØ ÁÖ¾î¾ß ÇÑ´Ù.
TCharPropertyChar ³ª 'A'..'Z' µî°ú °°Àº ¹®ÀÚÇü ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅÍ
TEnumProperty¿­°ÅÇü ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅͷμ­ GetValues ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ¼­ µå·Ó ´Ù¿î ¸®½ºÆ®¿¡ ³ªÅ¸³¯ Ç׸ñÀ» Á¦°øÇØÁÖ¾î¾ß ÇÑ´Ù.
TBoolPropertyBoolean Çü ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅÍ
TBrushStylePropertyTBrush °´Ã¼ÀÇ Style ÇÁ·ÎÆÛƼ ¿¡µðÅÍ
TPenStylePropertyTPen °´Ã¼ÀÇ Style ÇÁ·ÎÆÛƼ ¿¡µðÅÍ
TIntegerPropertyLongInt, Integer, Word µîÀÇ Á¤¼öÇü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TColorPropertyTColor Çü ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅÍ
TCursorPropertyTCursor Çü ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅÍ
TFontCharsetPropertyTFont °´Ã¼ÀÇ CharSet ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TModalResultPropertyTModalResult Çü ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅÍ
TTabOrderPropertyTabOrder ÇÁ·ÎÆÛƼÀÇ ±âº» ¿¡µðÅÍ
TSetpropertyÁýÇÕÇü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ ÁýÇÕÀÇ °¢ ¿ä¼Ò¸¦ Boolean ÇüÀ¸·Î ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁØ´Ù.
TShortCutPropertyShortCut ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ Á÷Á¢ ´ÜÃà۸¦ ÀÔ·ÂÇϰųª ¸®½ºÆ®¿¡¼­ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.
TStringProperty¹®ÀÚ¿­ ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TCaptionpropertyCaptionÀ̳ª Text ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TComponentNamePropertyName ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TFontNamePropertyTFont °´Ã¼ÀÇ FontName ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ À©µµ ½Ã½ºÅÛ¿¡ ¼³Ä¡µÈ ±Û²Ã ¸®½ºÆ®¸¦ º¸¿©ÁÖ°í ¼±ÅÃÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
TImeNamePropertyTImeName Çü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TMPFilenamePropertyTMediaPlayer °´Ã¼ÀÇ FileName ÇÁ·ÎÆÛƼ¸¦ Á¶ÀÛÇϱâ À§ÇÑ ¿¡µðÅͷμ­ Media ÆÄÀÏÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Â ´ëÈ­ »óÀÚ¸¦ º¸¾ß ÁØ´Ù.
TClassProperty¸ðµç °´Ã¼¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ ÇÁ·ÎÆÛƼ °ªÀ» Á÷Á¢ Á¶ÀÛÇÒ ¼ö´Â ¾øÁö¸¸ Ŭ·¡½ºÀÇ À̸§À» º¸¿© ÁÖ¸ç ºÎ ÇÁ·ÎÆÛƼ·Î¼­ °´Ã¼°¡ °¡Áö°í ÀÖ´Â ÇÁ·ÎÆÛƼ¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ°Ô ÇØ ÁØ´Ù.
TFontPropertyTFont Çü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ ±Û°ñ ¼±Åà ´ëÈ£»óÀÚ¸¦ º¸¿© Áְųª TFont °´Ã¼ÀÇ ÇÁ·ÎÆÛƼ¸¦ ºÎ ÇÁ·ÎÆÛƼ·Î Á¶ÀÛÇÒ ¼ö ÀÖ°Ô ÇØ ÁØ´Ù.
TNestedPropertyºÎ¸ðÀÇ Designer, PropList, PropCount¸¦ »ç¿ëÇÏ´Â ÇÁ·ÎÆÛƼ ¿¡µðÅͷμ­ TSetElementProperty °°Àº ¿¡µðÅͰ¡ »ç¿ëÇÑ´Ù.
TSetElementPropertyÁýÇÕÇü ÇÁ·ÎÆÛƼÀÇ °¢ ¿ä¼Ò¸¦ ³ªÅ¸³»´Â ºÎ ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ¿¡µðÅͷμ­ GetName ¸Þ¼Òµå´Â ÇÁ·ÎÆÛƼÀÇ À̸§´ë½Å ¿ä¼ÒÀÇ À̸§À» ¹ÝȯÇϰí Get/SetValue ¸Þ¼Òµå´Â °¢ ¿ä¼ÒÀÇ »óŸ¦ Á¶ÀÛÇϸç ÀÌ ¿¡µðÅÍ´Â TSetProperty ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿¡ ÀÇÇØ¼­ »ý¼ºµÈ´Ù.
TComponentPropertyTComponent Çü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇÏ´Â °ÍÀÌ ¾Æ´Ï°í ´Ù¸¥ ÄÞÆ÷³ÍÆ®¸¦ °¡¸®Å°µµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. Áï ´Ù¸¥ ÄÞÆ÷³ÍÆ®ÀÇ À̸§À» Á÷Á¢ ÀÔ·ÂÇϰųª ÇüÀÌ È£È¯µÇ´Â ÄÞÆ÷³ÍÆ® ¸®½ºÆ®¸¦ º¸¿© ÁÖ°í ÀÌ ¸®½ºÆ®¿¡¼­ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ÇØ ÁØ´Ù.
TFloatPropertyFloat, Single, Double µîÀÇ ½Ç¼öÇü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TInt64PropertyInt64 Çü ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅÍ
TMethodProperty¸ðµç ¸Þ¼Òµå ÇÁ·ÎÆÛƼ¿¡ ´ëÇÑ ±âº» ¿¡µðÅͷμ­ ÁÖ·Î À̺¥Æ® ÇÁ·ÎÆÛƼ¿¡ »ç¿ëµÈ´Ù.
TDatePropertyTDateTimeÀÇ ³¯ÀÚ ºÎºÐÀ» ÆíÁýÇϱâ À§ÇÑ ¿¡µðÅÍ
TTimePropertyTDateTimeÀÇ ½Ã°£ ºÎºÐÀ» ÆíÁýÇϱâ À§ÇÑ ¿¡µðÅÍ
TDateTimePropertyTDateTime Çü ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ ³¯ÀÚ¿Í ½Ã°£À» °°ÀÌ Á¶ÀÛÇϱâ À§ÇÑ ¿¡µðÅÍ


À§ÀÇ Ç¥¿¡¼­ ¾ð±ÞÇÑ ÇÁ·ÎÆÛƼ ¿¡µðÅÍ À̿ܿ¡µµ µ¨ÆÄÀÌ ¼Ò½º µð·ºÅ丮ÀÇ Property Editors µð·ºÅ丮¿¡ º¸¸é ±âº» ¿¡µðÅ͵éÀ» È®ÀåÇÑ ´Ù¾çÇÑ ¿¡µðÅÍ(TStringListProperty, TFieldLinkProperty, TPictureProperty, TGraphicProperty µî)µéÀÌ Á¤ÀǵǾî ÀÖÀ¸´Ï ÂüÁ¶Çϱ⠹ٶõ´Ù.
3.3.3. »õ ÇÁ·ÎÆÛƼ ¿¡µðÅÍ ¸¸µé±â
»õ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ¸¸µå´Â °ÍÀº TPropertyEditor Ŭ·¡½º³ª ±âº» ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ºÎ¸ð Ŭ·¡½º·Î »õ·Î¿î ÆÄ»ý Ŭ·¡½º¸¦ ¸¸µå´Â ÀÛ¾÷ÀÌ´Ù. µû¶ó¼­ »õ·Î ¸¸µé ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ Á¶ÀÛÇÏ°Ô µÉ ÇÁ·ÎÆÛƼÀÇ Çü¿¡ µû¶ó TPropertyEditor Ŭ·¡½º¿¡¼­ °¡»óÀ¸·Î ¼±¾ðµÈ ¸Þ¼Òµå¸¦ ÀûÀýÇÏ°Ô ¿À¹ö¶óÀ̵å ÇØÁÖ¸é µÈ´Ù.
¸ÕÀú »õ·Î¿î ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ¸¸µé±â À§Çؼ­ ¾Ë¾Æ¾ß ÇÒ TPropertyEditor Ŭ·¡½º¿¡¼­ Á¦°øÇÏ´Â ¸Þ¼Òµå¿Í ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸ÀÚ.

Ç¥ 3-3 TPropertyEditorÀÇ ¸Þ¼Òµå
¸Þ¼Òµå¼³¸í
Activate¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÇÁ·ÎÆÛƼ°¡ ¼±ÅõǸé È£ÃâµÈ´Ù.
AllEqual¿©·¯ °³ÀÇ ÄÞÆ÷³ÍÆ®°¡ µ¿½Ã¿¡ ¼±ÅÃµÉ ¶§¸¶´Ù È£ÃâµÈ´Ù. ÀÌ ÇÔ¼ö°¡ ÂüÀ» ¹ÝȯÇϸé GetValue ¸Þ¼Òµå°¡ È£ÃâµÇ°í ±×·¸Áö ¾ÊÀ¸¸é ÇÁ·ÎÆÛƼ °ªÀº ºñ¾î ÀÖ°Ô µÈ´Ù. ÀÌ ¸Þ¼Òµå´Â GetAttributes ¸Þ¼Òµå°¡ paMultiSelect Ç÷¡±×¸¦ ¹ÝÈ¯ÇØ¾ßÁö¸¸ È£ÃâµÈ´Ù.
AutoFillGetAttributes ¸Þ¼ÒµåÀÇ ¹Ýȯ °ª¿¡ paValueList Ç÷¡±×°¡ ÀÖÀ» °æ¿ì¿¡¸¸ È£ÃâµÇ´Âµ¥ GetValues ¸Þ¼Òµå¸¦ ÅëÇØ¼­ ±¸ÇØÁø ¸®½ºÆ®¿¡¼­ ¿ÀºêÁ§Æ® ¤·´Ï½ºÆåÅͰ¡ ÀÚµ¿À¸·Î ´ÙÀ½ °ªÀ» ¼±ÅÃÇÒ Áö¸¦ °áÁ¤ÇÒ ¶§ È£ÃâµÈ´Ù.
Edit¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÇÁ·ÎÆÛƼ°¡ ´õºí Ŭ¸¯µÇ°Å³ª '...' ¹öưÀÌ ´­·¯Áö¸é È£ÃâµÈ´Ù. Font ÇÁ·ÎÆÛƼó·³ ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇÒ ¶§ ´ëÈ­ »óÀÚ¸¦ »ç¿ëÇÏ·Á¸é ÀÌ ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ¾ß ÇÑ´Ù.
GetAttributesÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ ¼º°ÝÀ» ³ªÅ¸³»´Â ÁýÇÕ(TPropertyAttributes)À» ¹ÝȯÇÏ¸ç »ç¿ë °¡´ÉÇÑ Ç÷¡±×´Â ¾Æ·¡¿¡ º°µµÀÇ Ç¥·Î ³ªÅ¸³»¾ú´Ù.
GetComponentÇöÀç ÆíÁý ÁßÀÎ ÄÞÆ÷³ÍÆ®¸¦ ¹ÝȯÇÑ´Ù. ÇϳªÀÇ ÄÞÆ÷³ÍÆ®¸¦ ÆíÁýÁßÀ̸é ÀÎÀÚ·Î 0À» ÀÔ·ÂÇÑ´Ù.
GetEditLimit¿ÀºêÁ§Æ® ÀνºÆåÅÍÀÇ ÀÔ·Â ¹Ú½º¿¡¼­ Çã¿ëÇÏ´Â ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ¼³Á¤ÇÏ¸ç ±âº»°ªÀº 255ÀÌ´Ù.
GetNameÇÁ·ÎÆÛƼÀÇ À̸§À» ¹ÝȯÇÑ´Ù.
GetPropertiesGetAttributes ¸Þ¼ÒµåÀÇ ¹Ýȯ°ª¿¡ paSubProperties Ç÷¡±×°¡ ÀÖÀ¸¸é »ç¿ë °¡´ÉÇÑ ºÎ ÇÁ·ÎÆÛƼ ¸®½ºÆ®¸¦ ±¸Çϱâ À§Çؼ­ ÀÌ ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.
GerPropTypeÆíÁý ÁßÀÎ ÇÁ·ÎÆÛƼÀÇ Çü Á¤º¸(Type Information)¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.
GetValueÇÁ·ÎÆÛƼÀÇ ÇöÀç °ªÀ» ¹®ÀÚ¿­·Î ¹ÝȯÇÑ´Ù. ±âº»°ªÀº '(unknown)' ÀÌ´Ù.
GetValuesGetAttributes ¸Þ¼ÒµåÀÇ ¹Ýȯ °ª¿¡ paValueList Ç÷¡±×°¡ ÀÖÀ¸¸é È£ÃâµÇ¸ç ÀÌ ÇÁ·ÎÆÛƼ°¡ °¡Áú ¼ö ÀÖ´Â °¢ ¿ä¼Ò °ª¿¡ ´ëÇØ Proc ÇÁ·Î½ÃÀú¸¦ È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù.
InitializeÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ »ý¼ºµÈ ÈÄ »ç¿ëµÇ±â Àü¿¡ È£ÃâµÈ´Ù.
SetValueÇÁ·ÎÆÛƼÀÇ ÇöÀç °ªÀ» ¼³Á¤ÇÑ´Ù. ÇÁ·ÎÆÛƼ ¿¡µðÅÍ´Â ÀÌ ¸Þ¼ÒµåÀÇ ÀÎÀÚ·Î µé¾î ¿À´Â ¹®ÀÚ¿­À» ÇÁ·ÎÆÛƼÀÇ µ¥ÀÌÅÍ Çü¿¡ ¸Â°Ô º¯È¯Çؼ­ SetXXXValue ¸Þ¼Òµå¸¦ È£ÃâÇØ ÁÖ¸é µÈ´Ù.
ListMeasureWidth*µå·Ó ´Ù¿î ¸®½ºÆ®¸¦ ±×¸®±â À§ÇØ ¸®½ºÆ®ÀÇ ÆøÀ» ¾òÀ» ¶§ È£ÃâµÈ´Ù.
ListMeasureHeight*µå·Ó ´Ù¿î ¸®½ºÆ®¸¦ ±×¸®±â À§ÇØ ¸®½ºÆ®¿¡¼­ÀÇ °¢ ¾ÆÀÌÅÛÀÇ ³ôÀ̸¦ ±¸ÇÒ ¶§ È£ÃâµÈ´Ù. TListBoxÀÇ MeasureItem°ú À¯»çÇÏ´Ù.
ListDrawValue*µå·Ó ´Ù¿î ¸®½ºÆ®ÀÇ °¢ ¾ÆÀÌÅÛÀ» ±×¸± ¶§ È£ÃâµÇ¸ç TListBoxÀÇ DrawItem°ú À¯»çÇÏ´Ù.
PropDrawName*¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÇÁ·ÎÆÛƼ À̸§À» º¸¿©ÁÖ´Â Ä÷³ÀÌ ±×·ÁÁú ¶§ È£ÃâµÈ´Ù.
PropDrawValue*¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÇÁ·ÎÆÛƼÀÇ °ªÀ» º¸¿©ÁÖ´Â Ä÷³ÀÌ ±×·ÁÁú ¶§ È£ÃâµÈ´Ù.


* : µ¨ÆÄÀÌ 5.0¿¡¼­ »õ·Î »ý±ä ¸Þ¼ÒµåÀÌ¸ç ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ÇÁ·ÎÆÛƼ¸¦ ³ªÅ¸³»´Â ¹æ¹ýÀ» Ä¿½ºÅ͸¶ÀÌÁîÇÒ ¶§ »ç¿ëÇÑ´Ù.

Ç¥ 3-4 TPropertyEditorÀÇ ÇÁ·ÎÆÛƼ
ÇÁ·ÎÆÛƼ¼³¸í
DesignerÆû µðÀÚÀÌ³Ê °´Ã¼
PrivateDirectory"HKEY_CURRENT_USER\Software\Borland\Delphi\*\Globals\PrivateDir"À§ÀÇ ·¹Áö½ºÆ®¸® Ű¿¡ ÁöÁ¤µÈ ÀÛ¾÷ µð·ºÅ丮¸¦ ³ªÅ¸³»¸ç ¸¸¾à ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ Àӽà ÆÄÀÏÀ» »ý¼ºÇϰí ÀúÀåÇÒ Çʿ䰡 ÀÖÀ¸¸é ÀÌ µð·ºÅ丮¸¦ ÀÌ¿ëÇØ¾ß ÇÑ´Ù.




Ç¥ 3-5 TPropertyAttributes Ç÷¡±×
Ç÷¡±×¼³¸í
paValueListÀÌ Ç÷¡±×´Â ÇÁ·ÎÆÛƼ °ªÀ» µå·Ó ´Ù¿î ¸®½ºÆ®·Î ÆíÁýÇÏ°í ½ÍÀ» ¶§ ¼³Á¤ÇÑ´Ù. ÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é GetValues ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.
paSortListÀÌ Ç÷¡±×´Â ¿ÀºêÁ§Æ® ÀνºÆåÅͰ¡ GetValues·Î ±¸ÇØÁø ¸®½ºÆ®¸¦ Á¤·ÄÇϵµ·Ï ÇÒ ¶§ ¼³Á¤ÇÑ´Ù.
paSubPropertiesÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ ºÎ ÇÁ·ÎÆÛƼ¸¦ °¡Áö°í ÀÖÀ½À» ³ªÅ¸³½´Ù. ÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¾î ÀÖÀ¸¸é »ç¿ë °¡´ÉÇÑ ºÎ ÇÁ·ÎÆÛƼ ¸®½ºÆ®¸¦ ±¸Çϱâ À§ÇØ GetProperties ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.
paDialogÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇÒ ¶§ ´ëÈ­ »óÀÚ¸¦ »ç¿ëÇÒ °ÍÀÓÀ» ³ªÅ¸³½´Ù. ÀÌ Ç÷¡±×°¡ ¼³Á¤µÇ¸é ¿ÀºêÁ§Æ® ÀνºÆåÅÍ´Â '¡¦' ¹öưÀ» »ý¼ºÇϸç ÀÌ ¹öưÀ» ´©¸£¸é Edit ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.
paMultiSelect¿©·¯ °³ÀÇ ÄÞÆ÷³ÍÆ®°¡ ¼±ÅõǾúÀ» ¶§ ÇÁ·ÎÆÛƼ °ªÀ» ³ªÅ¸³¾ Áö¸¦ °áÁ¤ÇÑ´Ù.
paAutoUpdateÇÁ·ÎÆÛƼ °ªÀÌ ¿ÏÀüÈ÷ ÀÔ·ÂÀÌ µÇÁö ¾Ê¾Ò¾îµµ SetValue ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù. Caption ÇÁ·ÎÆÛƼó·³ ¿£Å͸¦ Ä¡Áö ¾Ê¾Æµµ °ªÀÌ ¹Ý¿µµÇµµ·Ï ÇÏ°í ½ÍÀ» ¶§ »ç¿ëÇÑ´Ù.
paReadOnly»ç¿ëÀÚ°¡ ÇÁ·ÎÆÛƼ °ªÀ» º¯°æÇÏÁö ¸øÇϵµ·Ï Àбâ Àü¿ëÀ¸·Î ¸¸µç´Ù.
paRevertableÀÌ Ç÷¡±×´Â ÇÁ·ÎÆÛƼ °ªÀÌ ¿ø·¡ÀÇ °ªÀ¸·Î º¹¿øµÉ ¼ö ÀÖ´ÂÁö¸¦ ³ªÅ¸³½´Ù.


ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿¡¼­ ¸ðµç ÇÁ·ÎÆÛƼ´Â ¹®ÀÚ¿­·Î Ç¥ÇöµÈ´Ù. ¿ÀºêÁ§Æ® ÀνºÆåÅͰ¡ ÇÁ·ÎÆÛƼÀÇ ½ÇÁ¦ µ¥ÀÌÅÍ Çü°ú »ó°ü¾øÀÌ ÇÁ·ÎÆÛƼÀÇ °ªÀ» Àаųª º¯°æÇÒ ¶§ Value ÇÁ·ÎÆÛƼ(GetValue/SetValue ¸Þ¼Òµå)¸¦ ÂüÁ¶Çϱ⠶§¹®¿¡ »õ·Î ¸¸µå´Â ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿¡¼­´Â GetValue/SetValue ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ¼­ ½ÇÁ¦ ÇÁ·ÎÆÛƼÀÇ µ¥ÀÌÅÍ Çü¿¡ µû¶ó ÀûÀýÇÏ°Ô º¯È¯ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·¸°Ô º¯È¯µÈ °ªÀ» ½ÇÁ¦·Î Àû¿ëÇÒ ¶§´Â protected ¸â¹öÀÎ GetXXXValue, SetXXXValue ¸Þ¼Òµå¸¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î TIntegerProperty °°Àº °æ¿ì¿¡´Â ¾Æ·¡¿Í °°ÀÌ Á¤ÀǵǾî ÀÖ´Ù.

TIntegerProperty = class(TOrdinalProperty)
  public
    function GetValue: string; override;
    procedure SetValue(const Value: string); override;
  end;

function TIntegerProperty.GetValue: string;
begin
  with GetTypeData(GetPropType)^ do
    if OrdType = otULong then // unsigned
      Result := IntToStr(Cardinal(GetOrdValue))
    else
      Result := IntToStr(GetOrdValue);
end;

procedure TIntegerProperty.SetValue(const Value: String);

  procedure Error(const Args: array of const);
  begin
    raise EPropertyError.CreateResFmt(@SOutOfRange, Args);
  end;

var
  L: Int64;
begin
  L := StrToInt64(Value);
  with GetTypeData(GetPropType)^ do
    if OrdType = otULong then
    begin   // unsigned compare and reporting needed
      if (L < Cardinal(MinValue)) or (L > Cardinal(MaxValue)) then
        // bump up to Int64 to get past the %d in the format string
        Error([Int64(Cardinal(MinValue)), Int64(Cardinal(MaxValue))]);
    end
    else if (L < MinValue) or (L > MaxValue) then
      Error([MinValue, MaxValue]);
  SetOrdValue(L);
end;


TIntegerPropertyÀÇ °æ¿ì TPropertyEditorÀÇ GetValue, SetValue ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇØ ÁÖ°í GetValue ¸Þ¼Òµå´Â GetOrdValue ¸Þ¼Òµå¸¦ È£ÃâÇØ¼­ ½ÇÁ¦ °ªÀ» ¾ò¾î ¿Â ´ÙÀ½ IntToStr ÇÔ¼ö·Î ¹®ÀÚ¿­·Î º¯È¯Çؼ­ ¹ÝȯÇϰí ÀÖ°í SetValue ¸Þ¼Òµå´Â StrToInt64 ÇÔ¼ö·Î ¹®ÀÚ¿­À» Á¤¼ö·Î º¯È¯ÇÑ ´ÙÀ½ SetOrdValue ¸Þ¼Òµå·Î ÇÁ·ÎÆÛƼ °ªÀ» º¯°æÇϰí ÀÖ´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù.

TPropertyEditor Ŭ·¡½ºÀÇ Edit ¸Þ¼Òµå´Â ¿ÀºêÁ§Æ® ÀνºÆåÅÍÀÇ '¡¦' ¹öưÀ̳ª ÇÁ·ÎÆÛƼ ÆíÁý âÀ» ´õºí Ŭ¸¯Çϸé È£ÃâµÇ¸ç ÁÖ·Î ´ëÈ­»óÀÚ¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·ÎÆÛƼ °ªÀ» ÆíÁýÇÒ ¶§ »ç¿ëÇÑ´Ù. ´ëÈ­ »óÀÚ¸¦ »ç¿ëÇϸé ÅØ½ºÆ®·Î ÆíÁýÇÏ´Â °Íº¸´Ù Á» ´õ ½±°í ½Ã°¢ÀûÀ¸·Î ÇÁ·ÎÆÛƼ °ªÀ» ÆíÁýÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ëÈ­»óÀÚ¸¦ ÀÌ¿ëÇÏ´Â ÇÁ·ÎÆÛƼÀÇ ´ëÇ¥ÀûÀÎ ¿¹·Î Font, Color, TMemo ÄÞÆ÷³ÍÆ®ÀÇ Lines ÇÁ·ÎÆÛƼ µîÀ» µé ¼ö ÀÖ´Ù. Edit ¸Þ¼Òµå°¡ ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡ ÀÇÇØ¼­ È£ÃâµÇµµ·Ï ÇÏ·Á¸é GetAttributes ¸Þ¼ÒµåÀÇ ¹Ýȯ°ª¿¡ paDialog Ç÷¡±×°¡ ÀÖ¾î¾ß ÇÑ´Ù. TFontProperty ¿¡µðÅÍ´Â ¾Æ·¡ ÄÚµå¿Í °°ÀÌ ´ëÈ­ »óÀÚ¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·ÎÆÛƼ °ªÀ» ¼³Á¤Çϵµ·Ï µÇ¾î ÀÖ´Ù.

type
  TFontProperty = class(TClassProperty)
  public
    procedure Edit; override;
    function GetAttributes: TPropertyAttributes; override;
  end;

procedure TFontProperty.Edit;
var
  FontDialog: TFontDialog;
begin
  FontDialog := TFontDialog.Create(Application);
  try
    FontDialog.Font := TFont(GetOrdValue);
    FontDialog.HelpContext := hcDFontEditor;
    FontDialog.Options := FontDialog.Options + [fdShowHelp, fdForceFontExist];
    if FontDialog.Execute then SetOrdValue(Longint(FontDialog.Font));
  finally
    FontDialog.Free;
  end;
end;

function TFontProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paMultiSelect, paSubProperties, paDialog, paReadOnly];
end;


¸¸¾à¿¡ ÇÁ·ÎÆÛƼÀÇ °ªÀ» µå·Ó ´Ù¿î ¸®½ºÆ®·Î ¿©·¯ °¡Áö ¼³Á¤ °¡´ÉÇÑ °ª Áß¿¡¼­ ¼±ÅÃÇϵµ·Ï ÇÏ°í ½ÍÀ¸¸é GetValues ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ¾ß Çϸç GetAttributes ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ¼­ paValueList Ç÷¡±×¸¦ ¹ÝȯÇϵµ·Ï ÇØ¾ß ÇÑ´Ù. paValueList Ç÷¡±×°¡ GetAttributesÀÇ ¹Ýȯ°ª¿¡ ÀÖÀ¸¸é ¿ÀºêÁ§Æ® ÀνºÆåÅÍ´Â ÇÁ·ÎÆÛƼ ÆíÁý ¹Ú½º¿¡ ÀÛÀº È­»ìÇ¥ ¹öưÀ» ¸¸µé¾î ÁÖ¸ç ÀÌ ¹öưÀ» »ç¿ëÀÚ°¡ ´©¸£¸é µå·Ó ´Ù¿î ¸®½ºÆ®°¡ ÆîÃÄÁ®¼­ ÇÁ·ÎÆÛƼ °ªÀ» ¼±ÅÃÇÒ ¼ö ÀÖ°Ô µÈ´Ù.
GetValues ¸Þ¼Òµå´Â ÇϳªÀÇ ÀÎÀÚ¸¦ °¡Áö´Âµ¥ ÀÌ ÀÎÀÚ´Â ¸Þ¼Òµå Æ÷ÀÎÅÍÀÌ´Ù. ÀÌ ¸Þ¼Òµå Æ÷ÀÎÅÍ´Â ½ÇÁ¦·Î ¸®½ºÆ®¸¦ °¡Áö°í ÀÖÀ» ³»ºÎ ¸®½ºÆ®(TStrings)ÀÇ Add ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù. GetValues °¡ È£ÃâµÉ ¶§ ÀÌ ³»ºÎ ¸®½ºÆ®´Â ºñ¾î ÀÖ°Ô µÇ¸ç GetValues ¸Þ¼Òµå¿¡¼­ »ç¿ë °¡´ÉÇÑ °ªÀ» Ãß°¡ÇØ ÁÖ¾î¾ß ÇÑ´Ù. TFontNameProperty ¿¡µðÅÍÀÇ GetValues ¸Þ¼Òµå¸¦ »ìÆì º¸¸é ÀÌ ÀÛ¾÷ÀÌ ¾î¶»°Ô ÀÌ·ç¾î Áö´ÂÁö ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù.

type
  TFontNameProperty = class(TStringProperty)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure GetValues(Proc: TGetStrProc); override;
    { »ý·« }
  end;
  
function TFontNameProperty.GetAttributes: TPropertyAttributes;
begin
  Result := [paMultiSelect, paValueList, paSortList, paRevertable];
end;

procedure TFontNameProperty.GetValues(Proc: TGetStrProc);
var
  I: Integer;
begin
  for I := 0 to Screen.Fonts.Count - 1 do Proc(Screen.Fonts[I]);
end;


3.3.4. ÇÁ·ÎÆÛƼ ¿¡µðÅÍ µî·Ï
ÄÞÆ÷³ÍƮó·³ ¿ÀºêÁ§Æ® ÀνºÆåÅͰ¡ »õ·Î ¸¸µç ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇϵµ·Ï ÇÏ·Á¸é µî·ÏÀ» ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ µ¨ÆÄÀÌ IDE¿¡ µî·ÏÇϱâ À§Çؼ­´Â RegisterPropertyEditor ÇÁ·Î½ÃÀú¸¦ ÀÌ¿ëÇϸç dsgnintf.pas À¯´Ö¿¡ ¾Æ·¡¿Í °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

procedure RegisterPropertyEditor(PropertyType: PTypeInfo; ComponentClass: TClass;
  const PropertyName: string; EditorClass: TPropertyEditorClass);


ù¹øÂ° ÀÎÀÚ PropertyTypeÀº ÇÁ·ÎÆÛƼÀÇ µ¥ÀÌÅÍ Çü Á¤º¸¿¡ ´ëÇÑ Æ÷ÀÎÅͷμ­ ¾Õ¿¡¼­ ¾ê±âÇÑ GetEnumNameÀ̳ª GetEnumValue ÇÔ¼öó·³ TypeInfo ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ±¸ÇÒ ¼ö ÀÖ´Ù.
µÎ¹øÂ° ÀÎÀÚ ComponentClass´Â µî·ÏÇÏ´Â ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ Àû¿ë ¹üÀ§¸¦ °áÁ¤ÇÏ´Â °ÍÀ¸·Î¼­ ƯÁ¤ ÄÞÆ÷³ÍÆ® Ŭ·¡½º¸¦ ÀÔ·ÂÇϸé ÇØ´ç ÄÞÆ÷³ÍÆ®ÀÇ ÁöÁ¤ ÇÁ·ÎÆÛƼ¿¡¸¸ ÀÌ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇϵµ·Ï ÇÑ´Ù. ÇÏÁö¸¸ nil °ªÀ» ÀÔ·ÂÇÏ¸é ¸ðµç ÄÞÆ÷³ÍÆ®ÀÇ PropertType ÇüÀ» °¡Áö´Â ¸ðµç ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ ÀÌ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇϵµ·Ï ÇÑ´Ù. Áï ¼¼¹øÂ° ÀÎÀÚÀÎ PropertyNameÀ» ¹«½ÃÇÏ°Ô µÈ´Ù. ¼¼¹øÂ° ÀÎÀÚÀÎ PropertyNameÀº µÎ¹øÂ° ÀÎÀÚ°¡ nilÀÌ ¾Æ´Ò °æ¿ì¿¡ ÀÌ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇÒ ÇÁ·ÎÆÛƼÀÇ À̸§À» ÀÔ·ÂÇØ ÁØ´Ù. PropertyName¿¡ ºó ¹®ÀÚ¿­('')À» ÀÔ·ÂÇϸé ComponentClass¿¡¼­ PropertyTypeÀ» °¡Áö´Â ¸ðµç ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ Àû¿ëµÈ´Ù. ³×¹øÂ° ÀÎÀÚ´Â µî·ÏÇÒ ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ Å¬·¡½º ÇüÀ» ÀÔ·ÂÇÑ´Ù.
¿¹¸¦ µé¾î º¸ÀÚ.

RegisterPropertyEditor(TypeInfo(string), nil, '', TdpbHintProperty);


ÀÌ·¸°Ô µî·ÏÇÏ¸é ¸ðµç ÄÞÆ÷³ÍÆ®ÀÇ string Çü ÇÁ·ÎÆÛƼ´Â ¸ðµÎ TdpbHintProperty¸¦ »ç¿ëÇϵµ·Ï µî·ÏÇÑ´Ù. ÇÏÁö¸¸ ¾Æ·¡¿Í °°ÀÌ µî·ÏÇϸé

RegisterPropertyEditor(TypeInfo(string), TControl, 'Hint', TdpbHintProperty);


TControl Ŭ·¡½º³ª ±× ÀÚ¼Õ Å¬·¡½ºµéÀÇ string Çü ÇÁ·ÎÆÛƼ Áß Hint ¶ó´Â À̸§À» °¡Áø ÇÁ·ÎÆÛƼ¿¡ ´ëÇØ TdpbHintProperty ¿¡µðÅ͸¦ »ç¿ëÇϵµ·Ï ÇÑ´Ù.
ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ µî·ÏÇÒ ¶§ ÁÖÀÇÇÒ °ÍÀº ¾Æ·¡¿Í °°ÀÌ µ¿½Ã¿¡ µî·ÏÇÑ °æ¿ì¿¡ Áï ÇϳªÀÇ ÇÁ·ÎÆÛƼ¿¡ ¿©·¯ °³ÀÇ ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ µî·ÏµÉ °æ¿ì ¿ÀºêÁ§Æ® ÀνºÆåÅͰ¡ ¾î¶² ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇϴ°¡ÀÌ´Ù.

RegisterPropertyEditor(TypeInfo(string), nil, '', TStringProperty);
RegisterPropertyEditor(TypeInfo(string), TAnimate, 'FileName', TMPFileNameProperty);


¿ÀºêÁ§Æ® ÀνºÆåÅÍ´Â µî·ÏµÈ ¿¡µðÅÍ Áß Àû¿ë ¹üÀ§°¡ °¡Àå Á¦ÇÑµÈ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇϸç Àû¿ë ¹üÀ§°¡ °°À» °æ¿ì¿¡´Â Á¦ÀÏ ¸¶Áö¸·¿¡ µî·ÏµÈ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ »ç¿ëÇÑ´Ù. Áï À§¿Í °°Àº °æ¿ì ù¹øÂ° ¹®Àå¿¡¼­ TAnimateÀÇ FileName ÇÁ·ÎÆÛƼ´Â TStringProperty·Î µî·ÏµÇ¾ú´Ù°¡ µÎ¹øÂ° ¹®Àå¿¡¼­ ´Ù½Ã TMPFileNameProperty·Î µî·ÏµÈ´Ù.
3.3.5. Hint ÇÁ·ÎÆÛƼ ¿¡µðÅÍ
À̹ø Àý¿¡¼­´Â ¾Õ¿¡¼­ ¹è¿î ³»¿ëµéÀ» °¡Áö°í ¸ðµç ÄÞÆ÷³ÍÆ®ÀÇ Hint ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇÒ ¶§ ´ÙÁß ¶óÀÎÀ» ÀÔ·ÂÇÒ ¼ö ÀÖ´Â Hint ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ¸¸µé¾î º¸ÀÚ.
´ëºÎºÐ »õ ÇÁ·ÎÆÛƼ ¿¡µðÅÍÀÇ ºÎ¸ð Ŭ·¡½º´Â TStringProperty, TIntegerProperty, TClassProperty, TComponentProperty·Î Á¤ÇØÁø´Ù. Hint ÇÁ·ÎÆÛƼ´Â string ÇüÀ̹ǷΠTStringProperty¸¦ ºÎ¸ð Ŭ·¡½º·Î ¼±Á¤ÇÏ¸é µÉ °ÍÀÌ´Ù. ±×¸®°í TStringProperty´Â ±âº»ÀûÀ¸·Î ¿ÀºêÁ§Æ® ÀνºÆåÅÍÀÇ ÆíÁý âÀ» ¹Ù·Î »ç¿ëÇϹǷΠHint ÇÁ·ÎÆÛƼ¸¦ ¿©·¯ ÁÙ·Î ÆíÁýÇϱâ À§Çؼ­ TStringListProperty ¿¡µðÅÍó·³ ´ëÈ­ »óÀÚ¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇϵµ·Ï ÇϰڴÙ. ¸ÕÀú »õ·Î¿î ÆûÀ» Çϳª ¸¸µé°í ¾Æ·¡¿Í °°ÀÌ ¼³°èÇÑ´Ù.

±×¸² 3-2 Hint ÇÁ·ÎÆÛƼ ¿¡µðÅÍ Æû


±×¸®°í ÆûÀÇ À¯´Ö ÆÄÀÏ¿¡ ¾Æ·¡¿Í °°ÀÌ TdpbHintProperty Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.

TdpbHintProperty = class(TStringProperty)
  public
    function GetAttributes: TPropertyAttributes; override;
    procedure Edit; override;
  end;


´ëÈ­ »óÀÚ¸¦ »ç¿ëÇØ¾ßÇϹǷΠGetAttributes ¸Þ¼Òµå¿Í Edit ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù.

Procedure Tdpbhintproperty.Edit;
Begin
  With Tfrmhintpropedit.Create(Nil) Do
  Try
    If Propcount > 1 Then
      Caption := 'Hint 


GetAttributes ¸Þ¼Òµå´Â paDialog Ç÷¡±×¸¦ ¹ÝȯÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ°í Edit ¸Þ¼Òµå¿¡¼­´Â ÆíÁý ÆûÀ» »ý¼ºÇÏ°í ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ¼±ÅÃÇÑ ÄÞÆ÷³ÍÆ®ÀÇ °³¼ö¿¡ µû¶ó ÆûÀÇ Caption ÇÁ·ÎÆÛƼ¸¦ ¼³Á¤ÇÑ´Ù. ±×¸®°í GetStrValue ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ±¸ÇÑ ÇÁ·ÎÆÛƼÀÇ ÇöÀç °ªÀ» ¸Þ¸ð ÄÞÆ÷³ÍÆ®ÀÇ Text ÇÁ·ÎÆÛƼ¿¡ ¼³Á¤ÇØ ÁØ´Ù. ¸¶Áö¸·À¸·Î »ç¿ëÀÚ°¡ OK ¹öưÀ» ´©¸£¸é SetStrValue·Î ÇÁ·ÎÆÛƼ °ªÀ» ¼³Á¤ÇÑ´Ù.
±×¸®°í ÀÌ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ µî·ÏÇϱâ À§Çؼ­ Register ÇÁ·Î½ÃÀú¸¦ Çϳª ¸¸µé°í ÀÌ ÇÁ·Î½ÃÀú ³»¿¡¼­ RegisterPropertyEditor¸¦ È£ÃâÇØ ÁØ´Ù.

procedure Register;
begin
  RegisterPropertyEditor(TypeInfo(string), TControl, 'Hint', TdpbHintProperty);
end;


ÀÌ·¸°Ô ÇÁ·ÎÆÛƼ ¿¡µðÅÍ ÀÛ¼ºÀ» ¸ðµÎ ¸¶Ä¡¸é »õ ÄÞÆ÷³ÍÆ® ÆÐŰÁö³ª ±âÁ¸ ÆÐŰÁö¿¡ ÀÌ ÆÄÀÏÀ» Ãß°¡ÇÏ°í ´Ù½Ã ÄÄÆÄÀÏÇÑ ÈÄ Hint ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇØ º¸¸é ¾Æ·¡ È­¸éó·³ »õ·Î ÀÛ¼ºÇÑ ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ µ¿ÀÛÇÒ °ÍÀÌ´Ù.

±×¸² 3-3 µ¿ÀÛÁßÀÎ Hint ÇÁ·ÎÆÛƼ ¿¡µðÅÍ




±×¸² 3-4 ¿©·¯ ÁÙ·Î ÆíÁýµÈ Hint ÇÁ·ÎÆÛƼ


3.3.6. ´ëÈ­ »óÀÚ¸¦ ÀÌ¿ëÇÑ About ÇÁ·ÎÆÛƼ ¿¡µðÅÍ
ÀÌÀü Àå¿¡¼­ ÀÛ¼ºÇÑ TdpbLabel ÄÞÆ÷³ÍÆ®¿¡ About ÇÁ·ÎÆÛƼ¸¦ Çϳª Ãß°¡Çϰí ÀÌ ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇÏ¸é ´ëÈ­ »óÀÚ°¡ ³ªÅ¸³ª¼­ ÄÞÆ÷³ÍÆ®¸¦ ¸¸µç »ç¶÷, ÄÞÆ÷³ÍÆ®ÀÇ ¹öÀüµî ¿©·¯°¡Áö Á¤º¸¸¦ º¸¿©ÁÖ´Â ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ Çϳª ¸¸µé¾î º¸ÀÚ.
¸ÕÀú TdpbLabel Ŭ·¡½º¿¡ ¾Æ·¡ ÄÚµåó·³ About ÇÁ·ÎÆÛƼ¸¦ Ãß°¡ÇØ ÁØ´Ù.

const
  VERSION = '1.0';

type
  { »ý·« }
  TdpbLabel = class(TCustomLabel)
  private
    { »ý·« }
    procedure SetAbout(const Value : string);
    function  GetAbout : string;
    { »ý·« }
  published
    { Published declarations }
    property About : string read GetAbout write SetAbout stored False;
    { »ý·« }
  end;

implementation

{ TdpbLabel }
{ »ý·« }

function TdpbLabel.GetAbout: string;
begin
  Result := VERSION;
end;

procedure TdpbLabel.SetAbout(const Value: string);
begin
end;
{ »ý·« }


About Property´Â ½ÇÇà½Ã¿¡ ÄÞÆ÷³ÍÆ®ÀÇ µ¿ÀÛ¿¡ ¿µÇâÀ» ¹ÌÄ¡´Â ÇÁ·ÎÆÛƼ°¡ ¾Æ´Ï°í ¼³°è½Ã¿¡¸¸ Á¤º¸¸¦ º¸¿© ÁÖ´Â ÇÁ·ÎÆÛƼÀ̹ǷΠÆû ÆÄÀÏ¿¡ ÇÁ·ÎÆÛƼ °ªÀ» ÀúÀåÇÏÁö ¾Êµµ·Ï Stored¸¦ False·Î ÇØ ÁØ´Ù.
´ÙÀ½ ÄÞÆ÷³ÍÆ® Á¤º¸¸¦ º¸¿© ÁÙ ´ëÈ­ »óÀÚ¸¦ ¾Æ·¡¿Í °°ÀÌ ¼³°èÇÑ´Ù.

±×¸² 3-5 TdpbLabelÀÇ About ÇÁ·ÎÆÛƼ ¿¡µðÅÍ Æû


±×¸®°í ÆûÀÇ À¯´Ö ÆÄÀÏ¿¡ ¾Æ·¡¿Í °°ÀÌ TdpbAboutProperty Ŭ·¡½º¸¦ ¼±¾ðÇÑ´Ù.

TdpbAboutProperty = class(TStringProperty)
  public
    procedure Edit; override;
    function GetAttributes : TPropertyAttributes; override;
    function GetValue : string; override;
  end;


About ÇÁ·ÎÆÛƼ ¿¡µðÅ͵µ ´ëÈ­ »óÀÚ¸¦ »ç¿ëÇØ¾ßÇϹǷΠGetAttributes ¸Þ¼Òµå¿Í Edit ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù.

function TdpbAboutProperty.GetAttributes : TPropertyAttributes;
begin
  Result := [ paDialog, paReadOnly ];
end;

function TdpbAboutProperty.GetValue : string;
begin
  Result := 'Press ... to display About dialog';
end;

procedure TdpbAboutProperty.Edit;
begin
  with TfrmAboutPropEdit.Create(nil) do
  try
    { Ŭ·¡½º À̸§°ú ¹öÀü Á¤º¸¸¦ ±¸ÇÑ´Ù }
    CompClass := GetComponent(0).ClassName;
    Version := inherited GetValue;
    Caption := CompClass + ' ¿¡ ´ëÇØ...';
    ShowModal;
  finally
    Free;
  end;
end;


GetAttributes ¸Þ¼Òµå´Â paDialog Ç÷¡±×¿Í paReadOnly Ç÷¡±×¸¦ ¹ÝȯÇÒ ¼ö ÀÖµµ·Ï ÇØÁÖ°í Edit ¸Þ¼Òµå¿¡¼­´Â ÆíÁý ÆûÀ» »ý¼ºÇÏ°í ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ ¼±ÅÃÇÑ ÄÞÆ÷³ÍÆ®ÀÇ Å¬·¡½º À̸§À» ÆûÀÇ Public º¯¼öÀÎ CompClass¿¡ ÀúÀåÇÏ°í ¹öÀü Á¤º¸¸¦ Version º¯¼ö¿¡ ÀúÀåÇÑ´Ù.
ÀÌ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ ¼³Ä¡Çϱâ Àü¿¡´Â About ÇÁ·ÎÆÛƼÀÇ °ªÀÌ ´Ü¼øÈ÷ ¹öÀü Á¤º¸¸¸ º¸¿©ÁÖµµ·Ï Çϰí ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ ¼³Ä¡µÇ¸é 'Press ¡¦ button to dispaly About dialog'¶ó´Â ¸Þ½ÃÁö¸¦ º¸¿© ÁÙ ¼ö ÀÖµµ·Ï Çϱâ À§ÇØ GetValue ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇÑ´Ù.
´ÙÀ½ ¾Æ·¡ ÄÚµå¿Í °°ÀÌ ÆûÀÇ OnPaint À̺¥Æ®¿¡¼­ ÆíÁýÁßÀÎ ÄÞÆ÷³ÍÆ®ÀÇ ÆÈ·¹Æ® ºñÆ®¸ÊÀ» ±¸Çؼ­ ÀÌ ºñÆ®¸Ê°ú ÄÞÆ÷³ÍÆ®ÀÇ Å¬·¡½º À̸§, ¹öÀü Á¤º¸¸¦ ÆûÀÇ Äµ¹Ù½º¿¡ ±×·ÁÁÖµµ·Ï ÇÑ´Ù.

procedure TfrmAboutPropEdit.FormPaint(Sender: TObject);
var
  Bmp : TBitmap;
begin
  { ÄÞÆ÷³ÍÆ®ÀÇ ÆÈ·¹Æ® ºñÆ®¸ÊÀ» ±×¸°´Ù. }
  Bmp := TBitmap.Create;
  try
    Bmp.LoadFromResourceName(hInstance, UpperCase(CompClass));
    Canvas.Brush.Color := Self.Color;
    Canvas.BrushCopy(Bounds(16, 16, 24, 24), Bmp, 
Bounds(0, 0, 24, 24), Bmp.TransparentColor);
  finally
    Bmp.Free;
  end;

  { ÄÞÆ÷³ÍÆ®ÀÇ Å¬·¡½º À̸§°ú ¹öÀüÀ» ±×¸°´Ù. }
  SetBkMode(Canvas.Handle, TRANSPARENT);
  Canvas.Font.Name := 'Times New Roman';
  Canvas.Font.Size := 16;
  Canvas.Font.Style := [fsBold];
  Canvas.Font.Color := clBtnShadow;
  Canvas.TextOut(49, 15, CompClass + ' ' + Version);
  Canvas.Font.Color := clWindow;
  Canvas.TextOut(51, 17, CompClass + ' ' + Version);
  Canvas.Font.Color := clMaroon;
  Canvas.TextOut(50, 16, CompClass + ' ' + Version);
end;


¸¶Áö¸·À¸·Î dpbLabel.pas À¯´ÖÀÇ uses Àý¿¡ dsgnintf¿Í AboutPropEdit À¯´ÖÀ» Ãß°¡ÇØ ÁÖ°í Register ÇÁ·Î½ÃÀú¿¡ ¾Æ·¡¿Í °°ÀÌ ÇÁ·ÎÆÛƼ ¿¡µðÅ͸¦ µ¨ÆÄÀÌ IDE¿¡ µî·ÏÇÏ´Â ·çƾÀ» Ãß°¡ÇØ ÁØ´Ù.

procedure Register;
begin
  RegisterComponents('DPB', [TdpbLabel]);
  RegisterPropertyEditor(TypeInfo(string), TdpbLabel, 'About', TdpbAboutProperty);
end;


¾Æ·¡ ±×¸²Àº About ÇÁ·ÎÆÛƼ ¿¡µðÅͰ¡ µ¿ÀÛÇÏ´Â È­¸éÀÌ´Ù.

±×¸² 3-6 ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ µ¿ÀÛÁßÀÎ About ÇÁ·ÎÆÛƼ ¿¡µðÅÍ




±×¸² 3-7 µ¿ÀÛÁßÀÎ About ÇÁ·ÎÆÛƼ ¿¡µðÅÍ





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