Form의 Components 배열에서 루프돌면서 Caption변경하는것은
괜찮은 방법중 하나입니다.
하지만 몇가지 고려할 사항이 있습니다.
[ 고려사항 ]
1. Component라고 모두 다 Caption이라는 Property가 있는것은 아닙니다.
VCL에서는 Socket / Comport 등과 같이 화면에 보이지 않는것도 모두 TComponent를 상속받아 만들어 지니까요~!
Caption프로퍼티가 있는 놈은 TControl을 상속받은 모든 Control 입니다.
단 가시성이 protected로 되어있어서, 상속받은 자식 class에서 public으로 open한 control만 보인는 것이죠
그러므로..
Components[i] 배열에 들어있는 놈이 TContol을 상속받았는지 받지 않았는지 체크를 해야합니다.
2. Caption과 Text는 같은 Property 입니다.
TEdit나 TMemo 등과 같은 Component에는 Caption이라는 프로퍼티가 없습니다.
하지만 TEdit를 TControl로 cast해서 Caption을 변경하면 어떻게 될까요?
class TOpenControl : public TControl
{
public:
__property Caption;
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
((TOpenControl *)Edit1)->Caption="Edit의 Text가 바뀜";
((TOpenControl *)Memo1)->Caption="Memo의 Text가 바뀜";
}
//---------------------------------------------------------------------------
위와같이 Edit1의 Caption을 변경하면 Edit1의 Text가 변경되어 버립니다.
즉 TEdit나 TMemo같은 Control에는 Text 와 Caption은 이름만 다르지 같은 property입니다.
이런 Control인 경우는 예외 처리해야 겠죠??
3.TControl을 상속받지 않았는데 Caption 프로퍼티가 있는 경우
기본적으로 Caption프로퍼티는 TControl을 상속받은 Control에 모두 있는데요
TControl을 상속받지 않은 Component에도 Caption이 있는 경우가 있습니다.
대표적인 것이 TMenuItem 입니다.
이런 경우도 고려해야겠죠~!
========================================================================
RTTI를 이용해서
Componet에 "Caption"이라는 이름의 프로퍼티가 있는지 없는지 체크하고 변경하는 방법이 있습니다.
이런 방법을 쓰는게 좀더 범용적이겠죠
문론 TEdit같은 것은 예외 처리해야할 것이구요
그럼..
happymin 님이 쓰신 글 :
: 안녕하세요...
:
: Caption을 사용자에 따라 변경해 주려고 하는데
: 보통 어떤방식을 사용하시는지 궁금해서 여쭈어봅니다.
:
: 저는 Code.txt파일에 001,어쩌구저쩌구...
: 이런식으로 저장하고
: contorl의 Tag에 해당 번호를 넣고
: 폼 Show 하기전이나 할때
: Form의ComponentCount/Components[i]를 이용해
: Caption을 넣고 있습니다.
:
: 감사합니다...(--)(__)