// Dynamic menu demo
Procedure drawmenu (mainmenu: tmainmenu );
Procedure drawsubmenu (pitem: tmenuitem; IID: integer );
VaR
Sqlstr: string;
Item: tmenuitem;
Adomenu: tadoquery;
Begin
Adomenu: = tadoquery. Create (NiL );
Adomenu. Connection: = dataconn. adoconn;
Sqlstr: = 'select fmoduleid, fpmoduleid, ffilename, ftitle, fissubmain, bishide'
+ 'From menumodules'
+ 'Where fpmoduleid = '+ inttostr (IID)
+ 'Order by fseqid ';
If adomenu. Active then adomenu. close;
Adomenu. SQL. Clear;
Adomenu. SQL. Add (sqlstr );
Adomenu. open;
If not adomenu. isempty then
Begin
While not adomenu. EOF do
Begin
If not adomenu. fieldbyname ('bishide '). asboolean then
Begin
Item: = tmenuitem. Create (NiL );
Item. Hint: = adomenu. fieldbyname ('ffilename'). asstring;
// Item. helpcontext
Item. Caption: = adomenu. fieldbyname ('ftitle'). asstring;
Pitem. Add (item );
If adomenu. fieldbyname ('fissubmain'). asboolean then
Drawsubmenu (item, adomenu. fieldbyname ('fleleid'). asinteger)
Else
Begin
Item. Enabled: = false;
Item. onclick: = domenuitem;
End;
End;
Adomenu. Next;
End;
End;
Adomenu. close;
Freeandnil (adomenu );
End;
VaR
Item: tmenuitem;
Sqlstr: string;
Begin
Item: = mainmenu. items;
For icol: = item. Count-1 downto 1 do // unused Index = 1 menuitem and last name hint is help menuitem
Begin
If uppercase (item [icol]. Hint) = 'help' then continue;
Item. Delete (icol );
End;
Sqlstr: = 'select fmoduleid, fpmoduleid, ffilename, ftitle, fissubmain, bishide'
+ 'From menumodules'
+ 'Where fpmoduleid not in (select fmoduleid from menumodules )'
+ 'Order by fseqid ';
If adoquery. Active then adoquery. close;
Adoquery. SQL. Clear;
Adoquery. SQL. Add (sqlstr );
Adoquery. open;
If not adoquery. isempty then
Begin
While not adoquery. EOF do
Begin
If not adoquery. fieldbyname ('bishide '). asboolean then
Begin
Item: = tmenuitem. Create (NiL );
Item. Hint: = adoquery. fieldbyname ('ffilename'). asstring;
// Item. helpcontext
Item. Caption: = adoquery. fieldbyname ('ftitle'). asstring;
Mainmenu. Items. insert (mainmenu. Items. Count-1, item );
If adoquery. fieldbyname ('fissubmain'). asboolean then
Drawsubmenu (item, adoquery. fieldbyname ('fleleid'). asinteger)
Else
Begin
Item. Enabled: = false;
Item. onclick: = domenuitem;
End;
End;
Adoquery. Next;
End;
End;
Adoquery. close;
End;
Procedure setallowmenuitem;
Procedure setitemproperty (item: tmenuitem );
VaR
Icol: integer;
Begin
If item. Count> 0 then
Begin
For icol: = 0 to item. Count-1 do
Begin
Setitemproperty (item [icol]);
End;
End else
Item. Enabled: = // get from item Property
End;
VaR
Item: tmenuitem;
Icol: integer;
Begin
Item: = mainmenu. items;
For icol: = 1 to item. Count-1 do // unused Index = 1 menuitem and last name hint is help menuitem
Begin
If uppercase (item [icol]. Hint) = 'help' then continue;
If item [icol]. Count> 0 then
Setitemproperty (item [icol])
Else
Item [icol]. Enabled: = // get from item Property
End;
End;
Procedure disablemenu;
Procedure setitemdisable (item: tmenuitem );
VaR
Icol: integer;
Begin
If item. Count> 0 then
Begin
For icol: = 0 to item. Count-1 do
Begin
Setitemdisable (item [icol]);
End;
End else
Item. Enabled: = false;
End;
VaR
Item: tmenuitem;
Icol: integer;
Begin
Item: = mainmenu. items;
For icol: = 1 to item. Count-1 do // unused Index = 1 menuitem and last name hint is help menuitem
Begin
If uppercase (item [icol]. Hint) = 'help' then continue;
If item [icol]. Count> 0 then
Setitemdisable (item [icol])
Else
Item [icol]. Enabled: = false;
End;
End;