动态的定义POPUP,涉及字符串处理、递归、菜单定义语句等等。
也挺费劲的,
。
做出这个函数,就可扩展基类 _FORM, 以加上 接口:_c菜单定义 、_v菜单事件() 。
(1) 使用例子
TEXT to cMenu
文件
打开
EXCEL
WORD
关闭
Quit
编辑
Copy
paste
帮助
ENDTEXT
glDefinePopup(cMenu,'abc')
Activate Popup abc
(2)函数定义
*******************************************************************
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
Function glDefinePopup()Function glDefinePopup
Lparameters tcPopupDefine, tcPopupName
*- 功能: 定义多级的关联popup菜单
*-
*- 参数
*- (1) tcPopupDefine: 菜单定义字符串,每项以换行分隔,以TAB确定级别
*- 例子:
*- text to cPpDefine
*- 文件
*- 打开
*- EXCEL
*- WORD
*- 关闭
*- endtext
*-
*- (2) tcPopupName: 定出来的POPUP的名字
*-
Local i,cLine,n当前级数,n上级id_
![](/Images/OutliningIndicators/InBlock.gif)
Release POPUPS (tcPopupName) extended
![](/Images/OutliningIndicators/InBlock.gif)
*- 转变为链表结构 ----------------
Create Cursor _csDefine_menu_MenuStru (id_ i , fid_ i , 菜单定义 c(240), 级数 i,子女数 i )
For i=1 to GetWordCount(tcPopupDefine,Chr(13))
cLine = Alltrim( GetWordNum(tcPopupDefine,i,Chr(13)) , 1, Chr(10),Chr(32))
If Empty(cLine)
Loop
EndIf
n当前级数 = _n求级数(cLine)
![](/Images/OutliningIndicators/InBlock.gif)
n上级id_=0
Do while not bof() && 往回找,找到级别比自己小[1级]的, 就是父. 取其id作fid_, 父的子女数+1
If 级数 < n当前级数
n上级id_ = id_
Replace 子女数 with 子女数+1
Exit
EndIf
Skip -1
EndDo
Append Blank
Replace id_ with i, fid_ with n上级id_, 级数 with n当前级数, 菜单定义 with Ltrim(cLine,1,Chr(9))
Next
![](/Images/OutliningIndicators/InBlock.gif)
_vDefinePopUp(0,0,tcPopupName)
Return .t.
**********************************************
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Function _vDefinePopup()Function _vDefinePopup
Lparameters tn上级id, tn上级barID, tc上级popUp名
Local nBarCnt,nRecNo,c本级popup名
![](/Images/OutliningIndicators/InBlock.gif)
If tn上级barID = 0
c本级popup名 = tc上级popUp名
Else
c本级popup名 = tc上级popUp名+'_'+Alltrim(Str(tn上级barID,10))
_vfp.DoCmd( Textmerge('On Bar <<tn上级barID>> of <<tc上级popUp名>> activate popup <<c本级popup名>>'))
EndIf
_vfp.DoCmd( Textmerge("Define Popup <<c本级popup名>> shortcut relative "))
_vfp.DoCmd( Textmerge("On Selection Popup <<c本级popup名>> Deactivate Popup <<c本级popup名>> "))
*---
![](/Images/OutliningIndicators/InBlock.gif)
nBarCnt=0
nRecNo=Recno()
Scan for fid_ = tn上级id
nBarCnt = nBarCnt + 1
_vfp.DoCmd( Textmerge("define Bar <<nBarCnt>> of <<c本级popup名>> prompt '<<Trim(菜单定义)>>' " ))
If 子女数 > 0
_vDefinePopup(id_,nBarCnt,c本级popup名)
EndIf
EndScan
Go (nRecNo)
Return
![](/Images/OutliningIndicators/InBlock.gif)
**********************************************
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
Function _n求级数()Function _n求级数
Lparameters tcStr
Local nCnt,i
nCnt=0
For i=1 To Len(tcStr)
If Substr(tcStr,i,1)=Chr(9)
nCnt = nCnt + 1
Else
Exit
Endif
Next
![](/Images/OutliningIndicators/InBlock.gif)
Return nCnt+1
**********************************************************
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)