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