仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 583|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页编程之菜单列举记

[复制链接]
变相怪杰 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:27:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用菜单
菜单列举记



有一MDI使用程序,现假定要列举出其可以失掉体系命令呼应一切菜单项的内容:如命令ID,资本称号,地点(子)菜单的句柄等,并对之举行操纵。本文对此略述一二,未达意处,看列位包涵以外,以我之深度,唯与诸位共勉罢了。

1、我的利诱

这几天修炼EnglishHelp,悟得些许正果,但愿得与众人共超,尚不知是不是无效,但为之罢了。言回正传:

菜单项能够是菜单,反之亦然,此时菜单被称为子菜单;假如菜单项不是菜单,则它即是’纯菜单项’。之前我觉得菜单中每项都是菜单,我的头脑中因而不再有菜单项的界说。大概这是个菜鸟级成绩,但也大概您尚不甚解,那您无妨夸夸其谈一番,将最复杂的菜单画上一画,再揣摩揣摩。

2、菜单列举算法

A、菜单笼统布局之一(树型笼统):



如今要会见到这棵’树’的一切叶结点并处置之,办法如B所述。



B、列举算法(深度遍历,C++语法)

1.)求妥当前结点的子结点数c;

2.)轮回查询以后结点的I(0<=I<c)子结点信息:

若该子结点I无上级子结点,则子结点I为叶结点,按需处置后,作I=I+1,反复此步骤;

不然子结点I为分枝结点,置上级子结点为以后结点,转向1;

3.)遍历终了。

intFindMenuItem(HMENUhmenu)//参数hmenu为分支结点资本标识

{

inti,c;

longres;

char*s=newchar[33];

MENUITEMINFOmii;

mii.cbSize=sizeof(MENUITEMINFO);

mii.fMask=MIIM_DATA|MIIM_ID|MIIM_SUBMENU|MIIM_TYPE|MIIM_STATE|MIIM_CHECKMARKS;

mii.dwTypeData=s;



c=GetMenuItemCount(hmenu);//猎取以后菜单一切的菜单项数量

for(i=0;i<c;i++)

{

mii.cch=32;//注重哦!

res=GetMenuItemInfo(hmenu,i,true,&mii);

if(res==0){deletes;return-1;}//假如猎取菜单信息失利

if(mii.hSubMenu==NULL)//

{

//若该菜单项非子菜单,则在此作响应处置

}

else

{

//若该菜单项为子菜单,则云云处置

res=FindMenuItem(mii.hSubMenu);//间接递回挪用

if(res==-1){deletes;return-1;}

}

}

deletes;

return0;

}



intEnumMenuEndItems(HWNDhwnd)//入手下手遍历窗口菜单项。参数hwnd为菜单地点的窗体。

{

HMENUhmenu=GetMenu(hwnd);

if(hmenu==NULL)returnC1;

returnFindMenuItem(hmenu);

}

注:此处代码仅仅形貌算法。若使用到它处,依据分歧的必要,Function的前往值和结点处置代码天经地义要产生改动。

附录2为上述代码的PB文本,二者略有分歧,以资参考。

上面对上述代码顶用到的Windowsapi及struct稍作讲授。



3、在的所用开辟工具中Declare以下WindowsAPI及相干Struct(尺度格局):

HMENUGetMenu(HWNDhWnd);//前往值:hWnd所联系关系的窗口的菜单句柄

HMENUGetSubMenu(HMENUhMenu,intnPos);//前往值:hMenu所联系关系的菜单中第nPos项的子菜单句柄

intGetMenuItemCount(HMENUhMenu);//前往值:hMenu所联系关系的菜单中的菜单项数量

BOOLWINAPIGetMenuItemInfo(

HMENUhMenu,

UINTuItem,

BOOLfByPosition,//该参数断定uItem为以后菜单项的命令标识仍是在所属菜单中的排序地位号

LPMENUITEMINFOlpmii);

BOOLDrawMenuBar(HWNDhWnd);//重绘hWnd所联系关系的窗口的菜单

typedefstructtagMENUITEMINFO{

UINTcbSize;//本布局体物理巨细,以byte为单元,其值实践上为48

UINTfMask;//断定想要查询或设置菜单项的哪能些内容

UINTfType;//菜单格局范例

UINTfState;//菜单形态:Enabled、DisabledorGrayed

UINTwID;//命令标识符

HMENUhSubMenu;//子菜单句柄,若无子菜单则为NULL

HBITMAPhbmpChecked;//依据这两个域值,能够自界说菜单项被选准时的标志,

HBITMAPhbmpUnchecked;//而纷歧定如果’√’或空缺

DWORDdwItemData;//由English翻译为:使用程序界说的与菜单项相干的值(我也不分明)

LPTSTRdwTypeData;//菜单资本内容指针,指向StringorBitMaporSEPARATOR资本

UINTcch;//若菜单项为MFT_STRING范例,则此项为dwTypeData长度

HBITMAPhbmpItem;//在调试程序时发明有此一项

}MENUITEMINFO,FAR*LPMENUITEMINFO;

参考材料:MSDN98(MicroSoft)MSSDKHelpFilesWin32Developer’sReferences(Inprise/Borland)

(附录1为上述API在PB中的Declare文本)

与Menu操纵相干的WindowsAPIFunctions还对照多,可过度参考,静态库:USER32.DLL。



4、别的:

a、.我在PB7中挪用这些Windows功效,但在调试至GetMenuItemInfo时,单步运转却故步自封,约

30小时后,我举行了以下操纵:

a1、翻开一Dos窗口,运转TDumpc:windowsystemuser32.dll>user32.txt(Tdump.exe为Inprise公司的使用程序)

a2、回到Windows中,以记事本翻开user32.txt,发明个中并没有GetMenuItemInfo,但有GetMenuItemInfoA,若在VB中挪用过WINAPI,则可推测此为什么物。

a3、将GetMenuItemInfo改写(或Alias)成GetMenuItemInfoA,便OK了!

b、菜单项命令标识符感化

在挪用GetMenuItemInfoA以后,其值保留在MENUITEMINFO::wID中。

设如今取得一菜单项信息存储于MENUITEMINFO型布局体mii中,其部份内容为:

mii.cbsize=48

mii.dwTypeData=”翻开文件”

mii.wID=10001

mii.fState=Enabled

mii.fType=MFT_STRING

对应函数援用标识

命令标识符wID

OpenFile()

10001

CloseFile()

10002




wID=10001






C、在上述GetMenuItemInfoA挪用时,需对MENUITEMINFO的以下域赋值:

MENUITEMINFO::cbSize

MENUITEMINFO::fMask

MENUITEMINFO::dwTypeData

MENUITEMINFO::cch

个中MENUITEMINFO::fMask可为以下常数值的组合(在相干材料中很难查到这些常数数值)

MIIM_STATE(=1)MIIM_ID(=2)

MIIM_SUBMENU(=4)MIIM_CHECKMARKS(=8)

MIIM_TYPE(=16)MIIM_DATA(=32)





附:

1、相干API及布局体在PB中的Declare

FunctionLongGetMenu(longhWnd)LIBRARY"USER32.DLL"

FunctionLongGetSubMenu(longhMenu,longnPos)LIBRARY"USER32.DLL"

FunctionLongGetMenuItemCount(longhMenu)LIBRARY"USER32.DLL"

FunctionLongEnableMenuItem(longhMenu,UlonguIDEnableItem,UlonguEnable)LIBRARY"USER32.DLL"

FunctionLongGetMenuItemInfoA(longhMenu,UlonguItem,longfByPosition,refMENUITEMINFOmii)LIBRARY"USER32.DLL"

FunctionLongDrawMenuBar(longhwnd)LIBRARY"USER32.DLL"



globaltypemenuiteminfofromstructure

unsignedlongcbsize

unsignedlongfmask

unsignedlongftype

unsignedlongfstate

unsignedlongwid

longhsubmenu

longhbmpchecked

longhbmpunchecked

longdwitemdata

stringdwtypedata

unsignedlongcch

longhbmpitem

endtype



2、PB代码,依据必要,分歧于C++代码(节选,有修正)

PublicFunctionIntEnumMenuEndItems(longhwnd,intins_upd)

longhm

constantintins=0

ifhwnd=0orisnull(hwnd)thenreturn0

hm=GetMenu(handle(wmdi))

ifins_upd=insthen

deletefromsec_funusingtrans;

IFTRANS.SQLCODE=-1THENgotoerror

endif



ifismenu(hm)=0thenreturn-1

iffun(hm,ins_upd)=-1thengotoerror

IFTRANS.SQLCODE=-1THENgotoerror

COMMITUSINGTRANS;

deletefromsec_authwhereid_funnotin(selectid_funfromsec_fun)usingtrans;//对

iftrans.sqlcode=-1andins_upd=insthenmessagebox("","某些操纵大概不再存在,但用户仍旧具有该项操纵权限,请手动删除!")

return0



error:

ROLLBACKUSINGTRANS;

RETURNC1

EndFuction



PrivateFunctionIntFindMenuItem(HMENUhmenu,intins_upd)

//ins=0

//upd=1

inti,c

longhm,res



menuiteminfomii

mii.cbsize=48

mii.fmask=54

MII.FTYPE=0



c=getmenuitemcount(hmenu)

fori=0toc-1

mii.dwtypedata=""

mii.cch=63

ifnotisvalid(mii)thenreturn-1

res=GetMenuItemInfoA(hmenu,i,255,mii)

ifres=0thencontinue

IFMII.HSUBMENU=0THEN

IFNOTISNULL(MII.DWTYPEDATA)THEN

choosecaseins_upd

case0

insertintosec_fun(id_fun,des_fun,HANDLE)values(:mii.wid,:mii.dwTypeData,:hmenu)USINGTRANS;//保留’纯’菜单项的信息

IFTRANS.SQLCODE=-1THENreturn-1

case1

updatesec_funsetHANDLE=:hmenuwhereid_fun=:mii.widUSINGTRANS;

IFTRANS.SQLCODE=-1THENreturn-2

endchoose

ELSE

CONTINUE

ENDIF

ELSE

res=FindMenuItem(MII.HSUBMENU,ins_upd)

ifres0thenreturnres

ENDIF

NEXT

return0

EndFunction
有了rowbase的binlog后,我们来分析一下怎么实现闪回。平时的DML无非三种操作,增删改,先说三种操作的日志格式。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-19 13:13:47 | 只看该作者
如果,某一版本可以提供强大的并发响应,但是没有Oracle的相应版本稳定,或者价格较贵,那么,它就是不适合的。
莫相离 该用户已被删除
板凳
发表于 2015-1-25 08:43:30 | 只看该作者
我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!
地板
发表于 2015-2-2 20:22:51 | 只看该作者
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
山那边是海 该用户已被删除
5#
发表于 2015-2-8 04:57:25 | 只看该作者
多走走一此相关论坛,多看一些实例开发,多交流0经验,没什么的,我也是刚学没多久!加油
老尸 该用户已被删除
6#
发表于 2015-2-24 06:48:29 | 只看该作者
然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情
再现理想 该用户已被删除
7#
发表于 2015-3-7 11:54:09 | 只看该作者
作了些试验,发现使用CLR的存储过程或函数在达到一定的阀值的时候,系统性能会呈指数级下滑!这是非常危险的!只使用几个可能没有问题,当一旦大规模使用会造成严重的系统性能问题!
谁可相欹 该用户已被删除
8#
发表于 2015-3-15 04:38:05 | 只看该作者
比如日志传送、比如集群。。。
活着的死人 该用户已被删除
9#
发表于 2015-3-21 18:26:02 | 只看该作者
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 16:57

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表