Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[200] 기존 콤포넌트를 다른 콤포넌트로 대체하는 방법
김재철 [babois] 5205 읽음    2006-09-13 16:47
강좌/문서 게시판에 있는 주정섭님의 글을 읽고 제 나름대로의 다른 방법을 정리해봅니다.
이 글을 읽으시기 전에 해당 게시물을 먼저 읽어보세요.

임포스터 클래스를 쓸려는 목적이...
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로 바뀝니다.
클래스 바꿔치기라고 표현해 놓았지만 이미 정의된 클래스를 재정의하는 것입니다.
다른 유닛에 정의된 함수나 변수 뿐만 아니라 클래스도 재정의할 수 있기 때문에 이게 가능한 것이죠..

글 재주가 없어 전문적인 용어나 설명이 약간 미흡합니다. 이점 양해부탁드립니다.
Jay [lebon]   2006-09-14 04:21 X
두분의 좋은 의견 잘 읽었습니다.
제가 보기엔 두분의 방법 모두 일장일단이 있으며, 둘다 훌륭해 보이네요.

주정섭님의 방법은 클래스를 메인 폼내에서 재정의 할 필요없이 유닛의 선언 순서에 따라서 배정하면 되니 일반적으로 쓰기 편할것 같고요, (즉, 프로젝트 내에서 포괄적으로 바꾸기 좋겠네요. 각각의 버전에 따라 순서를 바꾸면 되고)
김재철님의 방법은 각 폼마다 따로따로 써야 하는 경우에 더 편리할것 같네요. 그냥 유닛 순서 안따지고 다 써준후에 각 폼에서 쓸것만 내부에서 선언해주면 되니까요.
사실, 폼내에서 클래스를 재정의하는거나, 컴파일시에 유닛 따라가다가 맨 나중 유닛에서 찾은걸로 대치하는거나 실제 실행하는데에서는 별 차이없어보일지도 모르겠네요.

이 얘기 쓰려고 저도 가입했습니다. -,.-

+ -

관련 글 리스트
200 기존 콤포넌트를 다른 콤포넌트로 대체하는 방법 김재철 5205 2006/09/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.