|
어려우셨다니 죄송하네요..
이미 해결했으니 상관은 없겠지만
어려웠다고 하니 간단한 설명을 넣도록 하겠습니다.
비슷한 이름의 여러 콤포넌트를 사용하는 다른 부분에서도 도움이 많이 될 것입니다.
두개의 RadioGroup를 폼에 둡니다.
그럼 각각의 Name이 RadioGroup1과 RadioGroup2가 될 것입니다.
여기서 RadioGroup1의 OnClick이벤트를 마우스로 더블클릭합니다.
그럼 코드가 만들어지겠지요?
거기에 코드를 넣고 RadioGroup2의 OnClick이벤트는 더블클릭하지 마시고
콤보박스를 열어서 RadioGroup1Click이라는 이벤트와 연결합니다.
해당영역에 들어가는 코드는...
TRadioGroup* tmp = dynamic_cast<TRadioGroup*>(Sender);
-> 메시지를 발생시킨 객체가 TObject* Sender를 통해서 핸들러함수로 전달이 됩니다.
-> 여기서 이 함수를 호출하는 콤포넌트는 TRadioGroup클래스의 인스턴스이므로
-> Sender를 TRadioGroup로 타입캐스팅을 합니다.
-> 보통은 TRadioGroup* tmp = (TRadioGroup*)Sender; 라고 많이 하지요.
-> 그런데 dynamic_cast라는 매크로는 캐스팅할 수 없는 경우는 NULL을 리턴합니다.
-> 따라서 호출한 객체의 타입에 따라서 실행여부를 결정할 수 있도록
-> 캐스팅이 제대로 되는 지 확인을 해 볼 수 있겠죠?(여기서는 생략했지만...)
-> 간단히 예를 들자면
-> TRadioGroup* tmp = dynamic_cast<TRadioGroup*>(Sender);
-> if(tmp == NULL) return;
int idx = 3 - String(tmp->Name.AnsiLastChar()).ToInt();
-> tmp->Name은 RadioGroup1 이나 RadioGroup2 의 값을 가지게 되는 AnsiString 변수입니다.
-> 이 값의 마지막 캐릭터를 읽고(AnsiLastChar()) 그 값을 정수형으로 변환합니다.(ToInt())
-> 그럼 1 또는 2가 나오게 되겠지요?
-> 3 - (위의값)을 하게 되면 RadioGroup1에서 클릭한 경우에는 idx 가 2가 되고
-> RadioGroup2에서 클릭한 경우에는 idx 가 1이 됩니다.
if(RadioGroup1->ItemIndex == RadioGroup2->ItemIndex)
{
tmp = (TRadioGroup*)FindComponent(String("RadioGroup") + IntToStr(idx));
tmp->ItemIndex = -1;
}
-> FindComponent는 인자로 해당 객체의 이름을 주면 그 객체의 포인터를 반환하는 함수입니다.
-> 말 그대로 이름을 이용하여 객체를 찾아주는 함수죠.
-> 즉...RadioGroup1에서 호출한 경우에는 RadioGroup2를 반환하도록 하는 거죠
-> 다음으로 ItemIndex를 -1로 주면 아무것도 선택되지 않도록 합니다.
|