2015-01-20 6 views
0

사용자의 상태에 따라 특정 메뉴 항목을 선택적으로 활성화해야합니다. 내가 원하는 실제 항목을 사용할 수 있도록 코드를 가져 왔지만 다중 레벨 메뉴에서 사용할 수있는 각 상위 메뉴 항목을 모두 활성화하는 방법을 볼 수 없습니다. 메뉴 항목을 활성화하지 않으면 사용자가 연결할 수 없으므로 메뉴 항목을 계속 사용할 수 없습니다.프로그래밍 방식으로 메뉴 항목 (및 모든 부모) - Delphi

예를 들어 내가

EditTop 
    EditSub1 
    Editsub2 
     EditSubSub1 
    EditSub3 

이 있다면 나는 EditSubSub1을 활성화 할 수 있지만 나 또한 그러므로뿐만 아니라 Editsub2 및 EditTop를 활성화해야하거나 사용자에 의해 도달 할 수 없습니다. 그게 내가 도와 주셔서 감사합니다.

나는 순간에이 코드가있는 모든 것을 사용하지

우선 몇 가지 코드 (다른 코드 나에게 메뉴 I이 사용하려는 이름이 포함 된 TStringList를 주신 가정) 다음. 검색 및 이름 에 기초한 TmenuItem을 반환

procedure DisableMenu(AMenu: TMenuItem); 
//recurses through all the menu and disables eveything 
var 
    i: integer; 
begin 
for i := 0 to AMenu.Count - 1 do 
    begin 
    AMenu[i].enabled := false; 
    DisableMenu(AMenu[i]); 
    end; 
end; 

다음 코드는 마지막 코드 나는 몇 가지 도움이 필요

function FindMnuItem(Menu: TMenu; MenuName: string): TMenuItem; 

     procedure FindSubItems(mnuItem: TMenuItem); 
     var i: integer; 
     begin 
     for i:=0 to mnuItem.Count- 1 do 
      if mnuItem.Items[i].Name= MenuName then 
      begin 
      Result:= mnuItem.Items[i]; 
      break; 
      end 
      else 
      FindSubItems(mnuItem.Items[i]); 
     end; 

var i: integer; 
begin 
Result:= nil; 
for i:= 0 to Menu.Items.Count -1 do 
    begin 
    if Menu.Items[i].name = MenuName then 
     begin 
     Result:= Menu.Items[i]; 
     break; 
     end 
    else 
     if Result<> nil then 
      break 
     else 
      FindSubItems(Menu.Items[i]); 
    end; 
end; 

(이 http://www.delphipages.com/forum/showthread.php?t=45723에서왔다). 이렇게하면 Stringlist AllowedMenus의 이름을 기반으로 각 메뉴 항목을 선택적으로 사용할 수 있지만 트리의 각 항목 위에있는 메뉴 항목이 아닌 해당 메뉴 항목 만 사용할 수 있습니다. 어떻게해야합니까?

//first disable all menu items 
DisableMenu(MainMenu1.Items); 
//now enable the ones we want enabled  
for i := 0 to AllowedMenus.count-1 do 
    begin 
    MenuName := AllowedMenus[i]; 
    FindMnuItem(MainMenu1, MenuName).Enabled := true; //enable an item 
    end 
+0

액션을 사용하고 각 작업에 대해 OnUpdate 이벤트 처리기를 작성하면됩니다. –

답변

3

TMenuItem.Parent 속성을 사용하여 메뉴 트리를 탐색하면됩니다.

var vMenuItem : TMenuItem; 
[...] 
//first disable all menu items 
    DisableMenu(MainMenu1.Items); 
    //now enable the ones we want enabled  
    for i := 0 to AllowedMenus.count-1 do 
    begin 
     MenuName := AllowedMenus[i]; 
     vMenuItem := FindMnuItem(MainMenu1, MenuName); 
     while Assigned(vMenuItem) do 
     begin 
     vMenuItem.Enabled := true; //enable an item 
     vMenuItem := vMenuItem.Parent; 
     end; 
    end 
+0

고맙습니다. 해결책은 분명합니다. – user2834566

0

나는이 기능을 사용할 수 있다고 생각합니다. (D21은 실제 항목 임) :

procedure UpdateMenuParent(MyItemMenu: TMenuItem); 
begin 
    TMenuItem(MyItemMenu).Enabled := true; 
    if TMenuItem(MyItemMenu).Parent <> nil then 
    UpdateMenuParent(TMenuItem(MyItemMenu).Parent); 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    UpdateMenuParent(D21); 
end; 
+0

감사합니다. 나는 Ken에게 대답을했습니다. 그가 먼저 거기에 도착했을 때 그의 대답은 제가 이미 작성한 코드를 직접 사용했기 때문입니다. – user2834566