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

델파이 컴포넌트(Component) 3편

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

델파이 컴포넌트(Component) 3편

 

728x90

 

 

속성

 

우선 우리의 버튼에 특성을 주어 봅시다.

가장 눈에 잘띄는 속성은 Caption일 겁니다.

 

constructor TMyButton.Create( AOwner : TComponent );

begin

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

  Caption := '눌러봐!';

  Font.Name := 'fixedsys';

  Font.Size := 9;

  Width := 200;

  Height := 150;

end;

 

이상과 같이 Create함수를 바꿔보고 컴포넌트를 다시 컴파일 합시다.

컴포넌트의 컴파일은 패키지에서 'Compile'버튼을 누르면 됩니다.

 

패키지는 기본적으로 'Dclusr30.dpk'를 사용하게 되는데

'Component'메뉴의 'Install Packages...'를 클릭해서 나오는 창에서

'Delphi User's Components'를 선택하고 'Edit'버튼을 누르면 됩니다.

 

또는 'File'메뉴의 'Open'에서 '...\Borland\Delphi 3\Lib\Dclusr30.dpk'

파일을 열면 됩니다.

 

TMyButton의 수정을 하고 컴파일을 마쳤다면

폼위에 우리의 버튼을올려 놓아 봅시다.

 

어때요? 재미있죠?

 

 

이벤트 연결 1

 

속성을 바꿔보았으니 이번에는 이벤트를 연결해 봅시다.

우선 간단히 OnClick 이벤트를 연결해 봅시다.

 

Click라고 입력한후 'F1'를 눌러봅시다.

 

TButton.Click를 보면 다음과 같죠?

 

procedure Click; override; 이 함수를 override해서 쓰면

버튼이 Click되었을때를 알수 있습니다.

 

선언부에 위와 같이 적어주고 다음과 같이 정의합시다.

 

procedure TMyButton.Click;

begin

  ShowMessage('눌렸네!');

end;

 

그런다음 다시 컴포를 컴파일한후에 폼에

우리의 컴포를 올려놓고 실행해 봅시다.

 

버튼을 누르면 어떻게 되나요? '눌렸네!'라는

메시지가 뜨는것을 볼수 있습니다.

 

이번에는 폼위에 올려진 MyButton1의 OnClick이벤트

핸들러에 다음과 같이 넣어 봅시다.

 

procedure TForm1.MyButton1Click(Sender: TObject);

begin

  ShowMessage('폼에서 눌렸네!');

end;

 

그리고 실행하면, 어떻게 될까요?

'눌렸네!'와 '폼에서 눌렸네!'의 메시지가 나오나요?

안 나온다구요? 왜 그럴까요?

 

procedure Click; override; 를 기억하시나요?

'override'라는 지시어가 보이지요?

 

이 녀석도 Create와 마찬가지로 아빠한테

상속받은 것이므로 inherited를 해주어야 정상적으로 작동을 하게 됩니다.

 

TMyButton.Click를 수정해 봅시다.

 

procedure TMyButton.Click;

begin

  inherited; <==

  ShowMessage('눌렸네!');

end;

 

그리고 실행하면 두가지의 메시지를 모두 볼수 있을것입니다.

 

procedure TMyButton.Click;

begin

  ShowMessage('눌렸네!');

  inherited; <==

end;

 

와 같이 바꿔서 실행을 해 봅시다.

무엇이 다른가요?

 

'inherited'의 위치에 따라서 실행결과가

다름을 확인할 수 있을겁니다.

 

델파이는 역시 잘 준비된 VCL를 가지고 있기 때문에

이벤트도 역시 쉽게 연결해서 쓸수 있습니다.

 

단순히 아빠의 이벤트 관련함수를 Override해서

이벤트를 얻어올수 있으니 참으로 편리하죠..

 

참고로 이런 종류의 이벤트 함수는

OnClick -> Click

OnDragDrop -> DragDrop

OnDragOver -> DragOver

OnEndDrag -> EndDrag

OnEnter -> DoEnter

OnExit -> DoExit

등등의

이름으로 정의되어 있습니다.

 

대부분 접두어인 'On-'을 제외한 상태이거나

'On-' -> 'Do-'로 바꾼상태이므로 쉽게 찾을수 있습니다.

 

모든경우 override해서 쓰면 되고

이때는 물론 inherited의 위치에 따라서 결과가 달라짐을 유의하시면 됩니다.

 

 

이벤트 연결 2

이번에는 좀 다른 방식으로 이벤트를 연결해 봅시다.

위에서 쓴 방법은 원래 이벤트를 일으키는 함수를 override해서 쓴것이구

이번에는 많이 알려진 데로 함수포인터를 사용해서 해봅시다.

 

델파이에서의 함수포인터는 'C'에서와는 달리 아주 쉽게 사용할수 있습니다.

 

지금 '함수포인터? 그게 뭐야?' 하시는 분이 계시리라 생각되는데

여러분이 델파이를 사용해서 프로그래밍을 해보셨다면

이미 함수포인터를 사용해서 프로그래밍을 하신 겁니다

'Object Inspector'를 보시면 'Events'탭에 'OnClick'등등의 이벤트 이름이 써있습니다.

 

여기에 이벤트를 처리해주는 함수를 연결해서 사용하는데

이것이 바로 함수 포인터입니다.

혹시 다음 코드를 보신적이 있는지요?

 

Application.OnMessage := AppMessage;

 

'AppMessage'라는 함수를 'OnMessage'라는

함수포인터에 연결하는 코드입니다.

 

이렇듯 델파이에서는 이벤트의 연결에 함수포인터를 이용해서

아주 쉽게 이벤트를 처리할수 있도록 되어 있습니다.

 

자 그럼. OnClick를 연결해 봅시다.

 

OnClick의 헬프를 보면 다음과 같이 선언되어 있습니다.

property OnClick: TNotifyEvent;

OnClick는 프로퍼티이고 TNotifyEvent형이라고 되어 있지요..

 

그럼 TNotifyEvent는 무엇일까요?

 

역시 헬프를 보면 다음과 같이 되어있습니다.

 

type TNotifyEvent = procedure (Sender: TObject) of object;

 

TNotifyEvent란

'procedure (Sender: TObject) of object'을 가리키는 변수의 형(type)이라는 소리겠지요..

 

그러니깐 'OnClick'라는 것은 'procedure (Sender: TObject) of object'형의 변수

즉 함수 포인터라는 말이 됩니다.

그럼 OnClick에 연결시킬 함수는 어떻게 만들까요?

 

procedure TForm1.FormClick(Sender: TObject);

begin

...

end;

 

많이 보셨지요?

 

위의 선언은 다음과 같이 되어 있을 겁니다.

 

procedure FormClick(Sender: TObject);

 

위와 같이 코드를 만들어주면 되겠지요?

그럼 연결은 어떻게 할까요?

 

다음은 폼을 'View as Text'로 보았을때 나타나는 코드입니다.

 

object Form1: TForm1 Left = 218 Top = 105 ...

OnClick = FormClick <== 주목!

...

end

 

OnClick에 FormClick이 연결되어 있습니다.

 

컴포넌트가 생성될때 위와같이 써주면 되겠지요..

 

그럼 우리의 컴포넌트에 적용을 해 봅시다.

 

protected

 

 { Protected declarations }

 

procedure ButtonClick(Sender : TObject);

 

선언은 위와 같이 해주고요. 정의는 다음과 같이 해 봅시다.

 

procedure TMyButton.ButtonClick(Sender : TObject);

begin

  ShowMessage('눌렸네!');

end;

 

그다음은 연결을 해주어야 하는데 가장 적당한 곳은 컴포넌트가 생성될때 겠지요.

 

constructor TMyButton.Create( AOwner : TComponent );

begin

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

  Caption := '눌러봐!'; ...

  OnClick := ButtonClick; <== 이벤트의 연결..

end;

 

자 이제 컴포넌트를 컴파일하구 실행을 해 봅시다.

버튼을 누르면 '눌렸네!'라는 메시지가 뜨는 것은 볼수 있습니다.

 

이때 주의해야 할 점은 폼의 설계시에,

우리의 버튼에 OnClick이벤트를 연결시키면 '눌렸네!'라는 메시지가 안뜨고

폼의 설계시에 연결한 작업이 수행된다는 것입니다.

 

여기 까지 잘 되나요?

다음은 함수포인터를 이용해서 이벤트를

연결하는 방법을 적용한 완전한 소스입니다.

 

 

 

unit MyButton;

 

interface

 

uses

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

 

type

  TMyButton = class(TButton)

 

private

  { Private declarations }

protected

  { Protected declarations }

  procedure ButtonClick(Sender : TObject);

public

  { Public declarations }

  constructor Create( AOwner : TComponent ); override;

  destructor Destroy; override;

published

  { Published declarations }

end;

 

procedure Register;

 

implementation

 

procedure Register;

begin

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

end;

 

constructor TMyButton.Create( AOwner : TComponent );

begin

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

  Caption := '눌러봐!';

  Font.Name := 'fixedsys';

  Font.Size := 9;

  OnClick := ButtonClick;

end;

 

destructor TMyButton.Destroy;

begin

  // 해제시에 할일...

  inherited Destroy;

end;

 

procedure TMyButton.ButtonClick(Sender : TObject);

begin

  ShowMessage('눌렸네!');

end;

 

end.

 

 

4편 계속....

 

728x90
반응형

댓글