|
또아리 님이 쓰신 글 :
: 빌더 초짜인데요..질문이 있어서 질문좀 드릴려구요..
:
: 왼쪽에 트리뷰를 만들고 오른쪽에 해당폼을 번갈아 가면서 표시하고 싶은데요..
: 탐색기 같은거죠..트리뷰가 있고 해당 아이템을 클릭하면 해당 페이지가 호출되게 하는..........물론 메인폼에서
: 이걸 어떻게 해결해야 할지 모르겠어요..
:
: 임프님이 팁란에 적어놓은대로 오른쪽에 패널을 놓고 그안에 폼을 집어 넣긴했는데....워낙 폼이 많은데 상관없을까요?
: 한 100개정도....도와주세요...
많은 수의 폼 또는 판넬들을 특정 메뉴에 따라 보이게 또는 않보이게 하려면, 일일이 해당 메뉴 선택시 관련된 컴포넌트를 Show(), Hide() 함수 호출하기는 삽질이겠죠? :-)
저는 삽질을 줄여보고자 메뉴에 사용되는 폼 또는 판넬들을 목록으로 만들어 관리합니다.
TComponentList 등을 이용해서 폼/판넬들을 등록하고, 원하는 폼/판넬을 검색하여 Show() 함수를 호출하고,
나머지는 Hide() 함수를 호출하도록 하였습니다.
그것을 또 코딩할 때 알아보기 쉽도록 std:map을 이용하여 메뉴 목록을 만들어 사용중입니다.
class TUIForm : public TForm
{
private:
/*** 생략 ***/
enum EMENU
{
MENU_SYSTEM=0,
MENU_ALARM_LIST,
MENU_EVENT_LIST,
MENU_SETUP
};
std::map<EMENU,TComponent*> menu_map;
/*** 생략 ***/
void __fastcall ViewMenu(EMENU _menu);
};
//---------------------------------------------------------------------------
__fastcall TUIForm::TUIForm(TComponent* Owner)
: TForm(Owner)
{
menu_map[MENU_SYSTEM]=SystemPanel;
menu_map[MENU_ALARM_LIST]=AlarmListPanel;
menu_map[MENU_EVENT_LIST]=EventListPanel;
menu_map[MENU_SETUP]=SetupPanel;
}
//---------------------------------------------------------------------------
void __fastcall TUIForm::ViewMenu(EMENU _menu)
{
try
{
std::map<EMENU,TComponent*>::iterator iterator=menu_map.find(_menu);
if(iterator==menu_map.end()) return;
TCustomControl* view=dynamic_cast<TCustomControl*>(iterator->second);
if(view!=NULL)
{
view->Show();
view->BringToFront();
}
for(std::map<EMENU,TComponent*>::iterator iterator=menu_map.begin();
iterator!=menu_map.end(); ++iterator)
{
if((iterator->first)!=_menu)
{
TCustomControl* hide=dynamic_cast<TCustomControl*>(iterator->second);
if(hide!=NULL)
{
hide->Hide();
}
}
}
if(view!=NULL)
{
view->Update();
}
} catch(...)
{
}
}
//---------------------------------------------------------------------------
void __fastcall TUIForm::MainToolButton1Click(TObject *Sender)
{
ViewMenu(MENU_SYSTEM);
}
//---------------------------------------------------------------------------
|