现在的位置: 首页 > 综合 > 正文

根据数据表中的内容,动态创建主菜单

2011年07月17日 ⁄ 综合 ⁄ 共 1595字 ⁄ 字号 评论关闭

//我们在写C/S管理系统时经常是根据用户的权限来相应禁止一些菜单
//在实践时,我发现使用动态方法创建菜单有可能对软件被破解起到一点小的作用
//因为实现起来,不是很难,所以写出来分享一下
//我们在菜单的事件中,利用菜单项的TAG值来判定是点了那一项
//首先,用一张数据表来存所有用户的菜单内容,格式如下
//ID    int
//image    int    //-1是指ImageIndex的值,即无图标
//caption  varchar    20
//layer    smallint  //菜单的层次-1是第一层
//tag    int    //菜单的TAG值,用于得知点击事件
//所有的菜单项将使用一个公共事件处理,在里面自己判断并写相应代码好了
//parent  smallint
//userid  varchar    5  //用户ID
//name    varchar    15  //菜单的Name值
//为计算字段,内容为'M'+ltrim(str(layer))+ltrim(str(tag))
//hotkey  int    //ShutCut的值,用HotKey控件来取好了
//以上字段不要有空值,像Image可以默认为-1,HotKey默认为0

procedure TForm1.Button1Click(Sender: TObject);
var newMenu:TMenuItem;
iParent:Integer;
begin
qryMenu.SQL.Text:='SELECT * FROM TMenu WHERE userid=''0000'' order by tag';
qryMenu.Open;
  if qryMenu.IsEmpty then
  begin
    qryMenu.Close;
    exit;
  end;//判断菜单表是否为空
mainmenu1.Items.clear;//清空主菜单
qryMenu.First;//这句在使用建菜单只一次的情况下可不要
  while not qryMenu.Eof do
  begin
    newMenu:=TMenuItem.Create(self);//创建新的菜单项,以下是给它决定的值
    newMenu.Caption:=qryMenu.fieldbyname('caption').AsString;//标题
    newMenu.Name:=qryMenu.fieldbyname('name').AsString;//名字
    newMenu.Tag:=qryMenu.fieldbyname('tag').Tag;
    newMenu.ImageIndex:=qryMenu.fieldbyname('Image').AsInteger;//图标值,前提是菜单连到一个ImageList
    if qryMenu.fieldbyname('hotkey').AsInteger<>0 then
    newMenu.ShortCut:=TShortCut(qryMenu.fieldbyname('hotkey').AsInteger);
    iParent:=qryMenu.fieldbyname('parent').AsInteger;
    //根据其父编号来确定,新建的菜单项是否有事件
    if iParent>-1 then newMenu.OnClick:=MyMenuClick;
    if iParent<0 then
    MainMenu1.Items.Add(newMenu)
    else
    MainMenu1.Items.Items[iParent].Add(newMenu);
    qryMenu.Next;
  end;
end;

//若此表的内容需要通过服务程序传回,那么防破解的重点可以转换到服务程序上
//客户端的主要精力就不至于浪费到防破上了
//可以想象到,破解后的软件连个菜单都没有,怎么使用呢,^@^

抱歉!评论已关闭.