|
[서론]
TMainMenu는
각 메뉴가 TreeView처럼 tree구조로 되어있습니다.
TTreeView에서는 각 node가 TTreeNode 였는데...
TMainMenu에서는 각 메뉴가 TMenuItem 입니다.
MenuItem을 찾기만 하면 그다음은 Enable/Disable 시키거나
Visible=true/false시키는것은 원하는대로 하시면 되겠죠
[메뉴아이템을 찾는 방법]
1. MenuItem이름으로 찾기
1.1 가장 쉬운 방법으로 FindComponent를 쓰시면 됩니다.
TMenuItem *mnu;
mnu=(TMenuItem *)FindComponent("파일");
if(mnu)
{
mnu->Enabled=true;
mnu->Visible=true;
}
1.2 ...
2. 메뉴의 Caption으로 찾기
; 메뉴의 caption으로 찾는것은 caption이 유일한 값이어야 겠죠?
2.1
앞에 서론에서 말한 tree구조를 따라가면서 for문을 돌리면 찾을수 있을것입니다.
TMenuItem * __fastcall TForm1::FineSubMenu(TMenuItem *pMnu,String sCaption)
{
TMenuItem *mnu;
for(int i=0;i<pMnu->Count;i++)
{
mnu=pMnu->Items[i];
if(mnu->Caption==sCaption)return mnu;
if(mnu->Count>0)
{
mnu=FineSubMenu(mnu,sCaption);
if(mnu!=NULL)return mnu;
}
}
return NULL;
}
TMenuItem * __fastcall TForm1::FineMainMenu(String sCaption)
{
TMenuItem *mnu;
for(int i=0;i<MainMenu1->Items->Count;i++)
{
mnu=MainMenu1->Items->Items[i];
if(mnu->Caption==sCaption)return mnu;
if(mnu->Count>0)
{
mnu=FineSubMenu(mnu,sCaption);
if(mnu!=NULL)return mnu;
}
}
return NULL;
}
//사용법
TMenuItem *mnu;
mnu=(TMenuItem *)FineMainMenu("파일");
if(mnu)
{
mnu->Enabled=true;
mnu->Visible=true;
}
2.2
Components , ComnponentCount를 이용하여
//Form위의 모든 component를 loop 돌리면서 체크
//loop횟수는 2.1방법보다 많아질수 있지만 .. 재귀 for문을 안써도 됨
TMenuItem * __fastcall TForm1::FineMainMenu2(String sCaption)
{
TMenuItem *mnu;
for(int i=0;i<ComponentCount;i++)
{
if(Components[i]->ClassNameIs("TMenuItem")) //component중에 TMenuItem인것을 찾는다.
{
mnu=(TMenuItem *)Components[i];
if(mnu->Caption==sCaption)return mnu;
}
}
return NULL;
}
//이방법에는 TMainMenu 의 메뉴가 TPopupMenu의 메뉴와 캡션이 같은게 있으면 문제가 될수있음
// 체크하는 루틴이 또 필요합니다.
//간단히 할수는 있는데.. 그부분은 직접해보세요
[추신]
개인적으로..
권한에 따른 메뉴설정이 복잡하지 않으며
Menu의 Tag값에다가 권한 번호를 주고
db에서 auth값( int 값)을 읽어와서 tag값과 auth값을 비교해서 설정하는 방법으로 쓰기도 합니다.
그럼..
이성희 님이 쓰신 글 :
: MainMenu 제어하는 방법을 찾아보다 답이 보이질 않아서 이렇게 글을 올립니다.
: 현재 프로그램은 완성을 했는데 접속하는 ID마다 프로그램 접금 권한을 다르게 하려고 합니다
:
: 그래서 특정 ID는 메뉴 자체가 않보이게 막거나 실행 못시키게 막으려 하는데 방법을 모르겠습니다.
: 현재 ID별로 메뉴목록을 따로 저장하고 접근가능 유무를 저장했습니다.
: 접근권한 Table에는 메뉴항목의 Name/Caption 을 저장했습니다.
:
: 그런데 저장된 이내역을 활용을 할 수가 없어서 답답해서 글을 올립니다.
: 부디 고수님들의 많이 조언 부탁드립니다.
:
: 그럼 수고하세요^^*
|