pb菜单详解和MDI、PB动态生成菜单

pb菜单详解和MDI、PB动态生成菜单PB动态生成菜单一、基本思路在PB帮助的MENUOBJECT一节当中,关于其PROPERTIES描述当中有一项:Item[]Menu  SpecifiestheMenuobjectsunderaMenuobject.这看似简单的一句话其实包含了三层含义:1、这句话说明MENU对象有一个属性为数组类型,它其中的各个元素记录了其所有的具体子ITEM项目,可以

PB动态生成菜单

一、基本思路

在PB帮助的MENU OBJECT一节当中,关于其PROPERTIES描述当中有一项:

Item[ ] Menu    Specifies the Menu objects under a Menu object.

这看似简单的一句话其实包含了三层含义:

1、这句话说明MENU对象有一个属性为数组类型,它其中的各个元素记录了其所有的具体子ITEM项目,可以借助这个数组中各元素来访问底层的各子菜单;

2、这些子ITEM项目仍是MENU类型,因此可以按照第一点的逻辑继续向下层推广,借助该子ITEM的ITEM[]属性可以进而访问其所属下层的第二层子菜单,推而广之,即可全面遍历整个菜单体系的所有子菜单项目;

3、既然该属性是一个数组类型,那么就可以按照数组类型变量来处理,我们可以对其进行upperbound()、lowerbound()等函数操作,还可以进行数组的扩展,即添加新项目,这一点很重要,它是我们整篇文章的核心,如何利用PB实现动态添加菜单,说白了就是添加这个数组元素(读者必须对此有一个清晰的认识),同时期间有一些配套具体的实现技巧,详见下文。

二、具体实现

(一)基本工作

创建一个WINDOW窗口和二个MENU菜单,其中一个菜单命名为m_main,用作窗口的基本主菜单,新增菜单将在其上添加,该菜单初始可以包含一些基本菜单,如:文件、添加、删除、保存、退出等;另外一个菜单命名为m_new,该菜单只有主菜单一个ITEM,其下没有进一步的子菜单,因此该菜单其实就是一个菜单ITEM。

在主窗口中声明实例变量(INSTANCE VARIABLES):

menu im_new[] //声明一菜单数组用于引用新增菜单
m_new的clicked事件中
string ls_tag
ls_tag=this.tag
parentwindow.dynamic event ue_open(ls_tag)
窗口的open事件
string m_str[],m_tag[]
String ls_ywzm[ 26 ] = { '(&A)', '(&B)', '(&C)', '(&D)', '(&E)', '(&F)', '(&G)', '(&H)', '(&I)', '(&J)', '(&K)', '(&L)', '(&M)', '(&N)', '(&O)', '(&P)', '(&Q)', '(&R)', '(&S)', '(&T)', '(&U)', '(&V)', '(&W)', '(&X)', '(&Y)', '(&Z)' }
int li_i,li_count
menu m_newitem[],m_temp
This.ChangeMenu ( m_main)
//菜单的text和tag    这里的值可从数据库取
for li_i=1 to 8 
m_str[li_i]='新增菜单_'+string(li_i)
m_tag[li_i]=right('0000'+string(li_i),4)
next
//横向添加8个主菜单
m_temp=m_main.item[2]
for li_i=2 to 8 
m_newitem[li_i]=create m_new
m_main.item[li_i]=m_newitem[li_i]
m_main.item[li_i].text=m_str[li_i] 
m_main.item[li_i].tag=''
next
li_count=upperbound(m_main.item[])
m_main.item[li_count+1]=m_temp
//在第一个菜单项下添加8个子菜单
for li_i=1 to 8 
m_newitem[li_i]=create m_new
m_main.item[2].item[li_i]=m_newitem[li_i]
m_main.item[2].item[li_i].text=m_str[li_i] +ls_ywzm[ li_i ]
m_main.item[2].item[li_i].tag=m_tag[li_i] 
next
m_main.item[1].hide()
m_main.item[1].show()
//------------------------------------------------------------------------------------------------------
//和协软件的proopen事件
String ls_imenutag, ls_jmenutag, ls_kmenutag, ls_enabled, ls_menuname, ls_bz_1
Int li_i, li_j,li_k
String ls_ywzm[ 26 ] = { '(&A)', '(&B)', '(&C)', '(&D)', '(&E)', '(&F)', '(&G)', '(&H)', '(&I)', '(&J)', '(&K)', '(&L)', '(&M)', '(&N)', '(&O)', '(&P)', '(&Q)', '(&R)', '(&S)', '(&T)', '(&U)', '(&V)', '(&W)', '(&X)', '(&Y)', '(&Z)' }
Long ll_count,ll_mcount
menu m_newitem[],m_temp
datastore das_menu,das_menu1
string ls_syx
das_menu=create datastore 
das_menu1=create datastore 
This.ChangeMenu ( m_trialmain_zsf )
ll_count=upperbound(m_trialmain_zsf.item[])
m_temp=m_trialmain_zsf.item[ll_count]
ls_syx="SELECT mainmenuname, mainmenuenable,mainmenuid FROM mainmenu_user WHERE username ='" + &
gs_username+"' AND xtsx ='" +gs_xtsx +"' and parentmenuid<>'SYST'"
if uf_datastore_syx(das_menu,ls_syx)<>'' then 
messagebox('','获取菜单失败')
return 
end if
das_menu.settransobject(sqlca)
das_menu.retrieve()
//横向添加主菜单
for li_i=1 to das_menu.rowcount()
ll_mcount++
m_newitem[ll_mcount]=create m_new
m_trialmain_zsf.item[li_i+2]=m_newitem[ll_mcount]
m_trialmain_zsf.item[li_i+2].text=das_menu.object.mainmenuname[li_i]+ls_ywzm[ li_i ]
m_trialmain_zsf.item[li_i+2].tag=''
if das_menu.object.mainmenuenable[li_i]='0' then 
   m_trialmain_zsf.item[li_i+2].enabled=false
   continue
end if
//纵向添加主菜单
ls_syx="SELECT itemmenuid,itemmenuname,itemmenuenable from itemmenu_user WHERE mainmenuid='"+ &
       das_menu.object.mainmenuid[li_i]+"' AND username = '"+gs_username +"' AND xtsx = '"+gs_xtsx+"'" 
uf_datastore_syx(das_menu1,ls_syx)
das_menu1.settransobject(sqlca)
das_menu1.retrieve()
li_k=0
for li_j=1 to das_menu1.rowcount()
   ll_mcount++
   if li_j>1 and mod(li_j,2)=1 then 
    m_newitem[ll_mcount]=create m_new//每两行菜单加一个横线分隔
    m_trialmain_zsf.item[li_i+2].item[li_j+li_k]=m_newitem[ll_mcount]
    m_trialmain_zsf.item[li_i+2].item[li_j+li_k].text='-'
    li_k++   
   end if
   m_newitem[ll_mcount]=create m_new
   m_trialmain_zsf.item[li_i+2].item[li_j+li_k]=m_newitem[ll_mcount]
   m_trialmain_zsf.item[li_i+2].item[li_j+li_k].text=das_menu1.object.itemmenuname[li_j]+ls_ywzm[ li_j]
   m_trialmain_zsf.item[li_i+2].item[li_j+li_k].tag=das_menu1.object.itemmenuid[li_j]
   if das_menu1.object.itemmenuenable[li_j]='0' then 
    m_trialmain_zsf.item[li_i+2].item[li_j+li_k].enabled=false
   end if
next
next
ll_count=upperbound(m_trialmain_zsf.item[])
m_trialmain_zsf.item[ll_count+1]=m_temp
m_trialmain_zsf.item[2].hide()
m_trialmain_zsf.item[2].show()
destroy das_menu
destroy das_menu1
OpenSheet ( W_back, w_trialframe, 1, Layered! ) //--设置框架窗口的背景图片
OpenSheet ( w_trialsheet2, w_trialframe, 1, Original! ) //以工作表形式打开导航栏 //
open(w_trialsheet2,this)
//this.toolbarvisible=false
//----------------------------------------------------------------------------------------------------------------
函数uf_datastore_syx
//uf_datastore_syx(as_ds,as_syx)
string ERRORS, sql_syntax
string style_str, dwsyntax_str
long ll_rowcount
ERRORS=''
//
//sql_syntax = "select cpdm from pjqcyw where cpdm not in (select cpdm from wldy )"
style_str = "style(type=grid)"
dwsyntax_str = SQLCA.SyntaxFromSQL(as_syx, style_str, ERRORS)
IF Len(ERRORS) > 0 THEN
   MessageBox("Caution", "数据库错误: " + ERRORS)
   RETURN ERRORS
END IF
as_ds.Create( dwsyntax_str, ERRORS)
IF Len(ERRORS) > 0 THEN
   MessageBox("Caution", &
    "Create cause these errors: " + ERRORS)
   RETURN ERRORS
END IF
return ERRORS

================================================================

 

pb菜单详解和MDI  

菜单条-MenuBar、菜单项-MenuItem、级联菜单(子菜单)-SubMenu

菜单项(MenuItem)是菜单中最基本的元素,只要有文字内容的就是菜单项。菜单条(MenuBar)是菜单中级别最高的菜单项的总称,也叫做菜单标题。菜单条的内容总是显示出来,对菜单的操作也是首先从这里开始的。在菜单条上移动鼠标或者点击其中的项目可以显示对应的内容,称为下拉菜单,包括很多的菜单项,它们大多数都执行相应的功能,少数还可以包含更细致的内容,称为级联菜单(SubMenu),也叫做子菜单。这样的菜单项右面都有小箭头指示

在设置菜单时,在设计窗口中的每一步修改都能反映到预览窗口中,随时可以检查级别关系是否正确。如果发生顺序或者级别错误,可以用鼠标选中错误菜单项(不要使菜单项处于编辑状态),然后直接拖动到正确的位置即可。在菜单项中输入内容时,有两个字符具有特殊的含义,“-”可以创建菜单项之间的分隔线,“…”表示该菜单项可以弹出一个属性对话窗口。另外,弹出式菜单弹出的是某个下拉菜单或者某个级联菜单,也可以单独设计弹出式菜单,和下拉式菜单的设计没有什么区别。

【属性】

▲Name

在该属性框中为菜单项命名。缺省菜单的名称都是m_加上菜单项的内容。在脚本中引用菜单项时要从最开始一级加圆点符号逐级引用,比如要引用“文件”下的菜单项“打开”,可以使用“m_文件. m_打开”来引用。

▲Text

该属性就是在创建菜单时每个菜单项中输入的内容。运行时的整个菜单内容就是该属性的内容。

▲MicroHelp

如果菜单挂接在MDIHelp!类型的窗口中,运行状态下,当鼠标指针指向菜单项或者工具条中的小图标时,该文字可以显示在MDI窗口底部的状态条中

▲ToolbarItemText

可以定义显示在工具条小图标中的文字,以对小图标的功能有简短的描述。当鼠标指针指向工具条中的小图标时,显示此文字

▲ToolbarItemName

该属性用来定义工具条小图标上显示的图形。可以使用PowerBuilder提供的很多小图标,也可以自定义。

▲ToolbarItemDownName

菜单选中时,即checked时,按下的图标,一般与ToolBarItemName相同

▲ToolbarItemVisible

显示或隐藏工具条图标

▲ToolbarItemDown

菜单选中,即checked,图标按下

▲ToolbarItemSpace

指定该图标和前面图标之间的间距。一般都是0,只有不同组的图标之间才有必要设置间距。

▲ToolbarItemBarIndex

指定图标显示在哪一行的工具条上。该属性相同的图标显示在同一行,只要相同就可以,并不要求该属性取值为连续的数字。

▲ToolbarItemOrder

指定图标显示顺序,此值越大越靠后,默认0时按照菜单中的顺序显示。

如在菜单file下后exit,需要把exit图标放在最后,则其他都为0,exit设为1就可以了

▲ShortCutKey

该属性和ShortCut Alt,ShortCut Control和ShortCut ShIft三个选项配合使用来定义菜单项的快捷键。

其他的属性使用得比较少。

〖菜单编程〗

●为“退出”菜单项编写脚本

在菜单中指代词parentwindow是指菜单挂接的窗口,比直接使用窗口的名称有更好的通用性。所以在“退出”菜单项的Clicked事件中可以这样编写脚本:close(parentwindow)

●选中某个菜单项

可以使用Checked标记来表示某个菜单项选中,可以在菜单项的Clicked事件中编写如下脚本来选中菜单项:

if this.checked then

   this.checked = false

else

   this.checked = true

end if

也可以使用函数Check和UnCheck来代替属性修改。上面的脚本可以改成:

if this.checked then

   this.uncheck()

else

   this.check()

end if

当菜单项选中时,菜单项的左侧有一个“√”符号,并且对应的小图标为按下状态。

●隐藏某个菜单项

要隐含某个菜单项,可以将该菜单项的Visible属性修改为False,如果该菜单项位于菜单条的最高级别上,则可以将整个下拉菜单隐含。例如,某窗口上挂接了菜单m_main,在窗口的打开事件中将菜单中的“文件”整个下拉菜单隐含,可以在该窗口的0pen事件中编写如下脚本:

    m_main.m_文件.Visible = False

    但是,将菜单项隐含并不能将其对应的在工具条中的小图标隐含,并且小图标的功能照样能够正常执行。要将小图标隐含,应该设置ToolBarItemVisible属性为False。例如,隐含菜单项“打开”对应的小图标,在窗口的打开事件中可以使用下面的语句:

    m_main.m_文件.m_打开.ToolBarItemVisible = False

●使某个菜单项失效

将菜单项的Enabled属性置为False,即可使菜单项显示变灰而不能使用,同时对应的小图标也变灰。如果足下拉菜单则整个下拉菜单不能使用,但其下拉项目对应的小图标可以正常使用。如果是级联菜单则级联菜单不能被打开,但是级联菜单下的各个菜单项对应的小图标可以正常使用。下面是在窗口打开事件中将菜单m_main的“文件”下的m_open修改为无效的脚本: 

    m_main.m_文件.m_open.Enabled = False

●调整工具条的位置

如果工具条的ToolBarUserControl属性(在application中)设置为True,则用户可以在工具条上按鼠标右键弹出菜单。使用该弹出菜单可以调整工具条的显示位置。用直接拖拉的方式也可以改变工具条的显示位置。当工具条的位置发生变化时将触发窗口的ToolBarMoved事件,在该事件中可以编写脚本来判断工具条的移动情况。当该事件触发时,PB自动修改Message中的参数WordParm和LongParm使用这两个属性可以判断工具条的移动情况,属性含义如下:

Message.LongParm属性的含义:

0:移动到左侧;

1:移动到顶部;

2:移动到右侧:

3:移动到底测;

4:变为浮动显示。

Message.WordParm属性的含义:

O:FrameBar在移动;

1:SheetBar在移动。

关于工具条位置的编程一般是在窗口打开和关闭时应用。关闭对应该保存用户关于工具条的设置,以便在窗口打开时将工具条恢复到上次关闭时的状态。这些信息可以保存在应用的ini文件中,具体含义只要开发人员清楚即可,打开时按同样的含义来设置工具条的位置。如在Frame的close()事件中编程(ToolbarAlignment为窗口的属性):

choose case this.ToolbarAlignment
case AlignAtTop!
   SetProfileString("C:\toolbar.ini","setup","align","1")
case AlignAtLeft!
   SetProfileString("C:\toolbar.ini","setup","align","0")
case AlignAtRight!
   SetProfileString("C:\toolbar.ini","setup","align","2")
case AlignAtBottom!
   SetProfileString("C:\toolbar.ini","setup","align","3")
case Floating!
   SetProfileString("C:\toolbar.ini","setup","align","4")
end choose

同样,在Frame的打开事件中可以根据ini文件的设置来决定工具条的显示。例如,下面的脚本在打开事件中读取ini文件中的配置来决定工具条的显示位置:

string ls_align
ls_align = ProfileString("c:\toolbar.ini","setup","align","1")
choose case ls_align
case '0'
   this.ToolbarAlignment = AlignAtLeft!
case '1'
   this.ToolbarAlignment = AlignAtTop!
case '2'
   this.ToolbarAlignment = AlignAtRight!
case '3'
   this.ToolbarAlignment = AlignAtBottom!
case '4'
   this.ToolbarAlignment = Floating!
end choose

当然,也可以用同样的方法保存更多的设置,例如是否隐含工具条,是否显示文字SheetBar的显示情况等等。

●修改工具条上右键弹出菜单中的内容

应用对象的属性ToolBarUserControl控制着用户是否可以在工具条上使用右键弹出菜单,该属性缺省是True,默认为英文格式,可以修改ToolBarFrameTitle、ToolabarSheetTitle、ToolbarPopMenuText等属性换成中文字。

ToolBarFrameTitle:框架(也可理解为主菜单工具条)Frambar中文

ToolabarSheetTitle:打开sheet后的Sheetbar中文

也可以在Frame的打开事件中编写脚本实现:

GetApplication().ToolbarPopMenuText = “左侧、顶部、右侧、底部、浮动、文字、提示信息”

文字以逗号分隔,如果多了则被自动忽略。只能修改该弹出菜单中的文字,但不能修改对应各项的功能。其中函数GetApplication可以获取当前应用的句柄(handle)。也可以在Frame的打开事件中使用下面的语句来限制用户不准使用工具条上的弹出菜单:

    GetApplication().ToolbarUserControl = false

●动态设置MicroHelp

使用函数SetMicroHelp可以动态改变菜单项的MicroHelp内容。该函数的语法是:

windowname.SetMicroHelp(string)

其中windowname是菜单所挂接的窗口名称,string是要设置的MicroHelp内容。函数正确执行返回1,否则返回-1,如果有参数为null则返回null。一般在菜单项的Selected事件中使用该函数。

如果在定制Frame窗口的控件中修改MicroHelp,还得在相关事件中取消MicroHelp。一般在控件的GetFocus事件中显示MicroHelp提供关于该控件的解释信息,在LoseFocus事件中将MicroHelp修改为“Ready”。

一个保存MicroHelp的好方法是使用控件的Tag属性,在窗口画板中给每个要显示MicroHelp的控件的Tag属性都指定适当的内容,然后在需要改变MicroHelp的脚本中将Tag属性作为函数SetMicroHelp的参数即可。

●使用右键弹出菜单

在RButtonDown事件下使用函数PopMenu来显示弹出试菜单。该函数的语法是:

menuname.PopMenu(xlocation,ylocation)

其中menuname是要弹出的菜单的名称,可以是某个下拉菜单中的某个下拉项目或者某个级联菜单。xlocation和ylocation是菜单显示的位置,该坐标的取值是相对于窗口而言的。通常使用函数PointerX和PointerY来获取该坐标,以便在鼠标点击的位置弹出菜单。这两个函数的语法格式相同,PointerX的格式是:

objectname.PointerX()

其中objectname是控件名称,X是鼠标点击位置和objectname左边框的距离,缺省为脚本所在的控件。在和函数PopMenu搭配使用时应该获取相对于窗口而言的坐标位置。虽然每个控件的RbuttonDown事件中都有xpos和ypos参数可用,但这都是相对于控件而言的。

也就是说除了要弹出的菜单在窗口上,一般很少用xpos和ypos。一般为menuname.PopMenu(parent.pointerX(),parent.pointerY())。

*Menu4 NewMenu

NewMenu = CREATE Menu4

NewMenu.m_language.PopMenu(PointerX(), PointerY())

NewMenu.m_language.PopMenu(w_frame.PointerX(), w_frame.PointerY())

●改变窗口中的菜单

函数ChangeMenu可以动态改变窗口的菜单。它的语法格式是:

windowname.ChangeMenu(menuname{,position})

其中,windowname是要改变菜单的窗口的名称;menuname是要挂接到窗口上的菜单的名称;position是可选参数,仅用于MDI Frame窗口中,用来指示给当前的窗口列表中追加的菜单标题的位置。缺省值为1,这时所有打开的Sheet出现在第一个菜单标题的下拉式菜单的底部。

●隐藏和显示工具栏

windowname.ToolbarVisible = True/False

隐藏和显示文字

GetApplication().ToolbarText = True/False

隐藏和显示提示信息

GetApplication().ToolbarTips = True/False

〖MDI〗-Multiple Document Interface

*菜单是MDI应用中必不可少的,不仅Frame必须有一个菜单,就连在客户区打开的各个Sheet也应该有菜单,如果没有就会自动继承前面Sheet的菜单。有两种通常的方式来为MDI的Sheet表提供菜单:在框架和每个Sheet之间共享一个菜单,或者分别为每个Sheet提供一个单独的菜单,当然也可以这两种方式混合使用。当打开多个有菜单的Sheet时,只有当前Sheet的菜单显示在Frame顶部,其他Sheet的工具条可以显示,而它们的菜单不显示。菜单提供各个Sheet间切换的功能,以及在Sheet中能够完成的绝大部分功能。每个菜单可以有自己对应的工具条,也可以没有,还可以对应多行工具条,这些都是在菜单画板中设计的。

*客户区是MDI窗口中用户的工作区间,Sheet都是在该区域显示的,它们的显示范围不会超过该区域。如果在MDI框架中放置了控件,这样的MDI窗口称为定制Frame,否则就称为标准Frame。客户区实际上是一个非常特殊的控体该控件叫做mdi_1,只有当运行时才可用。当使用定制Frame时mdi_1控件不能正确显示在可视区域,这时打开Sheet也不会正常显示,应该在Frame的Resize事件中编写脚本,对mdi_1重新进行定位。假设在Frame的上部放置了命令按键cb_1,在命令按键的下面和状态条之间显示mdi_1。脚本如下:

uint li_x,li_y,li_width,li_height

li_x = WorkSpaceX()

li_y = cb_1.y + cb_1.Height

li_width = WorkSpaceWidth()

li_height = WorkSpaceHeight() – li_y – mdi_1.MicroHelpHeight

mdi_1.Move(li_x,li_y)

mdi_1.Resize(li_width,li_height)

上述脚本中的函数WorkSpaceX、WorkSpaceWidth、WorkSpaceHeight和另外的函数WorkSpaceY用来获取关于工作区域的参数,使用方法都比较简单,只要注意这些函数都不包括工具条所占用的区域。通过上述脚本,mdi_1控件就可以正确显示在Frame的可视范围内,再打开Sheet也不会出现什么异常了。

    当使用标准Frame时,系统会自动维护客户区的位置和大小。

*在MDI应用系统中,Frame窗口必须包含一个菜单,该菜单可以有工具条也可以没有。在Frame菜单中可以编写打开Sheet的脚本。Sheet并非特殊类型的窗口,只是在Frame中打开就称为了Sheet,实际上就是非MDI类型的窗口。虽然Sheet就是普通的窗口,但不能使用Open函数打开,要使用OpenSheet或者OpenSheetWithParm函数来打开。Sheet可以有菜单也可以没有菜单。当打开带有菜单的Sheet时,Sheet的菜单自动取代Frame的菜单;当打开没有菜单的Sheet时,该Sheet自动使用Frame的菜单(当然,可能是Frame本身自带的菜单,也有可能是其他Sheet的菜单)。这时就出现了问题,当打开带菜单的Sheet时,Sheet的菜单覆盖了Frame的菜单,Frame菜单中的功能如何执行?好的解决方法就是使用工具条。Sheet的菜单替换了Frame的菜单后,Frame的工具条始终可以显示,使用工具条照样可以正常执行Frame菜单的功能。所以,在创建Frame的菜单时,好的习惯就是要同时创建菜单的工具条。但是,使用这种解决方法时,工具条中小图标功能的易记易用性就非常重要了,开发人员应该尽可能提供更多关于小图标的信息,如MicroHelp,Tips和 ToolBarItemText等。另外一种解决方法可能有一定的适用情况,就是让所有的Sheet都共享Frame的菜单,当所有的Sheet都进行同一类型或相似类型的操作时,比如像微软的Word似的,Sheet都进行文件编辑的情况下,这种方法就比较实用,菜单的维护就比较简单。

【函数】

★opensheet和opensheetwithparm

在Frame菜单中可以编写打开sheet的脚本。sheet并非特殊类型的窗口,只是在Frame中打开就称为了sheet,实际上就是非MDI类型的窗口,虽然Sheet就是普通的窗口,但不能使用open函数打开,要使用OpenSheet或者OpenSheetWithParm函数来打开。其中OpenSheet函数不给Sheet传递参数,而函数OpenSheetWithParm可以在打开Sheet的同时传递参数。OpenSheet的语法格式是;

OpenSheet(Sheetrefvar{,windowtype},mdiframe,{,position{,arrangeopen}})

其中,Sheetrefvar是要打开的Sheet的名称(注意,不能是MDl类型的窗口);mdiframe是Frame的名称,表示要在这个Frame的客户区打开名称为sheetrefvar的Sheet;这两个参数指明了在哪个Frame中打开哪个Sheet,都是必须的。变量windowtype为string类型,用来表示要打开的窗口的名称,如果指明该参数,则sheetrefvar的类型必须是能够接受window类型的赋值,这时的函数表示要打开windowtype名称的窗口,并将其实例保存在变量sheetrefvar中,可以使用该变量引用这个sheet。position是一个integer类型的参数,表示在菜单条中的位置,新打开的sheet名称作为一个菜单项添加在该位置的下拉菜单中。菜单条最左面的项目位置为1,依次增加,当该参数大于菜单条中的项目数时则将sheet名称添加到右侧倒数第二个菜单的下面。如果打开的sheet数据超过9个,多余的则以级联菜单的形式显示在该菜单的more windows下。参数arrangeopen是指打开sheet后在客户区中的布局方式,是arrangeopen枚举类型的值,有3个可以使用的取值。

Cascaded!:将打开的sheet层叠起来,使所有的标题栏都可见。这是缺省方式。

Layered!:将打开的sheet完全地覆盖在客户区,后打开的覆盖前面的sheet。

Original!:用窗口的原始尺寸打开,打开后并以Cascaded!方式安排布局。

eg:在名称为MDI_my的Frame中打开窗口名称为w_edit的窗口

opensheet(w_edit,MDI_my)

opensheet(w_edit,MDI_my,3,Cascaded!)

window lw_w

opensheet(lw_w,”w_edit”,MDI_my,3,Cascaded!)

和opensheet函数类似,opensheetwithparm函数中的很多参数含义完全相同。其语法格式如下:

OpenSheetWithParm(Sheetrefvar,parameter{,windowtype},mdiframe{,position{,arrangeopen}})

其中parameter是要传递的参数,可以是String,Number或者PowerObject类型,该函数用法及参数含义和opensheet完全相同。

★GetActiveSheet

使用函数GetActiveSheet可以获取当前的Sheet,该函数的语法如下:

mdiframewindow.GetActiveSheet()

其中mdiframewindow是当前Frame的名称。该函数返回window类型数值,是当前活动的sheet。执行过程中发生错误则返回无效数据,如果mdiframewindow为null则返回null。该函数经常和IsVaild配合使用,来检查函数返回的窗口是否有效。

IsValid,判断指定对象是否有效,该函数语法为:

IsValid(objectname)

其中objectname是要进行是否有效判断的对象。该函数返回为boolean类型的值。

GetFirstSheet()

GetNextSheet()

★ArrangeSheets

使用函数ArrangeSheets可以安排当前打开的和最小化的Sheet的布局,该函数的语法是:

mdiframe.ArrangeSheets(arrangetype)

其中,mdiframe为Frame的名称,arrangetype是arrangetypes枚举类型的数值,可以取为:

Cascade!:将打开的Sheet层叠起来,使所有的标题栏都可见。

Layer!:将打开的Sheet完全的覆盖在客户区。

Tile!:将打开的Sheet以平铺的方式从左到右排列。

TileHorizontal!:将打开的Sheet并排放置。

Icons!:仅将最小化的Sheet沿Frame的底部放置。

该函数正确执行则返回1,否则返回-1,如果有参数为null则返回null。

★GetToolbar、GetToolbarPos和SetToolbar、SetToolbarPos

获取工具条的信息

可以使用属性和函数来获取关于工具条的信息。

下面是应用对象关于工具条的属性,这些属性经常和函数GetApplication一起使用。这些属性既可以控制工具条的显示情况,也可以获取关于工具条的信息。

ToolbarFrameTitle string   浮动显示的工具条上的标题

ToolbarSheetTitle string   浮动显示的sheet工具条上的标题

ToolbarPopMenuText string   工具条弹出菜单中的文字

ToolbarUserControl boolean   工具条是否可以使用弹出菜单来控制

ToolbarText   boolean   工具条中的小图标是否显示文字

ToolbarTips   boolean   工具条中小图标是否显示提示信息

函数获取工具条信息-GetToolbar、GetToolbarPos

window.GetToolbar(Toolbarindex,visible{,alignment{,floatingtitle}})

其中,window为Frame的名称;Toolbarindex是想要获取信息的工具条的索引号,为整型数值;这两个参数在函数执行之前就应该有明确的取值,可以是常量或相应类型的变量。其他参数必须为变量,在函数执行后保存关于工具条的特定信息。参数alignment为ToolbarAlignment枚举类型的变量,用来保存工具条的对齐方式,该参数为可选;参数floatingtitle为string类型的变量,用来保存浮动工具条的标题。函数正确执行返回1,否则返回-1,如果任何参数为null则返回null。

*保存和恢复工具条
gf_SaveToolBar(window fa_win) //保存工具条
Int li_row,li_Offset,li_x,li_y,li_width,li_height //保存工具条的位置信息
Boolean lb_visible //工具条是否可见
Boolean lb_tips,lb_showtext //工具条是否有气泡提示、是否显示文字
ToolBarAlignment lta_align //工具条的对齐方式
String ls_title,ls_alignment,ls_section
If fa_win.GetToolBar(1,lb_visible,lta_align,ls_title) <> 1 Then Return –1 //获取工具条信息
ls_section = fa_win.ClassName()   //获取窗口名称
If lb_visible Then //工具条是可见的
SetProfileString("test.ini",ls_section,"visible","True") //则保存visible属性为“True”
Else //如果工具条是隐藏的               SetProfileString("test.ini",ls_section,"visible","False") //则保存为“False”
End If
Choose Case lta_align //根据工具条的对齐属性进行保存
Case AlignAtLeft!
   ls_alignment = "left"
Case AlignAtRight!
   ls_alignment = "right"
Case AlignAtTop!
   ls_alignment = "Top"
        Case AlignAtBotTom!
   ls_alignment = "botTom"
Case Floating!
   ls_alignment = "floating"
End Choose
SetProfileString("test.ini",ls_section,"alignment",ls_alignment)   //保存对齐属性
fa_win.GetToolBarPos(1,li_row,li_offset)        //获取工具条的行和偏移信息
SetProfileString("test.ini",ls_section,"row",String(li_row))
SetProfileString("test.ini",ls_section,"offset",String(li_offset))
fa_win.GetToolBarPos(1,li_x,li_y,li_width,li_height)         //获取高、宽、起始位置信息
SetProfileString("test.ini",ls_section,"x",String(li_x))
SetProfileString("test.ini",ls_section,"y",String(li_y))
SetProfileString("test.ini",ls_section,"width",String(li_width))/
SetProfileString("test.ini",ls_section,"height",String(li_height))
lb_showtext = GetApplication ( ).ToolbarText //工具条中的小图标上是否显示了文字
If lb_showtext Then
SetProfileString("test.ini",ls_section,"showtext","True")
Else
SetProfileString("test.ini",ls_section,"showtext","False")
End If
lb_tips = GetApplication ( ).ToolbarTips //工具条中的小图标上是否显示提示信息
If lb_tips Then
SetProfileString("test.ini",ls_section,"tips","True")
Else
SetProfileString("test.ini",ls_section,"tips","False")
End If
Return 1

恢复工具条
Int li_row,li_offset,li_x,li_y,li_width,li_height
Boolean lb_visible
String ls_showtext,ls_tips,ls_title,ls_alignment,ls_visible,ls_section
ToolBarAlignment lta_align
//判断是否有工具条
If fa_win.GetToolBar(1,lb_visible,lta_align,ls_title) <> 1 Then Return –1 
ls_section = fa_win.ClassName() //读取窗口的名称
ls_visible = ProfileString("test.ini",ls_section,"visible","") //读取工具条的visible属性
If ls_visible <> "" Then                  //正确读取了该属性
ls_alignment = ProfileString("test.ini",ls_section,"alignment","Top") //读取对齐方式
ls_title = ProfileString("test.ini",ls_section,"title","") //读取工具条标题
If Upper(ls_visible) = "TRUE" Then               
   lb_visible = True 
Else
   lb_visible = False
End If
Choose Case Lower(ls_alignment) //将字符型转换成Alignment类型
   Case "left"
    lta_align = AlignAtLeft!
   Case "right"
    lta_align = AlignAtRight!
   Case "Top"
    lta_align = AlignAtTop!
   Case "botTom"
    lta_align = AlignAtBotTom!
   Case "floating"
    lta_align = Floating!
   End Choose                  fa_win.SetToolBar(1,lb_visible,lta_align,ls_title) //设置当前工具条的信息
li_row = ProfileInt("test.ini",ls_section,"row",1)
li_offset = ProfileInt("test.ini",ls_section,"offset",0)
li_x = ProfileInt("test.ini",ls_section,"x",0)
li_y = ProfileInt("test.ini",ls_section,"y",0)
li_width = ProfileInt("test.ini",ls_section,"width",0)
li_height = ProfileInt("test.ini",ls_section,"height",0)
fa_win.SetToolBarPos(1,li_row,li_offset,False)
fa_win.SetToolBarPos(1,li_x,li_y,li_width,li_height) //设置工具条的位置 
ls_showtext = ProfileString("test.ini",ls_section,"showtext","True")   //是否显示文字
If Upper(ls_showtext) = "TRUE" Then
   GetApplication ( ).ToolbarText = True
Else
   GetApplication ( ).ToolbarText = False
End If
ls_tips = ProfileString("test.ini",ls_section,"tips","True") //是否显示提示信息
If Upper(ls_tips) = "TRUE" Then
   GetApplication ( ).ToolbarTips = True
Else
   GetApplication ( ).ToolbarTips = False
End If
End If
Return 1

*遍历菜单项
Integer li_MenuTitle //保存菜单标题
Integer li_totalTitles //保存总标题数目
Integer li_MenuItem //保存菜单项
Integer li_totalItems //保存总菜单项数
li_totalTitles = UpperBound(This.MenuID.Item)
For li_MenuTitle = 1 To li_totalTitles
li_totalItems = UpperBound(This.MenuID.Item[li_MenuTitle].item)
For li_MenuItem = 1 To li_totalItems
   MessageBox(String(li_MenuTitle) + "/" + String(li_MenuItem),&
This.MenuID.Item[li_MenuTitle].Item[li_MenuItem].Text)
Next
Next

上面的脚本没有什么实际意义,但说明了一个非常有用的技术,也就是如何遍历菜单中的所有非级联菜单项。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/36057.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注