강좌/문서 게시판에 있는 주정섭님의 글을 읽고 제 나름대로의 다른 방법을 정리해봅니다.
이 글을 읽으시기 전에 해당 게시물을 먼저 읽어보세요.
임포스터 클래스를 쓸려는 목적이...
1) 기존 컴포넌트에 새로운 기능 추가
2) 컴포넌트를 IDE에 등록하지 않고 사용
3) 소스 관리의 편리성 (실수방지, 수정용이)
이 세가지를 모두 충족하면서도 아주 간단한 방법입니다.
예제로 가운데 정렬 기능이 있는 Edit를 만들어 보겠습니다.
TEdit를 상속받아서 가운데 정렬 기능을 추가한 TCenterEdit의 소스입니다.
unit UCenterEdit;
interface
uses
Windows, Controls, StdCtrls;
type
TCenterEdit = class(TEdit)
protected
procedure CreateParams(var Params: TCreateParams); override;
end;
implementation
procedure TCenterEdit.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.Style := Params.Style or ES_CENTER; // 가운데 정렬
end;
end.
-------------------------------------------------------------------------
기존에 작성된 폼에서 TEdit를 TCenterEdit로 교체하는 소스입니다.
-------------------------------------------------------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, UCenterEdit; // 1. 유닛 순서는 중요하지 않음
type
TEdit = class(TCenterEdit); // 2. 클래스 바꿔치기
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
end.
-------------------------------------------------------------------------
Form1에 있는 모든 TEdit가 실행중에는 TCenterEdit로 바뀝니다.
클래스 바꿔치기라고 표현해 놓았지만 이미 정의된 클래스를 재정의하는 것입니다.
다른 유닛에 정의된 함수나 변수 뿐만 아니라 클래스도 재정의할 수 있기 때문에 이게 가능한 것이죠..
글 재주가 없어 전문적인 용어나 설명이 약간 미흡합니다. 이점 양해부탁드립니다.
제가 보기엔 두분의 방법 모두 일장일단이 있으며, 둘다 훌륭해 보이네요.
주정섭님의 방법은 클래스를 메인 폼내에서 재정의 할 필요없이 유닛의 선언 순서에 따라서 배정하면 되니 일반적으로 쓰기 편할것 같고요, (즉, 프로젝트 내에서 포괄적으로 바꾸기 좋겠네요. 각각의 버전에 따라 순서를 바꾸면 되고)
김재철님의 방법은 각 폼마다 따로따로 써야 하는 경우에 더 편리할것 같네요. 그냥 유닛 순서 안따지고 다 써준후에 각 폼에서 쓸것만 내부에서 선언해주면 되니까요.
사실, 폼내에서 클래스를 재정의하는거나, 컴파일시에 유닛 따라가다가 맨 나중 유닛에서 찾은걸로 대치하는거나 실제 실행하는데에서는 별 차이없어보일지도 모르겠네요.
이 얘기 쓰려고 저도 가입했습니다. -,.-