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


3.4. ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ(Component Editor)

3.4.1. °³¿ä
ÇÁ·ÎÆÛƼ ¿¡µðÅÍ´Â ¿ÀºêÁ§Æ® ÀνºÆåÅÍ¿¡¼­ »ç¿ëµÇÁö¸¸ ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ´Â Æû µðÀÚÀ̳ʿ¡¼­ ÆûÀ» ¼³°èÇÒ ¶§ »ç¿ëÇÑ´Ù. ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ´Â ÆûÀ» ¼³°èÇÒ ¶§ ÄÞÆ÷³ÍÆ®¸¦ ´õºí Ŭ¸¯ ÇßÀ» ¶§ ¾î¶² µ¿ÀÛÀ» ÇÒ °ÍÀÎÁö ¸¶¿ì½º ¿À¸¥ ÂÊ ¹öưÀ¸·Î ÄÜÅØ½ºÆ® ¸Þ´º¸¦ µ¿ÀÛ½ÃÄ×À» ¶§ ¾î¶² ÀÛ¾÷À» ÇÒ ¼ö ÀÖµµ·Ï ÇÒ °ÍÀÎÁö¸¦ °áÁ¤ÇÑ´Ù. ¸ðµç ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ´Â TComponentEditor¿¡¼­ »ó¼Ó ¹Þ¾Æ ¸¸µé¾îÁø´Ù.
TComponentEditor´Â dsgnintf.pas À¯´Ö¿¡ ¾Æ·¡¿Í °°ÀÌ ¼±¾ðµÇ¾î ÀÖ´Ù.

TComponentEditor = class(TInterfacedObject, IComponentEditor)
  private
    FComponent: TComponent;
    FDesigner: IFormDesigner;
  public
    constructor Create(AComponent: TComponent; ADesigner: IFormDesigner); virtual;
    procedure Edit; virtual;
    procedure ExecuteVerb(Index: Integer); virtual;
    function GetIComponent: IComponent;
    function GetDesigner: IFormDesigner;
    function GetVerb(Index: Integer): string; virtual;
    function GetVerbCount: Integer; virtual;
    function IsInInlined: Boolean;
    procedure PrepareItem(Index: Integer; const AItem: TMenuItem); virtual;
    procedure Copy; virtual;
    property Component: TComponent read FComponent;
    property Designer: IFormDesigner read GetDesigner;
  end;



ÄÞÆ÷³ÍÆ® ¿¡µðÅ͵µ ÇÁ·ÎÆÛƼ ¿¡µðÅÍ¿Í ¸¶Âù°¡Áö·Î TComponentEditor¿¡¼­ »ó¼Ó ¹Þ¾Æ¼­ »õ Ŭ·¡½º¸¦ ¸¸µé°í ÇÊ¿äÇÑ ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇØ¼­ ¿øÇÏ´Â ÀÛ¾÷À» ÇØ ÁÖµµ·Ï ÇÏ¸é µÈ´Ù. Æû µðÀÚÀ̳ʿ¡¼­ ÄÞÆ÷³ÍÆ®°¡ ¼±ÅÃµÇ¸é µî·ÏµÈ ÄÞÆ÷³ÍÆ® ¿¡µðÅͰ¡ »ý¼ºµÈ´Ù. º°µµ·Ï µî·ÏµÈ ÄÞÆ÷³ÍÆ® ¿¡µðÅͰ¡ ¾øÀ¸¸é µ¨ÆÄÀÌ´Â TDefaultEditor ¶ó´Â ÄÞÆ÷³ÍÆ® ¿¡µðÅ͸¦ »ý¼ºÇÑ´Ù. TDefaultEditor´Â ÄÜÅØ½ºÆ® ¸Þ´º¿¡ »õ·Î¿î ¸Þ´º¸¦ Ãß°¡ÇÏÁö´Â ¾Ê°í ÄÞÆ÷³ÍÆ®¸¦ ´õºí Ŭ¸¯ÇßÀ» ¶§ ÄÞÆ÷³ÍÆ®ÀÇ À̺¥Æ® Áß¿¡¼­ OnCreate, OnChange, OnClick À̺¥Æ®¸¦ ¼ø¼­´ë·Î ã¾Æ ºÁ¼­ ÀÖÀ¸¸é ±× À̺¥Æ®¿¡ ´ëÇÑ À̺¥Æ® Çڵ鷯¸¦ ¸¸µé¾î ÁÖ°í ¾øÀ¸¸é ±× ÄÞÆ÷³ÍÆ®ÀÇ Ã¹¹øÂ° À̺¥Æ®¿¡ ´ëÇÑ À̺¥Æ® Çڵ鷯¸¦ ¸¸µé¾î ÁØ´Ù.
ÄÞÆ÷³ÍÆ®¸¦ ´õºí Ŭ¸¯ÇßÀ» ¶§ ¿øÇÏ´Â ÀÛ¾÷À» ¼öÇàÇÏ°í ½ÍÀ¸¸é Edit ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù. Edit ¸Þ¼Òµå´Â ±âº»ÀûÀ¸·Î GetVerbCount ÀÇ ¹Ýȯ°ªÀÌ 0º¸´Ù Å©¸é ù¹øÂ° ÄÜÅØ½ºÆ® ¸Þ´º ¾ÆÀÌÅÛÀ» µ¿ÀÛ½Ã۵µ·Ï µÇ¾î ÀÖ´Ù. ÄÞÆ÷³ÍÆ®ÀÇ ÄÜÅØ½ºÆ® ¸Þ´º¿¡ ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ°í ½ÍÀ¸¸é GetVerbCount¿Í GetVerb ¸Þ¼Òµå, ±×¸®°í ExecuteVerb ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵å ÇÑ´Ù. GetVerbCount ¸Þ¼Òµå´Â Ãß°¡ÇÒ ¸Þ´º ¾ÆÀÌÅÛÀÇ °³¼ö¸¦ ¹ÝȯÇϵµ·Ï ÇØ ÁØ´Ù. GetVerb ¸Þ¼Òµå´Â Ãß°¡µÉ ¸Þ´ºÀÇ Ä¸¼ÇÀ» ¹ÝÈ¯ÇØ¾ß ÇÑ´Ù. Æû ¼³°è½Ã¿¡ Ãß°¡µÈ ÄÜÅØ½ºÆ® ¸Þ´º ¾ÆÀÌÅÛÀÌ ¼±ÅõǸé ExecuteVerb ¸Þ¼Òµå°¡ È£ÃâµÈ´Ù.
µ¨ÆÄÀÌ¿¡¼­´Â Æû¿¡¼­ ÄÞÆ÷³ÍÆ®¸¦ ¼±ÅÃÇϰí Ctrl+C ۸¦ ´­·¯¼­ ÄÞÆ÷³ÍÆ®¸¦ Ŭ¸³º¸µå·Î º¹»ç(Copy)Çϰí ÀÌ·¸°Ô º¹»çµÈ ÄÞÆ÷³ÍÆ®¸¦ ºÙÀ̱â(Paste) ÇÒ ¼ö ÀÖ´Ù. µ¨ÆÄÀÌ´Â ÀÚüÀûÀ¸·Î Ŭ¸³º¸µå Çü½ÄÀ» ¸¸µé¾î¼­ »ç¿ëÇϱ⠶§¹®¿¡ ÀÌ·± ÀÛ¾÷ÀÌ °¡´ÉÇѵ¥ Ŭ¸³ º¸µå Çü½ÄÀ» º¯°æÇÏ°í ½ÍÀ» ¶§´Â Copy ¸Þ¼Òµå¸¦ ÀÌ¿ëÇÑ´Ù.
ÇöÀç ÄÞÆ÷³ÍÆ® ¿¡µðÅͰ¡ ÆíÁý ÁßÀÎ ÄÞÆ÷³ÍÆ®´Â Component ÇÁ·ÎÆÛƼ·Î ÂüÁ¶ÇÏ¸ç Æû µðÀÚÀ̳ʴ Designer ÇÁ·ÎÆÛƼ¸¦ ÀÌ¿ëÇÑ´Ù.

ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ´Â RegisterComponentEditor ÇÁ·Î½ÃÀú¸¦ ÀÌ¿ëÇØ¼­ µ¨ÆÄÀÌ IDE¿¡ µî·ÏÇÑ´Ù. ÀÌ ÇÁ·Î½ÃÀúÀÇ ¿øÇüÀº ¾Æ·¡¿Í °°´Ù.

procedure RegisterComponentEditor(ComponentClass: TComponentClass;
  ComponentEditor: TComponentEditorClass);



ù¹øÂ° ÀÎÀÚ´Â µî·ÏÇÒ ÄÞÆ÷³ÍÆ® ¿¡µðÅ͸¦ »ç¿ëÇÒ ÄÞÆ÷³ÍÆ® Ŭ·¡½ºÀÌ¸ç µÎ¹øÂ° ÀÎÀÚ´Â µî·ÏÇÒ ÄÞÆ÷³ÍÆ® ¿¡µðÅÍÀÇ Å¬·¡½ºÀÌ´Ù.
3.4.2. TdpbLabel ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ
ÄÞÆ÷³ÍÆ® ¿¡µðÅ͸¦ ¸¸µé±â À§ÇÑ ±âº»ÀûÀÎ Áö½ÄÀ» »ìÆì ºÃÀ¸¹Ç·Î ÀÌÀü Àå¿¡¼­ °³¹ßÇÑ TdpbLabel ÄÞÆ÷³ÍÆ®ÀÇ ¿©·¯°¡Áö ½ºÅ¸ÀÏÀ» ´ëÈ­ »óÀÚ¿¡¼­ Çѹø¿¡ ÆíÁýÇÒ ¼ö ÀÖµµ·Ï ÄÞÆ÷³ÍÆ® ¿¡µðÅ͸¦ Çϳª ¸¸µé¾î º¸ÀÚ.
¸ÕÀú ÄÞÆ÷³ÍÆ®¸¦ ÆíÁýÇÒ ´ëÈ­ »óÀÚ¸¦ ¾Æ·¡ ±×¸²Ã³·³ ¼³°èÇÑ´Ù.

±×¸² 3-8 ÄÞÆ÷³ÍÆ® ÆíÁý ´ëÈ­ »óÀÚ


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

type
  TdpbLabelEditor = class(TComponentEditor)
  public
    procedure SynchronizeLabel(Dest, Source : TdpbLabel);
    procedure ExecuteVerb(Index: Integer); override;
    function GetVerb(Index: Integer): string; override;
    function GetVerbCount: Integer; override;
  end;


TComponentEditor·ÎºÎÅÍ »ó¼Ó ¹Þ°í ExecuteVerb, GetVerb, GetVerbCount ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù. GetVerbCountÀÇ ¹Ýȯ°ªÀÌ 0º¸´Ù Å©¸é ù¹øÂ° ¸Þ´º ¾ÆÀÌÅÛÀ» ½ÇÇà½Ã۵µ·Ï µÇ¾î ÀÖÀ¸¹Ç·Î Edit ¸Þ¼Òµå´Â ±»ÀÌ ¿À¹ö¶óÀ̵åÇÏÁö ¾Ê¾Æµµ µÉ°ÍÀÌ´Ù.
´ÙÀ½ TdpbLabelEditorÀÇ °¡»ó¸Þ¼ÒµåµéÀ» ¾Æ·¡¿Í °°ÀÌ ±¸ÇöÇÑ´Ù.

{ TdpbLabelEditor }

function TdpbLabelEditor.GetVerb(Index: Integer): string;
begin
  case Index of
    0 : Result := '¸ð¾ç ÆíÁý...';
    1 : Result := 'TdpbLabel¿¡ ´ëÇÏ¿©...';
  end;
end;

function TdpbLabelEditor.GetVerbCount: Integer;
begin
  Result := 2;
end;

{ ÆíÁý Æû¿¡ ÀÖ´Â ·¹À̺í°ú ÆíÁýÇÏ´Â ·¹À̺í»çÀÌÀÇ ÇÁ·ÎÆÛƼ µ¿±âÈ­ }
procedure TdpbLabelEditor.SynchronizeLabel(Dest, Source: TdpbLabel);
begin
  Dest.Caption := Source.Caption;
  Dest.Font := Source.Font;
  Dest.Alignment := Source.Alignment;
  Dest.Layout := Source.Layout;
  Dest.TextStyle := Source.TextStyle;
  Dest.ShadowColor := Source.ShadowColor;
  Dest.ShadowDepth := Source.ShadowDepth;
  Dest.ShadowDirection := Source.ShadowDirection;
  Dest.EdgeStyle := Source.EdgeStyle;
  Dest.Edges := Source.Edges;
end;

{ ÄÜÅØ½ºÆ® ¸Þ´º ½ÇÇà }
procedure TdpbLabelEditor.ExecuteVerb(Index: Integer);
var
  DLG : TfrmLabelEdit;
begin
  case Index of
    { ù¹øÂ° ¸Þ´º }
    { ÄÞÆ÷³ÍÆ®¸¦ ´õºí Ŭ¸¯Çصµ ½ÇÇàµÈ´Ù. }
    0 :
    begin
      DLG := TfrmLabelEdit.Create(nil);
      try
        SynchronizeLabel(DLG.lblPreview, TdpbLabel(Component));
        DLG.Caption := Component.Owner.Name + '.' + Component.Name + ' ÆíÁý';
        if DLG.ShowModal = mrOk then
        begin
          SynchronizeLabel(TdpbLabel(Component), DLG.lblPreview);
          { ÄÞÆ÷³ÍÆ®¸¦ º¯°æÇßÀ¸¸é ¹Ýµå½Ã È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù. }
          Designer.Modified;
        end
      finally
        DLG.Free;
      end;
    end;
    { µÎ¹øÂ° ¸Þ´º }
    1 :
    begin
      ShowMessage('µ¨ÆÄÀÌ ÇÁ·Î±×·¡¹Ö ¹ÙÀÌºí ¿¹Á¦ ÄÞÆ÷³ÍÆ®');
    end;
  end;
end;


ÄÜÅØ½ºÆ® ¸Þ´º¿¡ µÎ°³ÀÇ ¾ÆÀÌÅÛÀ» Ãß°¡Çϵµ·Ï GetVerbCountÀÇ ¹Ýȯ°ªÀ» 2·Î ÇØÁÖ°í GetVerb¿¡¼­ °¢ ¸Þ´º ¾ÆÀÌÅÛ¿¡ ³ªÅ¸³¾ ĸ¼ÇÀ» ¹ÝÈ¯ÇØ ÁØ´Ù.
ExecuteVerb¿¡¼­´Â ù¹øÂ° ¸Þ´º¿¡ ´ëÇØ ½ÇÁ¦·Î ÆíÁý ´ëÈ­ »óÀÚ¸¦ ¶ç¿ì°í TdpbLabelÀÇ ¿©·¯ ÇÁ·ÎÆÛƼ¸¦ ÆíÁýÇÏ°Ô ¸¸µé°í µÎ¹øÂ° ¸Þ´º´Â ´Ü¼øÇÑ ¸Þ½ÃÁö ¹Ú½º¸¸ Çϳª ¶ç¿ìµµ·Ï ÇÑ´Ù.
ù¹øÂ° ¸Þ´º°¡ ¼±ÅõǸé TfrmLabelEdit ÆûÀ» »ý¼ºÇϰí lblPreview ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ¸¦ ÄÞÆ÷³ÍÆ® ¿¡µðÅÍÀÇ Component ÇÁ·ÎÆÛƼ °ª°ú ÀÏÄ¡µÇµµ·Ï µ¿±âÈ­¸¦ ÇØÁÖ°í ´ëÈ­ »óÀÚ¸¦ º¸¿© ÁØ´Ù.
ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ¿¡¼­ ÄÞÆ÷³ÍÆ®ÀÇ ÇÁ·ÎÆÛƼ¸¦ º¯°æÇßÀ¸¸é ¹Ýµå½Ã Designer ÇÁ·ÎÆÛƼÀÇ Modified ¸Þ¼Òµå¸¦ È£ÃâÇØ ÁÖ¾î¾ß ÇÑ´Ù. ÀÌ·¸°Ô ÇÏÁö ¾ÊÀ¸¸é º¯°æµÈ ÇÁ·ÎÆÛƼ°¡ ÆíÁý ÁßÀÎ ÄÞÆ÷³ÍÆ®¿¡ Á¤»óÀûÀ¸·Î Àû¿ëµÇÁö ¾ÊÀ¸¸ç Æû µðÀÚÀ̳ʰ¡ Æû ÆÄÀÏÀÌ º¯°æµÇ¾ú´Ù´Â »ç½ÇÀ» ¸ð¸£°Ô µÈ´Ù. µû¶ó¼­ º¯°æµÈ ³»¿ëÀ» ÀúÀåÇÒ ¼ö ¾ø°Ô µÈ´Ù.
TdpbLabelEditor´Â Edit ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÏÁö ¾Ê¾Ò±â ¶§¹®¿¡ »ç¿ëÀÚ°¡ ÄÞÆ÷³ÍÆ®¸¦ ´õºí Ŭ¸¯Çϸé ù¹øÀç ¸Þ´º°¡ ¼±ÅõȰÍó·³ µ¿ÀÛÇÑ´Ù.
¸¶Áö¸·À¸·Î ÄÞÆ÷³ÍÆ® ¿¡µðÅ͸¦ µî·ÏÇϱâ À§ÇØ Register ÇÁ·Î½ÃÀú¸¦ ¸¸µé°í ÀÌ ÇÁ·Î½ÃÀú ³»¿¡¼­ RegisterComponentEditor ÇÁ·Î½ÃÀú¸¦ ¾Æ·¡¿Í °°ÀÌ È£ÃâÇØ ÁØ´Ù.

procedure Register;
begin
  { ÄÞÆ÷³ÍÆ® ¿¡µðÅÍ µî·Ï }
  RegisterComponentEditor(TdpbLabel, TdpbLabelEditor);
end;


ÄÞÆ÷³ÍÆ® ÆÐŰÁö¿¡ Áö±Ý ¸¸µç À¯´ÖÀ» Ãß°¡Çؼ­ ´Ù½Ã ÄÄÆÄÀÏÇÏ¸é ¾Æ·¡¿Í °°ÀÌ ÄÞÆ÷³ÍÆ® ¿¡µðÅͰ¡ µ¿ÀÛÇÒ °ÍÀÌ´Ù. ¿©±â¼­ ÁÖÀÇÇÒ °ÍÀÌ Çϳª Àִµ¥ ÆÐŰÁö¿¡ ÄÞÆ÷³ÍÆ®¿Í ÄÞÆ÷³ÍÆ® ¿¡µðÅ͸¦ Ãß°¡ÇÒ ¶§ ¹Ýµå½Ã ÄÞÆ÷³ÍÆ®¸¦ ¸ÕÀú Ãß°¡ÇØ ÁÖ¾î¾ß ÇÑ´Ù. ¿Ö³ÄÇϸé TdpbLabel ÄÞÆ÷³ÍÆ®¸¦ ÆíÁýÇÏ´Â ÄÞÆ÷³ÍÆ® ¿¡µðÅÍÀÇ ÆûÀÌ TdpbLabel¸¦ »ç¿ëÇϰí Àֱ⠶§¹®ÀÌ´Ù. ¹Ýµå½Ã TdpbLabelÀÌ ¸ÕÀú µî·ÏµÇ°í³ª¼­ ÄÞÆ÷³ÍÆ® ¿¡µðÅͰ¡ µî·ÏµÇ¾î¾ß ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é ÄÞÆ÷³ÍÆ® ¿¡µðÅͰ¡ µî·ÏµÉ ¶§ TdpbLabel ÄÞÆ÷³ÍÆ®¸¦ ãÁö ¸øÇÑ´Ù´Â ¿¡·¯°¡ ¹ß»ýÇÒ °ÍÀÌ´Ù.

±×¸² 3-9 TdpbLabelEditor ÄÞÆ÷³ÍÆ® ¿¡µðÅÍÀÇ ÄÜÅØ½ºÆ® ¸Þ´º




±×¸² 3-10 TdpbLabelEditor ÄÞÆ÷³ÍÆ® ¿¡µðÅÍÀÇ Ã¹¹øÂ° ¸Þ´º µ¿ÀÛ È­¸é




±×¸² 3-11 TdpbLabelEditor ÄÞÆ÷³ÍÆ® ¿¡µðÅÍÀÇ µÎ¹øÂ° ¸Þ´º µ¿ÀÛ È­¸é





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