下面源碼是實現mdi窗口的一個基本功能,那就是我點“視窗”後,在下面動態添加以有打開的子窗口的caption做為菜單的capion的子菜單。點擊添加的的某個子菜單時,就會彈出那個窗口。
procedure TfrmMain.subMenuClick(sender: Tobject); //菜單點擊事件的過程,在創建菜單時把它加進
var
  ii: integer;
  frmname:string;
begin
  for ii := 0 to frmMain.MDIChildCount - 1 do
  begin
    frmname:=TmenuItem(sender).caption;
    if frmMain.MDIChildren[ii].Caption =substr(frmName,4,length(frmName)) then
    begin
      LockWindowUpdate(Handle);
      try
        ShowWindow(frmMain.MDIChildren[ii].Handle, sw_showmaximized);
      finally
        LockWindowUpdate(0);
      end;
      break;
    end;
  end;
end;procedure TfrmMain.m_WindowsClick(Sender: TObject);
var i, ii: integer;
  submenu: TmenuItem;
begin
  for i := TmenuItem(sender).Count - 1 downto 3 do    //清空
    TmenuItem(sender).Items[i].Free;
  if frmMain.MDIChildCount > 0 then   //添加隔行
  begin
    submenu := Tmenuitem.Create(self);
    submenu.Name := 'm_space_';
    submenu.Caption := '-';
    TmenuItem(sender).Add(submenu);
  end;
  for ii := 0 to frmMain.MDIChildCount - 1 do    //動態添加子菜單
    if frmMain.MDIChildren[ii] <> nil then
    begin
      submenu := Tmenuitem.Create(self);
      submenu.Name := 'Amunu_' + inttostr(ii);
      submenu.OnClick := submenuclick;  //菜單按鍵事件
      if ii=0 then
          submenu.Checked :=true;
      submenu.ImageIndex := -1;
      submenu.RadioItem :=true;
      submenu.Caption := lpad(inttostr(ii+1), 2, '0') + '-' + frmMain.MDIChildren[ii].Caption;
      TmenuItem(sender).Add(submenu);
    end;end;

解决方案 »

  1.   

    如要全部源碼,請與[email protected]聯系
      

  2.   

    To  Hank(星星农场)能不能请你公布一下你的方法..
      

  3.   

    to  Hank(星星农场) 
    你是高手,有更好的辦法,就貼出來嘛,
    又不是什麼機密技術,有什麼不能公布的。--知之者簡單,不知者深奧,一起探討共同進步。
      

  4.   

    这个是罗嗦而且完整的  请教大家,如何根据以下给出的数据结构,动态生成菜单?最好能给出源码~谢谢http://community.csdn.net/Expert/topic/4310/4310917.xml?temp=.9996454这个是简单的  如何将数据库表中的一字段的信息显示在下拉菜单中。http://community.csdn.net/Expert/topic/4260/4260949.xml?temp=.6842157最核心的就这么两行
    PopupMenu1.Items.Add(TMenuItem.Create(Self));
    PopupMenu1.Items.Items[PopupMenu1.Items.Count-1].Caption:='CAPTION';没有任何定义变量,完全动态添加
      

  5.   

    to  Hank(星星农场) ( ) 
    好像隻是需求不一樣,代碼有些差異吧。動態添加菜單的關鍵代碼是你說的那句沒錯,但是
    我的需求好像跟你的不一樣喲。你看了我上面的代碼了嗎?我的代碼的目的不是動態生成菜單,
    是利用菜單實現mdi窗口的子窗口的pop功能。
    不知是不是有列簡單的我也不知道,我以為你有windows自帶的內碼什麼的。
      

  6.   

    其实向MDI菜单里添加窗口名字或者定义点击这个菜单就激活这个窗口不是最大的问题。。而是,你如何才能让这些菜单与窗口保持同步要想保持同步,如果使用Action的话,可以使用Actions的Update事件去更新菜单。。
    而且使用Caption去定义窗口不是个好办法。。这就意味著不能有同名的窗口。。一般同步可以使用Tag,也就是每个MDICHILD在创建的时候,你给它分配一个tag值,每个窗口的tag值在程序启动后是唯一的。然后在创建菜单的时候。。让子菜单的tag值与它对应的MDIchild的tag值相同。。这种方法同样可以应用到Mdichild的标签栏上。。以后只要使用tag值去对应子窗口的tag值就找出来了具体的子窗口了。。
      

  7.   

    unit MDiMain;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ActnList, XPStyleActnCtrls, ActnMan, Menus;type
      TForm1 = class(TForm)
        MainMenu: TMainMenu;
        History1: TMenuItem;
        History: TMenuItem;
        ActionManager1: TActionManager;
        ActCreat: TAction;
        Action2: TAction;
        procedure ActCreatExecute(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        Untils:integer;
        procedure AddMenu(ACaption:String;ATag:integer);
        procedure subMenuClick(sender: Tobject);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses MdiChild;{$R *.dfm}var
      Mdichild:TForm2;procedure TForm1.ActCreatExecute(Sender: TObject);
    begin
      inc(Untils);
      Mdichild:=TForm2.Create(self);
      Mdichild.Caption:='Form2_'+inttostr(Untils);
      Mdichild.Tag:= Untils;
      AddMenu(Mdichild.Caption,Mdichild.Tag);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Untils:=500;
    end;
    procedure TForm1.AddMenu(Acaption:String;ATag:integer);
    var
      submenu:Tmenuitem;
    begin
      submenu := Tmenuitem.Create(self);
      Submenu.Caption:=Caption;
      Submenu.Tag:=ATag;
      submenu.OnClick := submenuclick;
      self.History.Add(submenu);
    end;
    procedure TForm1.subMenuClick(sender: Tobject);
    var
      i: integer;
      MdiTag:integer;
    begin
      MdiTag:=TmenuItem(sender).Tag;
      for i := 0 to MDIChildCount - 1 do
      begin
        if MDIChildren[i].Tag =MdiTag then
        begin
          LockWindowUpdate(Handle);
          try
            ShowWindow(MDIChildren[i].Handle, sw_showmaximized);
          finally
            LockWindowUpdate(0);
          end;
          break;
        end;
      end;
    end;end.我写了一个使用tag去对用窗口并激活的。至于窗口关闭后,那个submenu被注销的,你就之子窗口的chlose事件中去调用吧。。
      

  8.   

    to  senfore(来而不往非礼也!) 
    你的方法很不錯。有時間再試試你的方法。