下面源碼是實現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;
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;
解决方案 »
- 如何按某列内容拆分,使该列内容都在一张sheet里,且保证同一内容都在同一张sheet里?
- 关于dbgrid的数据获取问题
- SQL数据表变量
- 如何更好地在程序里控制OFFICE文档,OFFICE文档容器插件V1.3
- 请教关于三层结构中应用服务器BDE应用程序无响应问题如何解决?
- 在tquery的查询结果里边怎么修改数据啊
- 请问有没有比较好一点的多线程复制文件的控件。谢谢。
- messagebox的显示位置问题
- 一个关于字符窜的问题?Api高手请进
- 用Spcomm , 在收串口数据时,发现十六进制数'11'收不进来! 代码如下::::
- 散大分了昂,青岛Delphi的好友们,有兴趣的话来互相联络一下吧
- 应用程序怎样获取快捷方式运行时带有的参数
你是高手,有更好的辦法,就貼出來嘛,
又不是什麼機密技術,有什麼不能公布的。--知之者簡單,不知者深奧,一起探討共同進步。
PopupMenu1.Items.Add(TMenuItem.Create(Self));
PopupMenu1.Items.Items[PopupMenu1.Items.Count-1].Caption:='CAPTION';没有任何定义变量,完全动态添加
好像隻是需求不一樣,代碼有些差異吧。動態添加菜單的關鍵代碼是你說的那句沒錯,但是
我的需求好像跟你的不一樣喲。你看了我上面的代碼了嗎?我的代碼的目的不是動態生成菜單,
是利用菜單實現mdi窗口的子窗口的pop功能。
不知是不是有列簡單的我也不知道,我以為你有windows自帶的內碼什麼的。
而且使用Caption去定义窗口不是个好办法。。这就意味著不能有同名的窗口。。一般同步可以使用Tag,也就是每个MDICHILD在创建的时候,你给它分配一个tag值,每个窗口的tag值在程序启动后是唯一的。然后在创建菜单的时候。。让子菜单的tag值与它对应的MDIchild的tag值相同。。这种方法同样可以应用到Mdichild的标签栏上。。以后只要使用tag值去对应子窗口的tag值就找出来了具体的子窗口了。。
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事件中去调用吧。。
你的方法很不錯。有時間再試試你的方法。