代码之家  ›  专栏  ›  技术社区  ›  Mark Pim

在Delphi中动态创建子菜单

  •  3
  • Mark Pim  · 技术社区  · 15 年前

    我有一个弹出菜单,我想其中一个项目打开一个子菜单与动态创建的列表(这是一个用户定义的标志列表)。下面是我创建菜单项的方法( FlagAs

    lNewMenuItems: array[0..flagCount] of tMenuItem;
    
    for I := 0 to flagCount do
    begin
      { Create a new menu item }
      lNewMenuItems[I] := tMenuItem.Create(FlagAs);
      lNewMenuItems[I].Caption := FlagNames[I];
      lNewMenuItems[I].Tag := I; { Tag with the flag number }
      lNewMenuItems[I].OnClick := miFlagClick;
    end;
    
    FlagAs.Add(lNewMenuItems);
    

    这个 miFlagClick

    procedure TMyForm.miFlagClick(Sender: TObject);
    begin
      (Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked;
    end;
    

    这些项目添加得非常完美,但当我单击它们时,它们不会被检查。正在调用事件处理程序 编辑:发件人是正确的菜单项,但下次打开菜单时,复选标记不会出现。

    flagCount 将来可能会更改,但在代码中定义为常量)

    编辑:以上确实有效-见下面我的答案

    4 回复  |  直到 15 年前
        1
  •  4
  •   Toon Krijthe    15 年前

    我在Delphi 2009中尝试了以下方法,效果很好:

    procedure TForm5.FormCreate(Sender: TObject);
    var
      i : Integer;
      mis : array[0..3] of TMenuItem;
    begin
      for i := 0 to 3 do begin
        mis[i] := tMenuItem.Create(SubMenu);
        NewMenu(mis[i]);
      end;
      SubMenu.Add(mis);
    end;
    
    procedure TForm5.NewMenu(var mi: TMenuItem);
    begin
      mi.Caption := 'Test';
      mi.OnClick := TestClick;
    end;
    
    procedure TForm5.TestClick(Sender: TObject);
    begin
     (Sender as tMenuItem).Checked := not (Sender as tMenuItem).Checked;
    end;
    
        2
  •  2
  •   Gerry Coll    15 年前

    为什么要使用lNewMenuItems:tMenuItem的数组[0..flagCount];而不是使用单个变量?

     var
        NewMenuItem: TMenuItem;
        I : Integer;
      begin
        for I := 0 to flagCount do
        begin
          { Create a new menu item }
          NewMenuItem := TMenuItem.Create(FlagAs);
          NewMenuItem.Caption := FlagNames[I];
          NewMenuItem.Tag := I; { Tag with the flag number }
          // NewMenuItem.OnClick := miFlagClick;
          NewMenuItem.AutoCheck := True;
          FlagAs.Add(NewMenuItem);
        end;
      end;
    
        3
  •  0
  •   Mark Pim    15 年前

    Checked 我已经忘记的身份。我现在觉得自己很愚蠢。对不起,浪费了你的时间。。。

        4
  •  0
  •   Lieven Keersmaekers    15 年前

    您是否将eventhandler附加到FlagAs以清除选中的标志?