Q&A

  • [re] 기존 컴포넌트를 조합하여 새로운 컴포넌트 생성하기
여기서는 그냥 TCustomControl 로 만들었는데 뭐 Panel이라면 Panel위에 Label이 하나 올라가 있는
그런 콤포넌트가 되겠네요
기본적으로 Label의 Caption을 바꾸는것과. 이 Label을 클릭했을때 일어날 이벤트를 주는것
이 두가지를 예를 들어 보겠습니다.  별내용없습니다 간단합니다 ^ㅡ^;;


<!--CodeS-->
uses <사용하고자하는 넘의 본 클래스가 요기서 선언이 되야겠지요>;
~~
type
    ~~<Event>~~
    // 이 부분이 Label을 클릭했을때의 이벤트선언 부분입니다.
    TTitleClickEvent    = procedure(Sender:TObject) of object;
    
    // TCustomControl 을 상속하는 새로운 클래스를 하나 만들굽쇼  
    TMyComponent = class(TCustomControl)
    private
        FLblTitle: TLabel;        //<-- 여기 TLabel 을 선언합니다. 이넘을 사용하겠다 이거죠
        FLblCaption : String;  //<-- 이넘이 TLabel.Caption 의 값을 저장하는 변수로 쓰죵
                                          //      사실 다른데서 FLblTitle 이넘을 이용하지 않겠다 라고 한다면
                                          //      이 변수는 필요없는 변수입니다.  
        FOnLblTitleClick : TTitleClickEvent;   //<-- 이넘을 클릭할때 처리할 이벤트변수(?)

        ~~<Private Vars>~~
    
        // 이넘을 이용해서 FLblTitle 라는 TLabel의 Caption 값을 바꿉니다.
        procedure SetLblTitleCaption(Value:String);

        // 이넘을 이용해서 FLblTitle 라는 TLabel이 클릭될때 할일을 처리해 줍니다.
        procedure lblTItleClick(Sender:TObject);
        ~~

     protected
        ~~

     public
        constructor Create(AOwner: TComponent); override;
        destructor  Destroy;override;
        ~~

     published      
         // TMyComponent.LblCaption 의 값이 변경되면 SetLblTitleCaption 프로시져를
         // 호출한다고 합니다.  (당연히 요놈은 프로퍼티가 되겠죵?)
         property LblCaption : String read FLblCaption Write SetLblTitleCaption;

         // 이넘을 통해서 Label을 클릭했을때 발생할 이벤트를 정의해 줄수있지요
         property OnLblitleClick : TTitleClickEvent read FOnLblTitleClick write FOnLblTitleClick;

         ~~
     end;
    

// 요기서부터 시작합시다
procedure Register;

implementation

// 이넘은 콤포넌트 팔래트 등록부분
procedure Register;
begin
  RegisterComponents('TestComponent', [TMyComponent ]);
end;


// ===================================================
// CONSTRUCTOR 에서 FlblTitle  라는 TLabel를 생성해줘야겠지요?
// ===================================================
constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  FlblTitle := TLabel.Create(Self);
  FlblTitle.Parent := Self;
  FlblTitle.Caption := 'TEST';
  FlblTitle.Top := 4;
  FlblTItle.Left := 45;
  FlblTItle.AutoSize := True;
  FlblTitle.Cursor := crHandPoint;
  // 이부분은 위에서 procedure lblTItleClick(Sender:TObject); 으로 선언한 부분입니당.
  // 이넘을 클릭했을때 어떤 이벤트를 발생시킬거냐 이거입죵
  FlblTItle.OnClick := lblTItleClick;  
end;


// ===================================================
// 생성자가 있으면 소멸자도 있어야지요
// CONSTRUCTOR에서 생성한 FLblTitle 라는넘을 없애줍니다.
// ===================================================
destructor TMyComponent.Destroy;
begin
  FLblTitle.Free;
  inherited;
end;


// ===================================================
// LblTitie.Caption을 변경해주는 부분
// ===================================================
procedure TMyComponent.SetLblTitleCaption(Value:String);
begin
    FLblCaption  := Valuel
    if assigned(FLblTitle) then begin
       FLblTitle.Caption := FLblCaption;
    end;
end;


// ===================================================
// Label이 클릭
1  COMMENTS