请教如何实现由用户自定义菜单的功能(200分)

  • 主题发起人 主题发起人 BoeingZhang
  • 开始时间 开始时间
B

BoeingZhang

Unregistered / Unconfirmed
GUEST, unregistred user!
诸位,
我正在开发的一套系统中要实现由用户自定义
菜单的功能:
1、通过POPUPMENU进入定制界面状态;
2、定制时可直接在MAINMENU上改MENUITEM的
CAPTION,象TEdit一样,可保存,最好在数据
库里,CORBA技术存取数据库
3、MENUITEM 可拖动,CTRL+D 删除 MENUITEM
4、可增加、修改MENUITEM及子菜单。
请各位帮我想想具体实现的方法,我现在一点
思路都没有!谢谢!

Boeing FROM GUANZHOU 991102
 
g

具体实现的办法??? 呵呵.
 
动态生成菜单。因该都能实现。
cAkk:又是你!
 
是呀,原理并不难,可是具体实现方法是在懒的去想.
 
其他我想还是可以实现的,但是增加、修改MenuItem及子菜单
怎么实现呢?用户又不能编程,它的功能怎么添加?也就是说
OnClick指向哪里?

我的想法是先做一个固定的菜单,每个菜单项用不同的Tag 进
行区分,但不提供给用户看。用户看到的是一个动态生成的菜
单,它的Caption可以由用户定义,但它的Tag应该是跟固定菜
单的Tag 一致,动态菜单调用的时候,寻找跟它的Tag一致的固
定菜单上的相应菜单,执行它的OnClick过程。所谓菜单的删除,
就是做一个标签,在动态添加菜单的时候,不添加这个菜单。

觉得有点难以表达啊,呵呵。用个例子:
固定菜单 动态菜单
Tag Caption Tag Caption Index
1 AAA 2 bbb1 1
2 BBB 5 eee1 2
3 CCC 3 ccc1 3
4 DDD
5 EEE

保存在数据库中的是动态菜单的Tag,Caption和Index,
根据这三个信息,就可以创建运行时的动态菜单,Index
代表次序。把动态菜单的OnClick定义到OnMyClick上,
OnMyClick执行一个动作,根据Sender的Tag ,找到固
定菜单上的相应菜单项,执行。比如单击了ccc1这个
菜单项,根据它的Tag为3,可以找到固定菜单上Tag为3
的CCC,执行。
 
呵呵, 所谓自定义菜单, 其实大部分都是编程人员已经定义好的菜单, 用户能定义
的, 只不过是菜单的caption, 位置而已:-) 首先要确定菜单的各种功能(予定义好),
然后再定义菜单显示的caption.
用数据库来存储? 呵呵,一般其实都是用ini来存的. 很简单.
 
呵呵,我的想法跟cytown一样。正因为基础是已经定义好的菜单,所以
觉得新增加、修改菜单和子菜单不太可能。
 
动态添加菜单没啥问题,动态添加处理函数也好说.
但:
由用户来添加的话,不太现实吧.动态该名好说,但动态修改处理函数不会.
 
倒是有一点估计可以做,由用户决定一个新的
菜单,这个菜单干的是别的几个菜单的总活,
也就是相当于一个宏。要想有新的函数,那估
计没什么戏。
 
波音:出来说句话呀! 大家说得差不多了.
 
a interesting stuff:
unit InfiniteMenuForm;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
MainMenu1: TMainMenu;
a1: TMenuItem;
b1: TMenuItem;
c1: TMenuItem;
Infinite1: TMenuItem;
one1: TMenuItem;
two1: TMenuItem;
three1: TMenuItem;
procedure Infinite1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

var
NewId: INteger = 1;

procedure TForm1.Infinite1Click(Sender: TObject);
var
Menu, menu1: TMenuItem;
begin
Inc (NewId);
Menu := TMenuItem.Create (self);
Menu1 := TMenuItem.Create (self);
Menu1.Caption := 'one';
Menu.Add (menu1);
Menu1 := TMenuItem.Create (self);
Menu1.Caption := 'two';
Menu.Add (menu1);
Menu.OnClick := Infinite1Click;
Menu.Caption := 'Level ' + IntToStr (newid);

(Sender as TMenuItem).Add (menu);
end;

end.
 
还有没有人要求答案
 
接受答案了.
 
后退
顶部