2013-10-29 35 views
1

使用菜单项没有更新其禁用状态:德尔福XE2,32位Windows VCL窗体应用程序ActionMainMenuBar后手动添加行动项目

在ActionManager,我已经添加了一个动作,并指定类别名称。然后将ActionManager中的类别拖放到表单上的ActionMainMenuBar中。我这样做了在ActionMainMenuBar上创建菜单项。因为我打算通过代码手动创建和添加动作,并且没有真正用于“第一”动作,所以我通过设置Visbile := False来隐藏它。

但是,在运行时,即使在编程创建操作并将它们添加到菜单后,菜单仍处于禁用状态 - 这是不期望的,因为添加的操作已启用且具有有效的OnExecute事件处理程序。

我的问题是如何刷新菜单项,以便在添加一个或多个操作项(子菜单项)后启用它?

在代码中,我有这样的:

// Create menu for each session in the Session menu 
    // eg. Session 1, Session 2, Session 3 etc. 
    var 
    p: Integer; 
    s: String; 
    begin 
    // this code executes a number of times ie in a loop 
    p := Pos(' ', s); 
    a := TAction.Create(actMgr); 
    a.Category := 'Session'; 
    a.Name := 'actSession' + Copy(s, p + 1, Length(s) - p); 
    a.Caption := 'Session ' + Copy(s, p + 1, Length(s) - p); 
    a.Enabled := True; 
    a.OnExecute := actSessionExecute; 

    p := ActionMainMenuBar1.ActionClient.Items[3].Items.Count - 1; 
    actMgr.AddAction(a, ActionMainMenuBar1.ActionClient.Items[3].Items[p]); 

    end; 


    procedure TfMain.actSessionExecute(Sender: TObject); 
    begin 
    showmessage(TAction(Sender).Name); 
    end; 

这里是ActionMainMenuBar,所述ActionManager和初始动作(其具有可见设置为false)的屏幕捕获,在设计模式:

This is what it looks like initially in design mode

TIA。

回答

0

在添加您的操作项目后调用ActionMainMenuBar1.ActionClient.Items[3].CommandStyle := csMenu;将强制重新创建Commandproperties,因此您的会话类别将被访问。