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

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

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

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

 

728x90

 

 

 

이번에는 이벤트 핸들러에 들어가는

매개변수의 형(type)과 갯수를 마음대로 바꿔서 사용할수 있도록 해봅시다.

 

우선 TNotifyEvent의 정의부터 보도록 합시다.

 

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

 

위의 형식에다가 그대로 대입만 해주면 되겠지요?

참, 참고로 '... of object'를 보도록 하죠.

 

지금까지 함수포인터 얘기를 자주 했지요?

그런데 'of object'는 왜 붙어야 할까요?

 

결론부터 얘기하자면 'of object'를 덧붙임으로서

TNotifyEvent는 객체(object)의 함수포인터가 됩니다.

 

즉 일반 함수포인터의 선언시에는 'of object'가 빠지게 됩니다.

 

그럼 우리의 이벤트 타입(type)을 만들어 보도록 합시다.

 

type

  TOnResize = procedure ( Sender : TObject; Width, Height : integer ) of object;

 

버튼의 크기가 변경되었을때 발생해서 Width, Height를 넘겨주도록 하려고 합니다.

우선 함수포인터로서 역할을 할 변수를 만들어야죠?

 

private

{ Private declarations }

fOnResize : TOnResize;

 

그리고 오브젝트 인스펙터에 나타날 이름을 적어주어야 하구요..

 

published

{ Published declarations }

property OnResize : TOnResize read fOnResize write fOnResize;

 

그럼 크기가 변경될때 나오는 WM_SIZE를 처리해야 겠죠?

 

함수를 선언하구요..

 

protected

{ Protected declarations }

procedure WmSize(var Message: TMessage); message WM_SIZE;

 

다음과 같이 함수내에서 fOnResize를 호출하면 끝...

 

procedure TMyButton.WmSize(var Message: TMessage);

begin

  inherited;

  if Assigned( fOnResize ) then

    fOnResize( self, Width, Height );

end;

 

지난 강좌에서 한 방법과 거의 같습니다.

다만 다른 점은 델파이에 미리 정해져 있는 형식을 쓰지 않기 때문에

사용자가 직접 선언을 해 주어야 한다는 점입니다.

 

완전한 소스

 

unit MyButton;

 

interface

 

uses

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

 

type

  TOnResize = procedure ( Sender : TObject; Width, Height : integer ) of object;

 

TMyButton = class(TButton)

private

  fOnResize : TOnResize;

protected

  procedure WmSize(var Message: TMessage); message WM_SIZE;

public

  constructor Create( AOwner : TComponent ); override;

  destructor Destroy; override;

published

  property OnResize : TOnResize read fOnResize write fOnResize;

end;

 

procedure Register;

 

implementation

 

procedure Register;

begin

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

end;

 

constructor TMyButton.Create( AOwner : TComponent );

begin

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

end;

 

destructor TMyButton.Destroy;

begin

  // 해제시에 할일...

  inherited Destroy;

end;

 

procedure TMyButton.WmSize(var Message: TMessage);

begin

  inherited;

  if Assigned( fOnResize ) then

    fOnResize( self, Width, Height );

end;

 

end.

 

6편 계속...

728x90
반응형

댓글