Delphi的动态菜单实现

 

        这里所谓的动态菜单是指菜单项是变化的,它随程序的操作变化而变化。例如在很多应用程序的“文件”菜单下列出了最近多少次曾经使用过的文件名,这是最常见的动态菜单用法,Microsoft Word 的“文件”菜单就是一例。

动态菜单的使用为操作应用程序提供了极大的方便。用Delphi编写应用程序我们也可以实现这样的功能,其步骤如下。

    首先要确定程序的动态菜单的数据来源(这个数据为一个字符串,就是我们在菜单上看到的菜单标题,以下称之为“动态菜单标题”),即要确定动态菜单标题是来自Windows的系统注册表,还是来自一个数据库,还是来自一个子目录,这要看程序的功能而定。这里假设主窗体名为MainForm,上面已有主菜单,其动态菜单的数据源是一个String类型的变量,名称为SubMenuItemSource

    确定生成的动态菜单要做什么事情,也即要定义动态菜单的OnClick()事件,例如,动态菜单标题来自一个磁盘文件名时,那么程序在响应OnClick()事件时可能的操作是要打开选中的文件。为此我们要在菜单所在的主窗体模块的单元程序的数据定义Type后添加一个自定义的事件过程MyClick(),如下:

     unit MainForm;

       

       type

        

        procedure MyClick(Sender: TObject); //自定义动态菜单响应事件

        

     end;

    然后要编写MyClick的具体内容,示例如下:

procedure TMainForm.MyClick(Sender: TObject);

//动态菜单OnClick事件响应

begin

 ShowMessage(TMenuItem(Sender).Caption);//显示选中的动态菜单标题,

end;

    这里调用ShowMessage标准例程(Dialogs.pas)显示TMenuItem(Sender).Caption,它就是选择的菜单项Caption,类似用TMenuItem(Sender).Name则是选择的菜单项的Name。当然在这里MyClick()(就是OnClick事件)仅显示一个选中的菜单标题,但你可以改变其内容,使其完成其它你需要的工作,重要的是要知道TMenuItem(Sender).Caption

    编写程序将动态菜单标题添加到指定的菜单顶下,并将其与OnClick()事件联系起来。

将以下程序段添加到MainFormOnCreate事件过程中,可在程序启动时完成动态菜单的动态生成:

procedure TMainForm.FormCreate(Sender: TObject);

var

addSubItem:TMenuItem;

i:Integer;

begin

 for i:=0 to N do       //N等于要添加的动态菜单数目,需事先定义为数值型变量,并赋值

 begin

   addSubItem:= TMenuItem.Create(Self);

   addSubItem.Name := ‘A’+IntToStr(i);

   addSubItem.Caption := SubMenuItemSource; // 步骤①的SubMenuItemSource应先赋值

   FileOpenItem.Add(addSubItem);          //在名称为FileOpenItem的菜单项下添加子菜单

   addSubItem.OnClick:=MyClick;          // 步骤MyClick(),自定义菜单要响应的事件

  end

end;

上述方法的特点是在程序编写中,不需要使用Windows 消息则可完成动态菜单设计。如果要使用Windows 消息,Delphi也可以做到,但要响应TApplicationOnMessage事件。

上述方法同样可在C++Builder中使用,只需要改变其语法为C++

原文地址:https://www.cnblogs.com/smallmuda/p/1311661.html