본문 바로가기
Delphi Tip/컴포넌트

델파이 컴포넌트(Component) 마무리

by MonoSoft 2023. 7. 25.
728x90
반응형

델파이 컴포넌트(Component) 마무리

728x90

 

 

 

RAD의 특징이 바로 프로퍼티

 

'+' 표시가 붙은 프로퍼티 만들기 

이번에는 프로퍼티의 이름앞에

'+'가 붙어서 내용이 전개되는 것을 어떻게 처리하는지 보도록 합시다.

 

① 집합형..(set)

우선 폼에 있는 BorderIcons를 보세요..

이녀석도 이름앞에 '+'가 있죠?

 

두번클릭하면 내용이 전개가 되면서 이름앞에 '-'로 바뀌지요.

 

앗.. 그런데 이녀석은 Font등에서 보던 녀석과는 약간 다른 특성이 있네요.

 

내용들이 모두 Boolean형으로 되어있지요?

그럼.. 이녀석의 헬프를 보도록 합시다.

 

type TBorderIcon = (biSystemMenu, biMinimize, biMaximize, biHelp);

 

TBorderIcons = set of TBorderIcon;

 

property BorderIcons:TBorderIcons;

 

와 같이 되어있네요..

앗.. 그렇다면 이녀석의 정체는 집합(set)이었군요..

 

크크.. 별것도 아닌 녀석이..

그럼.. 우리의 TMyButton에 바로 적용시켜 봅시다.

 

type

  TMyGame = ( mgStarCraft, mgFifa98, mgQuake, mgDuke3D);

  TMyGames = set of TMyGame;

  TMyButton = class(TButton)

  private

    fMyGame : TMyGames;

  published

    property MyGame : TMyGames read fMyGame write fMyGame;

end;

 

어때요.. 쉽게 해결되지요?

 

② 클래스형

폼을 보면 Font라는 낮익은 녀석에 '+'가 붙어있군요..

 

열어보면 이것저것이 들어있구,

심지어 좀전에 배운 집합형도 들어있군요..

 

Font 하나가 그대로 완벽한 구조를 이루고 있군요.

 

지금까지 배운것을 총동원해서 이녀석을 공략해 보도록 합시다.

 

렐프를 봅시다.

 

앗!! 이녀석은 TFont형? 그렇다면 클래스?

 

계속 따라가 봅시다.. TFont형을 보면..

휴우.. Properties, Methods, Events... 그대로 완벽한 하나의 세상이군요.

 

그렇다면 이녀석의 조상은?

와우.. 엄청나게 상위클래스네요..

 

음.. Font와 같이 프로퍼티의 일부로 클래스를 사용하려면

반드시 TPersistent형에서 상속을 받아야 한다고 되어있습니다.

 

그럼.. 듣기에도 생소한 TPersistent형이 무엇인지 알야봐야죠?

 

역시 헬프를 눌러보시면..

와우.. 이녀석의 아빠는 바로 TObject로군요..

 

그렇다면, 아주 기본적인 기능을 하는 클래스일테구,

범인이 접근하기 힘든 상대겠네요..

휴우.. 심호흡좀 하구나서..

 

우리의 구음진경(헬프)를 보자면

이녀석의 주임무는 주로 데이터의 저장과 불러오기를 담당한다고 하는군요..

 

우리가 폼의 프로퍼티를 건들면 저장이 되구.

실행될때 불려지는데, 이녀석이 그런일을 담당하고 있군요..

 

자.. 이정도만 알아두고 우리의 정들었던

TMyButton대신 다른 컴포를 만들어 봅시다.

 

기본골격을 만드는 법은 이 강좌 초반부에서 설명을 해 드렸죠?

 

생성자와 소멸자까지 만든다음 계속합시다.

 

새로운 컴포의 이름은 TMyCompo, 아빠는 TComponent로 합시다.

 

골격을 다 만들었나요?

음.. 클래스형을 프로퍼티로 삼게 되니깐..

 

프로퍼티로 쓸 클래스도 만들어야겠죠?

 

물론 아빠는 TPersistent이 될테구요..

 

다음과 같은 골격이 될겁니다.

 

type

  TMyProperty = class(TPersistent)

  private

    fCaption : string;

  public

    constructor Create; destructor Destroy; override;

  published

    property Caption : string read fCaption write fCaption;

end;

 

implementation

 

constructor TMyProperty.Create;

begin

  inherited Create;

end;

 

destructor TMyProperty.Destroy;

begin

  inherited Destroy;

end;

 

프로퍼티로 쓸 클래스를 만들었는데,

TMyProperty클래스안에도 프로퍼티가 있네요

Caption이라는 그렇습니다.

 

Font안에 있는 Name이나 Size등은

바로 TFont안에 선언된 프로퍼티였지요

 

그러니깐.. 델파이가, 클래스로 된 프로퍼티를 보여줄때는,

그 클래스의 내용을 보여줘야 되는데, 이 내용이라는 것이

바로 클래스의 프로퍼티가 된다는 말입니다.

 

에구.. 꼬인당.. 이해는 되시지요?

 

당연한 얘기이겠지요?

 

프로퍼티라는 게 바로 VCL에서

클래스 내부와 외부를 연결시켜주는 구실을 하니깐요

 

우리의 컴포넌트에서는 어떻게 사용할까요?

 

방법은 여태까지와 같습니다.

 

TMyProperty형의 변수를 선언해주고, published에다가 기입을 해주면 되죠.

 

TMyCompo = class(TComponent)

  private

    fMyProperty : TMyProperty;

  published

    property MyProperty : TMyProperty read fMyProperty write fMyProperty;

end;

 

이제 다 끝난다면 재미가 없겠지요?

 

fMyProperty는 클래스이므로 생성을 해주고 해제를 해야되겠지요?

 

constructor TMyCompo.Create( AOwner : TComponent );

begin

  inherited Create(AOwner); // 생성시에 할일...

  MyProperty := TMyProperty.Create;

end;

 

destructor TMyCompo.Destroy;

begin

  // 해제시에 할일...

  MyProperty.Free; inherited Destroy;

end;

 

이렇게 MyProperty를 생성하고 해제하는

일을 해주어야만 제대로 쓸수 있게 됩니다.

 

만약, 생성을 하지 않고 사용하려구 했다면,,,

한번 테스트를 해보시기 바랍니다. 권해드리고 싶지는 않지만... 후후후..

 

다음은 클래스를 프로퍼티로 갖는 컴포넌트의 소스입니다.

 

// ***************************************************************

unit MyCompo;

 

interface

 

uses

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

 

type

  TMyProperty = class(TPersistent)

  private

    { Private declarations }

    fCaption : string;

  protected

    { Protected declarations }

  public

    { Public declarations }

 

    constructor Create;

    destructor Destroy; override;

  published

    { Published declarations }

    property Caption : string read fCaption write fCaption;

  end;

 

  TMyCompo = class(TComponent)

  private

    { Private declarations }

    fMyProperty : TMyProperty;

  protected

    { Protected declarations }

  public

    { Public declarations }

    constructor Create( AOwner : TComponent ); override;

    destructor Destroy; override;

  published

    { Published declarations }

    property MyProperty : TMyProperty read fMyProperty write fMyProperty;

  end;

 

procedure Register;

 

implementation

 

procedure Register;

begin

  RegisterComponents('C쟁이네', [TMyCompo]);

end;

 

constructor TMyProperty.Create;

begin

  inherited Create;

end;

 

destructor TMyProperty.Destroy;

begin

  inherited Destroy;

end;

 

constructor TMyCompo.Create( AOwner : TComponent );

begin

  inherited Create(AOwner); // 생성시에 할일...

  MyProperty := TMyProperty.Create;

end;

 

destructor TMyCompo.Destroy;

begin

  // 해제시에 할일...

  MyProperty.Free; inherited Destroy;

end;

 

end.

728x90
반응형

댓글