|
TLabel의 Caption 속성, TEdit나 TMemo 등의 Text 속성은 TControl에서 상속받은 넘이죠.
VCL 소스 중 Controls.pas에서 TControl::Caption 속성과 TEdit::Text 속성의 선언 부분을 보시면 이 두 속성이 string이
아니라 TCaption으로 선언되어 있는 것을 볼 수 있습니다. 그런데 이 두 속성이 C++빌더에서는 AnsiString으로 되어 있죠.
C++빌더용 VCL 헤더인 Controls.hpp에서는 이게 TCaption이 아닌 AnsiString으로 되어 있구요.
델파이에서 TCaption은 TCaptionProperty라는 프로퍼티 에디터에 연결되어 있는데, 이 TCaptionProperty 프로퍼티
에디터에 오브젝트 인스펙터에서 수정하면 엔터 치기 전에도 폼에 즉시 반영되도록 하는 속성이 추가 되어있습니다.
그러니까, TCaption으로 되어있어야 할 것이 AnsiString으로 된 것이 잘못된 것이라고 할 수 있습니다.
어쨌든.. 지금 필요로 하신 것은 Caption 속성을 선택하고 오브젝트 인스펙터에서 값을 입력하면 즉시 폼에 반영되는
것이니, 그렇게 하기 위해서는 새로 만드신 컴포넌트의 Caption 속성에 TCaptionProperty 프로퍼티에디터를 강제로
연결시켜주시면 됩니다.
방법은, 컴포넌트 등록하는 코드 있죠? void __fastcall PACKAGE Register() 함수 안에서, RegisterComponents() 함수
호출을 하기 전후에 다음과 같이 코드를 추가해주면 됩니다.
PPropInfo PropInfo = GetPropInfo(__typeinfo(컴포넌트이름), "Caption");
RegisterPropertyEditor(*(PropInfo->PropType), NULL, "", __classid(TCaptionProperty));
그럼...
열씸! 님이 쓰신 글 :
: 그간 거의 빌더만으로 컴포넌트를 제작해서 사용해 왔었는데,
: 얼마전 TControl 에서 상속된 속성인 Caption 에(Memo나 Edit의 Text도 마찬가지) 차이가 있는걸 발견했습니다.
:
: 제가 컴포넌트를 만들어서 TForm이나 TPanel, TLabel에 있는 Caption 처럼 Caption을 하나 노출시켰습니다.
: __property Caption; 으로 말이죠.
: 그런데, 제가 CB로 만든 컴포넌트의 Caption 은 디자인 타임에 Object Inspector 에서 Caption을 수정할 때
: 한 문자 단위로 화면에 반영이 되지 않더군요.
: 뭔가 빠뜨린게 없을까 해서, TCustomLabel을 상속해 TLabel과 똑같이 모든 프로퍼티를 노출시킨 컴포넌트를
: 만들어 테스트 해 봤지만, 역시나 Object Inspector에서 변경해도
: TLabel처럼 한 문자씩 반영되지 않고, 엔터를 치거나 포커스가 이동되는 식으로 입력이 종료되어야
: 디자인타임의 폼에 적용되더군요.
:
: 이리 저리 다른 사람들의 BCB로 제작한 컴포넌트를 찾아봤지만 BCB로 제작된 컴포넌트 자체가 많지가 않고,
: Caption과 같은 멤버를 가진 컴포넌트는 더더욱 드물어서 아직까지 오리무중입니다.
:
: 혹이나 해서 델파이로 여러 컴포넌트를 만들어 보니, 델파이로 작성한 녀석들은 잘만 되네요.
:
: 보다 완성도 있는 컴포넌트를 작성하고 싶은 욕심에, 디자인 타임의 편의를 제공해 주고 싶은데
: Caption과 같은 멤버가 문자단위로 변경이 적용되지 않으니 답답하군요.
:
: 이 부분에 대해 아시는 분 답변 주시면 감사하겠습니다. ^0^;;
|