|
궁금이 님이 쓰신 글 :
: ToolBar에서 동적으로 생성한 TooButton을 삭제할 방법이 없을까요...???
:
: 실행중에 ToolBar에 생성된 버턴을 모두 지우고 다시 생성 할려는데
: 않되요.....
: {
: int i ;
: unsigned item , temp = 1;
:
: TToolButton *NewButton;
: TIniFile *MyConfig;
:
: /* 요부분이 말썽입니다.......................
: while(MyButtonList->Count)
: {
: delete dynamic_cast<TToolButton*>(MyButtonList->Items[0]);
: MyButtonList->Delete(0);
: }
: */
:
:
: MyConfig = new TIniFile(ChangeFileExt("MyConfig,".INI"));
: item = MyConfig->ReadInteger("ToolBar" , "Item" , 0x0007);
:
: for(i = 31 ; i >= 0 ; i--)
: {
: if(temp<<(i) & item)
: {
: NewButton = new TToolButton(ToolBar2);
: NewButton->Parent = ToolBar2;
: NewButton->ImageIndex = i;
: NewButton->Action = ActionList1->Actions[i];
: MyButtonList->Add(NewButton);
: }
: }
: delete MyConfig;
: }
임펠리테리입니다.
원인은 간단합니다. dynamic_cast는 void * 형 포인터에 적용할 수 없습니다. dynamic_cast는 내부적으로 RTTI를 이용하므로 피연산자는 반드시 클래스 정보를 갖는 클래스, 즉 TObject를 상속받는 클래스여야 합니다.
보여주신 소스에서는, 제가 보기에는 MyButtonList 리스트객체에는 툴버튼 외에 다른 객체를 넣을 일이 없어보이므로 굳이 dynamic_cast 연산을 하지 않고 C/C++ 표준 캐스팅을 해도 무방합니다. 다음과 같이 말이죠.
delete (TToolButton*)MyButtonList->Items[0];
그리고 dynamic_cast를 쓸 필요가 없는 경우라면 표준 캐스팅을 하는 것이 훨씬 빠릅니다. dynamic_cast 연산은 상당히 속도가 느린 연산이니까요.
그럼 참고하시길...
|