C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[53193] Re:[질문]MainMenu 컨트롤방법
장성호 [nasilso] 1492 읽음    2008-04-21 11:44
[서론]
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 을 저장했습니다.
:
: 그런데 저장된 이내역을 활용을 할 수가 없어서 답답해서 글을 올립니다.
: 부디 고수님들의 많이 조언 부탁드립니다.
:
: 그럼 수고하세요^^*

+ -

관련 글 리스트
53190 [질문]MainMenu 컨트롤방법 이성희 1153 2008/04/21
53193     Re:[질문]MainMenu 컨트롤방법 장성호 1492 2008/04/21
53198         Re:Re:[질문]MainMenu 답변감사합니다 이성희 1713 2008/04/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.