저작권에 대한 공지
이 문서에 포함된 모든 글과 소스 코드는 작자인 저 김성동의 지적 재산이지만 무단으로 배포하거나 책이나 강의 교재등을 위한 복제 등 저작권을 저해하는 행위를 제외하고는 자유롭게 사용할 수 있습니다.
또한 이 페이지에 대한 링크는 자유롭게 할 수 있으나 전문을 전제하는 일은 허용하지 않습니다.


1.4. 프로퍼티 카테고리(Property Category)

1.4.1. 개요
델파이 5에서 새롭게 소개된 개념 중에 프로퍼티 카테고리가 있다. 델파이 오브젝트 인스펙터는 아래 그림처럼 콤포넌트의 프로퍼티를 카테고리별로 분류해서 특정 카테고리에 속한 프로퍼티들을 선택적으로 숨기거나 보이게 할 수 있다. 새로 개발한 콤포넌트를 등록할 때 각 프로퍼티를 특정 카테고리에 등록시킬 수 있다. 프로퍼티 카테고리는 RegisterPropertyInCategory와 RegisterPropertiesInCategory 함수를 이용해서 등록한다. 하나의 프로퍼티를 등록할 대는 RegisterPropertyInCategory를 사용하고 여러 개의 프로퍼티를 한꺼번에 등록할 때는 RegisterPropertiesInCategory를 사용한다. 이들 함수는 dsgnintf.pas에 정의되어 있다. 새로 개발된 콤포넌트의 프로퍼티는 특별히 지정하지 않는 한 기본적으로 TMiscellanousCategory에 속하게 되어 있으며 델파이는 13개의 프로퍼티 카테고리 클래스를 가지고 있다. 프로퍼티를 카테고리에 등록할 때 이들 13개의 기본 카테고리 클래스를 사용하거나 이들 클래스에서 상속 받아서 새로운 카테고리를 만들어 사용할 수 있다.

그림 1-8 프로퍼티 카테고리


1.4.2. 프로퍼티 카테고리 클래스
델파이는 기본적으로 사용할 수 있는 12개의 프로퍼티 클래스를 제공한다. 아래 표는 이들 카테고리를 나타내었다.

표 1-3 기본 프로퍼티 카테고리
카테고리설명
TActionCategory실행 시 Action과 관련된 프로퍼티(Action, Caption, Enabled 등)
TDatabaseCategory데이터베이스 조작에 관련된 프로퍼티(DatabaseName, TableName, SQL 등)
TDragNDropCategoryDrag/Drop 과 관련된 프로퍼티(DragCursor, DragMode, DockSite 등)
THelpCategory도움말 이나 Hint 관련 프로퍼티(HelpContext, HelpFile, Hint, ShowHint 등)
TLayoutCategory설계 시에 콤포넌트의 시각적인 표현과 관련된 프로퍼티(Align, Top, Left, Anchors, Constraints 등)
TLegacyCategory거의 사용되지 않은 프로퍼티(Ctl3D, ParentCtl3D, OldCreateOrder등)
TLinkageCategory다른 콤포넌트를 연결하는 프로퍼티(Menu, ActiveControl, Menu, Popupmenu, DataSet 등)
TLocaleCategory로케일과 관련된 프로퍼티(BidiMode, ParentBiDiMode 등)
TLocalizableCategory지역화할 대상이 되는 프로퍼티(Text, Caption, Hint 등)
TMiscellaneousCategory분류할 필요가 없거나 속하는 카테고리가 없는 기타 프로퍼티(AllowAllUp, Name, DefaultMonitor, PixelsPerInch, Tag 등)
TVisualCategory실행 시 콤포넌트의 시작적인 표현과 관련된 프로퍼티(Align, Visible, Font, Color, Scaled 등)
TInputCategory데이터 입력과 관련된 프로퍼티(Enabled, ReadOnly, AutoScroll, KeyPreview 등)


새로운 프로퍼티 카테고리를 만들려면 위에서 설명한 12개의 클래스나 TPropertyCategory에서 상속 받아서 만들면 된다. 새 프로퍼티 카테고리를 만들 때 Name 가상 메소드를 오버라이드 해서 새로 만든 카테고리의 이름을 지정해 준다. 예를 들어 TMyCategory 이라는 카테고리를 만들었으면 아래와 같이 Name 메소드를 오버라이드 해서 카테고리의 이름을 "My Category" 라고 지정해 준다. 이 이름은 오브젝트 인스펙터에서 카테고리를 표시할 때 사용한다.

type
  TMyCategory = class(TPropertyCategory)
  public
    class function Name: string; override;
  end;

{ 생략 }

implementation

{ 생략 }

class function TMyCategory.Name : string;
begin
  Result := 'My Category';
end;


1.4.3. 카테고리 등록
하나의 프로퍼티 카테고리를 등록할 때는 RegisterPropertyInCategory 함수를 사용한다. 이 함수는 아래 선언처럼 4 가지 종류의 인자 리스트를 가지도록 오버로드되어 있다.

function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;
  const APropertyName: string): TPropertyFilter; overload;
function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;
  AComponentClass: TClass; const APropertyName: string): TPropertyFilter; overload;
function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;
  APropertyType: PTypeInfo; const APropertyName: string): TPropertyFilter; overload;
function RegisterPropertyInCategory(ACategoryClass: TPropertyCategoryClass;
  APropertyType: PTypeInfo): TPropertyFilter; overload;


첫번째는 카테고리 클래스와 프로퍼티 이름을 인자로 가지며 모든 콤포넌트의 APropertyName 프로퍼티를 ACategoryClass에 등록해 준다. 두번째는 카테고리 클래스, 콤포넌트 클래스, 프로퍼티 이름을 인자로 가지며 모든 콤포넌트가 아니고 지정한 콤포넌트 클래스의 프로퍼티에 대해서만 등록해 준다. 세번째는 카테고리 클래스, 형 정보, 프로퍼티 이름을 인자로 가지며 지정한 형의 프로퍼티를 등록해 준다. 네번째는 카테고리 클래스와 형 정보만을 인자로 가지며 지정 형을 가지는 모든 프로퍼티를 등록해 준다. 아래 코드들은 각 함수의 사용 예제이다.

RegisterPropertyInCategory(TMyCategory, 'About');
RegisterPropertyInCategory(TMyCategory, TMyLabel, 'About');
RegisterPropertyInCategory(TMyCategory, TypeInfo(string), 'About');
RegisterPropertyInCategory(TMyCategory, Typeinfo(string));


첫번째는 모든 콤포넌트의 About 프로퍼티를 TMyCategory에 등록해 주고 두번째는 TMyLabel 클래스나 그 자손 클래스의 About 프로퍼티를 TMyCategory에 등록해 준다. 그리고 세번째는 모든 콤포넌트의 About 프로퍼티 중 형이 string인 것만 등록되고 마지막으로 네번째는 string 형의 모든 프로퍼티를 TMyCategory에 등록해 준다.

한번에 여러 개의 프로퍼티를 등록할 때 사용하는 RegisterPropertiesInCategory 함수는 아래와 같이 3 가지 종류의 인자 리스트를 가지도록 오버로드되어 있다.

function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;
  const AFilters: array of const): TPropertyCategory; overload;
function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;
  AComponentClass: TClass; const AFilters: array of string): TPropertyCategory; overload;
function RegisterPropertiesInCategory(ACategoryClass: TPropertyCategoryClass;
  APropertyType: PTypeInfo; const AFilters: array of string): TPropertyCategory; overload;


첫번째는 프로퍼티 이름만 가지고 카테고리를 연결해 주며 두번째는 프로퍼티 이름과 콤포넌트 클래스, 세번째는 프로퍼티 이름과 형 정보를 가지고 등록한다.
아래 코드는 각각의 함수에 대한 사용 예제이다.

RegisterPropertiesInCategory(TMyCategory, ['About', 'Caption' ]);
RegisterPropertiesInCategory(TMyCategory, TMyLabel, ['About', 'Caption']);
RegisterPropertiesInCategory(TMyCategory, TypeInfo(string), ['About', 'Caption']);


1.4.4. IsPropertyInCategory 함수
특정 프로퍼티가 어느 카테고리에 속하는 지를 알고 싶을 때는 IsPropertyInCategory 함수를 사용한다. 이 함수도 2 가지 종류의 인자 리스트를 가지도록 오버로드 되어 있는데 첫번째는 콤포넌트 클래스와 프로퍼티 이름, 두번째는 콤포넌트 클래스의 이름과 프로퍼티 이름을 가지고 검사한다.
아래는 간단한 사용 예제이다.

IsItThere := IsPropertyInCategory(TMyCategory, TMyLabel, 'About');
IsItThere := IsPropertyInCategory(TMyCategory, 'TMyLabel', 'About');


다음으로 PropertyCategoryList 함수는 TPropertyCategoryList 형의 데이터를 반환하는데 이 형은 현재 사용 가능한 모든 프로퍼티 카테고리 클래스의 리스트를 가지고 있다.


저작권에 대한 공지
이 문서에 포함된 모든 글과 소스 코드는 작자인 저 김성동의 지적 재산이지만 무단으로 배포하거나 책이나 강의 교재등을 위한 복제 등 저작권을 저해하는 행위를 제외하고는 자유롭게 사용할 수 있습니다.
또한 이 페이지에 대한 링크는 자유롭게 할 수 있으나 전문을 전제하는 일은 허용하지 않습니다.