|
CBuilder Component Class들은 상속형 입니다.
예를들어 TEdit를 보면
TObject - TPersistent - TComponent - TControl - TWinControl - TCustomEdit
를 차례로 상속 받습니다.
또한 모든 component class 는 공통적으로 TComponent 이상의 (TComponent 포함) class를 상속 받으므로 TComponent로 모든 component는 casting이 됩니다..
여기서 casting이라는것은?? (이게 질문이시죠?)
casting이란 형변환입니다.
다음을 보면
int a = 10;
double b;
b = a; 이럴경우는 값을 변환하는 거지만 사실 형변환도 됩니다.
즉
b = (double ) a ; 이렇게 해야 원래의 규칙에 맞겠죠..
이런 형식으로 pointer class역시 형변환할 수 있습니다.
다음을 보시면.
TEdit *a = new TEdit(Owner);
void *b = (void *)a;
TEdit *c = (TEdit *)b;
이렇게 하면 c 는 결국 a를 지칭합니다. 이과정에서 형변환(type casting)이 들어 갑니다.
그럼 component의 경우 상속되는 형식이므로
어떠한 component든 TComponent를 상위 클래스로 갖고 있읍니다.
가령 두개의 컴포넌트가 있다고 합니다.
(TEdit 와 TComboBox)
TEdit *a;
TComboBox *b;
위의것들이 메모리에 할당 되어 있다고 본다면.
TComponent *aa = (TComponent *)a;
TComponent *bb = (TComponnet *)b;
이렇게 casting 한다면 aa 와 bb는 서로 같은 레벨(TComponent 까지)의 부모수준에서
같은 메모리의 구조를 갖습니다.
해당 component의 help를 보시면 Hierarchy별 method 와 property 가 구본되어 나오니
참고하셔서 사용하시면 됩니다.
간단한 예로 다음코드를 보시면 가장 쉬을듯..
TEdit 와 TComboBox 가 같은 OnChange Event로 묶여 있다면
해당 event로 TObject *Sender가 올겁니다.
{
TComponent *p = (TComponent *)Sender; // casting 합니다.
AnsiString name = p->ClassName(); // class name취득합니다.
if(name=="TEdit"){
TEdit *pe = (TEdit *)p;
// TEdit로서 처리
}
if(name=="TComboBox"){
TComboBox *pc = (TComboBox *)p;
// TComboBox로서 처리
}
// 기타 다른 컴포넌트를 연결하심 계속 이어 나가시면 되고요..
// 공통 데이터 tag 라든지 Name 이라든지 하는것들은 궂이 해당 Combonent로 취득하지않고
// 공통 부모 클래스로 casting하신후 사용하심 됩니다.
}
|