|
ghost 님이 쓰신 글 :
: 예를 들면... MRU Folder를 나타내는 메뉴 아이템은 디자인타임에는
: 비어 있고 실행할 때 레지스트리 등에서 읽어와서 만들게 되쟎아요..
:
: 당연하겠지만 빌더에서는 메뉴 아이템이 없으니까 Object Inspector에서
: 메뉴 아이템의 OnClick 핸들러를 자동으로 만들지도 못하더군요.
:
: 직접 메시지 맵을 만들어야 하나요?
: 더 좋은 방법이 있을 것 같은데 알려주세요.
:
원하는 답인지 모르겠군요.
팝업 메뉴의 개별 항목은 TMenuItem 형입니다. 그리고 TMenuItem에는 OnClick 이밴트가 미리 준비되어 있습니다. 응용 프로그래머는 이 이밴트를 원하는 작업을 하는 메서드(이밴트 핸들러)와 연결해 주기만 하면됩니다. 오브잭트 인스팩터에서 설계할 때는 메뉴 항목을 더블클릭했을 때 자동으로 이밴트핸들러의 틀을 작성 및 연결해줍니다. 하지만 실행시에 연결하려면 사용자가 직접 해주어야 합니다. 즉, 이밴트 핸들러 선언과 작성, 그리고 이밴트와의 연결 작업 모두를 프로그래머가 직접 해주어야 합니다.
아래와 같이 하면 됩니다.
헤더 파일에서:
class TForm1:TForm
{
TPopupMunu *PopupMenu1; //프로그래머 또는 IDE
TMenuItem *pmnuItem; //프로그래머가
void __fastcall pmnuItemClick(TObject *Sender);// 원형은 유지하되 이름은 마음대로
};
유닛 파일에서:
void __fastcall TForm1::pmnuItemClick(TObject *Sender)
{
//여기에 원하는 코드를 작성
//한편 여러 메뉴 항목들이 이 메서드(이밴트 핸들러)를 공유하는 경우
//각 메뉴 항목을 구별하려면 TMenuItem *item = (TMenuItem *)Sender로 형변환 한 다음
//item->Name, item->Caption, item->MenuIndex 등을 비교하면 되겠죠.
//그리고 TMenuItem이 아닌 다른 객체가 이 메서드를 호출할 염려가 있다면
//if(String(Sender->ClassName())!="TMenuItem")으로 검사하면 됩니다.
}
그리고 동적으로 메뉴 항목을 만드는 메서드에서는 아래와 같이 합니다.
{
pmnuItem = new TMenuItem(this);
pmnuItem->Name = "pmnuItem1"; //지정 안 해도 됨
pmnuItem->Caption="Click Me";
pmnuItem->OnClick = pmnuItemClick;
PopupMenu1->Items->Add(pmnuItem);
// 또는 PopupMenu1->Items->Insert(위치, pmnuItem);
}
-----------------------------------------------------------------
참고:
TMenuItem은 하위(서브) 메뉴 항목(TMenuItem)을 가질 수 있습니다.
Top 메뉴 항목에 하위 메뉴 항목을 만들려면
PopupMenu1->Items->Items[index]->Add(TMenuItem *); 형식으로 하면 됨.
그리고 위에서 만든 하위 메뉴에 다시 또 하위 메뉴를 만들려면
PopupMenu1->Items->Items[index]->Items[index2]->Add(pmnuItem);
(메뉴 항목에 이름을 붙이는 경우에는 모든 메뉴 항목의 이름이 서로 달라야 합니다.)
끝.
|