PB中MDI说明和使用

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值