带历史信息的菜单

实例说明

在有些软件中,菜单栏中可以记录已经打开过的文件信息,使用户操作简单、快捷。当用户要打开已打开过的文件时,不需要重复查找,只需选择菜单中打开过的文件,即可实现打开该文件的操作。运行本例,效果如图1所示。

图1  带历史信息的菜单

思路与技术

本例使用的是动态插入菜单的技术,利用菜单的动态插入技术,可以完成在菜单中记录打开过文档的功能,即当打开一个文件后,将这个文件的完整路径插入到菜单的相应位置。主要用到了TMainMenu组件的Insert()方法。在菜单的OnChange事件中,为菜单项指定相应的事件。动态插入菜单项的代码如下:

//------------------------------------------------------------------------------

procedure
TForm1.mni_OpenClick(Sender: TObject);
var
  menuItem:TMenuItem;
begin
  menuItem:=TMenuItem.Create(nil);
  With
TOpenDialog.Create(nil) do
  begin
    if Execute then
    begin
      menuItem.Caption:=FileName;
      MainMenu1.Items.Items[0].Items[2].Insert(0,menuItem);
    end;
  end;
end;

 

0
插入配置打开文件的路径菜单
1 单击这个菜单 返回这个菜单的路径
2
增加1个配置信息保存
3
读取配置信息
 

注意:动态插入菜单项,首先要创建TMenuItem菜单对象。

开发步骤

(1)新建一个工程,该工程会自动创建一个主窗体,默认命名为Form1。

(2)在窗体上添加TMainMenu组件和TOpenDialog组件。

(3)程序完整代码如下:

 
unit Unit1;

interface


uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;

    mni_File: TMenuItem;

    mni_Open: TMenuItem;

    N3: TMenuItem;

    mni_Close: TMenuItem;

    N5: TMenuItem;

    Button1: TButton;

    mni_Recent: TMenuItem;

    procedure mni_OpenClick(Sender: TObject);

    procedure mni_CloseClick(Sender: TObject);

    procedure MainMenu1Change(Sender: TObject; Source: TMenuItem;

      Rebuild: Boolean);

    procedure Button1Click(Sender: TObject);
  private

    { Private declarations }
  public

    { Public declarations }
    procedure MenuItemExecute(Sender: TObject);

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//------------------------------------------------------------------------------
procedure TForm1.mni_OpenClick(Sender: TObject);
var
  menuItem:TMenuItem;
begin
  menuItem:=TMenuItem.Create(nil);

  With TOpenDialog.Create(nildo
  begin
    if Execute then

    begin

      menuItem.Caption:=FileName;

      MainMenu1.Items.Items[0].Items[2].Insert(0,menuItem);

    end;
  end;
end;
//------------------------------------------------------------------------------
procedure TForm1.mni_CloseClick(Sender: TObject);
begin
  Close;
end;
//------------------------------------------------------------------------------
procedure TForm1.MainMenu1Change(Sender: TObject; Source: TMenuItem;
  Rebuild: Boolean);
var
  i:integer;
begin

  for i:=2 to  mainmenu1.Items.Items[0].Count-3 do
  begin
    MainMenu1.Items.Items[0].Items[i].OnClick:=button1.OnClick;
  end;
end;
//------------------------------------------------------------------------------
//返回当前单击的标题
procedure TForm1.MenuItemExecute(Sender: TObject);
begin 
    ShowMessage(TMenuItem(Sender).Caption);
end;
//------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
begin
    MenuItemExecute(Sender);
end;
//------------------------------------------------------------------------------

end
 
 
 

附件列表

delphi 带历史信息的菜单的更多相关文章

  1. C#窗体练习:带历史信息的菜单

    在开发图纸管理软件时,要求在菜单上记录用户最近打开的档案或图纸,以方便下次使用.单击“文件”菜单下的“打开文件”子菜单,打开需要查阅的图纸.下次运行该软件时,上次打开的文件名记录到“文件”菜单的历史菜 ...

  2. Bootstrap页面布局15 - BS带下拉菜单的按钮

    带下拉菜单的按钮 <div class='btn-toolbar'> <div class='btn-group'> <a href='javascript:;' cla ...

  3. 自定义右键菜单,禁用浏览器自带的右键菜单[右键菜单实现--Demo]

    许多从事Web开发的会发现有些事,我们需要禁用浏览器本事自带的右键菜单,而实现自定义的右键菜单下面我们也来实现一个自定义的右键菜单 首先来创建JSP页面 <%@ page language=&q ...

  4. 给Notepad++ 加带图标右键菜单

    给Notepad++ 加带图标右键菜单 方式一: 拷贝以下代码建立一个reg文件,替换相关路径,保存,双击运行加入注册表 Windows Registry Editor Version 5.00 [H ...

  5. jquery带下拉菜单和焦点图

    jQuery,下拉菜单,二级菜单,索引按钮,焦点图代码,jquery带下拉菜单和焦点图是一款顶部通栏带二级下拉菜单和banner导航菜单代码. JQuery特效代码来源:http://www.huiy ...

  6. Delphi编程中动态菜单要点归纳

      一.创建菜单并添加项目 在设计程序时,有时需要动态创建菜单, 通常使用以下的语句: PopupMenu1 := TPopupMenu.Create(Self);  Item := TMenuIte ...

  7. delphi TDbGrid 右键 PopupMenu 菜单只在有数据的地方弹出

    最近用delphi做开发,用到了DbGrid控件,想在控件上点击鼠标右键弹出菜单 关联DbGrid的 Popupmenu 倒是可以实现,但是这样的效果是不管你在哪里单击鼠标右键 只要在DBGrid里面 ...

  8. Delphi TdxBarManager通过代码生成菜单

    procedure TForm6.btn1Click(Sender: TObject);var  ABar:TdxBar;  ABarItem:TdxBarItem;  ABarSubItem:Tdx ...

  9. iOS之UITableView带滑动操作菜单的Cell

    制作一个可以滑动操作的 Table View Cell 本文翻译自 http://www.raywenderlich.com/62435/make-swipeable-table-view-cell- ...

随机推荐

  1. binlog/relay_log的清理

    http://www.yuminstall.com/how-to-remove-mysql-relay-log.html CHANGE MASTER TO changes the parameters ...

  2. delphi7 开发布局

    delphi7界面布局(就是各种框框,代码管理器之类的东东)好了的,为什么以打开个新项目或者下次进入开发界面是环境的布局全部变了,如何才能锁定窗口布局? 在菜单栏最右边,有一个按钮save curre ...

  3. Jemeter对Oracle数据库性能测试方法

    下载Oracle的jdbc数据库驱动包,注意Oracle数据库的版本,这里使用的是:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 ...

  4. 取消eclipse启动时的subclipse Usage弹窗

    取消windows–>perferences–>general–>startup and shutdown里最下面的Subclipse Usage report 勾选即可

  5. Chrome多线程模型

    为什么使用多线程? Chrome的多线程模型主要解决什么问题? 如何实现该问题的解决? 1. 解决问题 Chrome有很多线程,这是为了保持UI线程(主线程)的高响应度,防止被其他费时的操作阻碍从而影 ...

  6. A题进行时--浙大PAT 1021-1030

    1021: #include<stdio.h> #include<string.h> #include<vector> #include<queue> ...

  7. mapreduce的调度算法和job调优

    调度算法: mapreduce当有很多的作业在执行的时候,是按照什么顺序去执行的? 调度算法顺序需要关注: 1.提高作业的吞吐量. 2.要考虑优先级. 三种调度器:如果作业跑不完,并且机器资源利用率比 ...

  8. 王家林 Spark公开课大讲坛第一期:Spark把云计算大数据速度提高100倍以上

    王家林 Spark公开课大讲坛第一期:Spark把云计算大数据速度提高100倍以上 http://edu.51cto.com/lesson/id-30815.html Spark实战高手之路 系列书籍 ...

  9. AS3 条件编译

    转:http://www.lite3.cn/blog/?p=404&cpage=1 知道C/C++ 有条件编译,一直想着AS要是也有条件编译就好了,今天搜了半天Google,终于让我找到了 下 ...

  10. spice

    the following diagram illustrates VD-Interface illustrates display portemphasizing   emphasizing   e ...