目前项目用delphi,我在数据库版赚的分都花费在delphi,分少了点,别在意哦主菜单“窗口”项,click时动态生成当前已打开的窗体的caption
procedure TFrmStart.N4Click(Sender: TObject);
var
  popItem:TMenuItem;
  i:integer;
  frmCap:string;
begin
  n4.Clear;// n4.Items.Clear 会报错,用n4.Clear;没任何效果
  for i:=0 to screen.FormCount-1 do
  begin
    frmCap:=screen.Forms[i].Caption;
    popItem:=TMenuItem.Create(self);
    popItem.Tag:=i;
    popItem.Caption:=frmCap;
    n4.Add(popItem);
  end;end;

解决方案 »

  1.   

    你看Items的声明:
        property Items[Index: Integer]: TMenuItem read GetItem; default;
      

  2.   

    楼上说出报错的问题,但是没解决问题// n4.Items.Clear 会报错,用n4.Clear;没任何效果
    我都这样说了
      

  3.   

    我的办法是
    1 首先你应当在N4下边放一个子菜单,作为一个占位,比如增加一个
      "全部关闭"或者"下一个窗口"
      这里我假设增加了一个"全部关闭"子菜单
    2 在N4Click不要用clear,否则会弹不出东西来的
    var
      popItem: TMenuItem;
      i: integer;
      frmCap: string;
    begin
      while N4.Count>1 do
        N4.Remove(N4.Items[1]);
      //如果你使用了两个占位菜单,比如一个"全部关闭"一个分割线,这里就用2替换上边代码中的1
      for i := 0 to screen.FormCount - 1 do
      begin
        frmCap := screen.Forms[i].Caption;
        popItem := TMenuItem.Create(self);
        popItem.Tag := i;
        popItem.Caption := frmCap;
        n4.Add(popItem);
      end;
    end;或许有其它办法,我不太清楚
      

  4.   

    当然,用定时器或者其它机制去控制n4的子菜单比较好(在这些事件代码里应当可以用clear,你可以放个按钮试一下),但在n4click时应当不能执行clear操作,否则弹不出任何东西
      

  5.   

    楼上说出原因,没有解决问题,我都这样注释了
    // n4.Items.Clear 会报错,用n4.Clear;没任何效果
      

  6.   

    sonicer(极品瘦子猪哥靓) 的占位方法好使
      

  7.   

    考虑了一下,怀疑是clear的时候TMenuItem的FItems清空并释放掉,然后重新add就会Fitems重新创建,地址改变了,显示子菜单时取子菜单的那个FItems仍然是旧的地址,这样取不到子菜单就不能显示了
    实验:
      for I := n4.Count - 1 downto 0 do
      begin
        n4.Delete(I);
      end;
    这样和clear效果一样
    这次没有全部清空,留下一个菜单:
      for I := n4.Count - 1 downto 1 do
      begin
        n4.Delete(I);
      end;
    再添加菜单后,可以正长显示,楼主可以自己试下