Office中国论坛/Access中国论坛
标题:
正在学习UIRIBBON,碰到问题
[打印本页]
作者:
williamwangc
时间:
2011-10-15 21:56
标题:
正在学习UIRIBBON,碰到问题
现在正在学习UIRIBBON,碰到错误,根据网上给的例子正在实践。但出现了错误,对于UIRIBBON还未完全明白。出现以下的错误描述:
“错误代码 0x80004005
根据DTD/架构,元素'{
http://schemas.microsoft.com/office/2006/01/customui
}customUI'的上下文中不允许使用文本。”
“要求:{
http://schemas.microsoft.com/office/2006/01/customui
}commands,{
http://schemas.microsoft.com/office/2006/01/customui
}ribbon。”
我看过了,错误应该是在模块的代码里面。模块代码如下
Option Compare Database
Function CreateFormButtons()
Dim xml As String
xml = _
"<customUI xmlns=""http://schemas.microsoft.com/" & _
"office/2006/01/customui"">" & vbCrLf & _
" <ribbon startFromScratch=""false"">" & vbCrLf & _
" <tabs>" & vbCrLf & _
" <tab id=""DemoTab"" label=""LoadCustomUI Demo"">" & _
vbCrLf & _
" <group id=""loadFormsGroup"" label=""Load Forms"">" & _
vbCrLf & _
"{0}" & vbCrLf & _
" </group>" & vbCrLf & _
" </tab>" & vbCrLf & _
" </tabs>" & vbCrLf & _
" </ribbon>" & vbCrLf & _
"</customUI>"
Dim template As String
template = "<button id=""load{0}Button"" " & _
"label=""Load {0}"" onAction=""HandleOnAction"" " & _
"tag=""{0}""/>" & vbCrLf
Dim formContent As String
Dim frm As AccessObject
For Each frm In CurrentProject.AllForms
formContent = formContent & _
Replace(template, "{0}", frm.Name)
Next frm
xml = Replace(xml, "{0}", formContent)
Debug.Print xml
On Error Resume Next
' 如果从AutoExec宏中调用这段代码,
' 如果在USysRibbons表中有一个使用相同名称的定制
' 则会失败
Application.LoadCustomUI "FormNames", xml
End Function
Public Sub HandleOnAction(control As IRibbonControl)
' 装载指定的窗体
' 设置其RibbonName属性以便显示自定义UI.
DoCmd.OpenForm control.Tag
Forms(control.Tag).RibbonName = "FormNames"
End Sub
复制代码
作者:
williamwangc
时间:
2011-10-16 00:24
我前面看了不少参考资料,发现应该是xml有语法错误,但我实在水平有限。
另外,我对参考书里面UI界面函数回调实在感到困惑和迷茫。因为他一会COM加载,一会UI回调。我实在闹不清他们之间的关系和思路,晕死了。
我想问下:
1、我大致理解了这两种东西,但他们之间的区别是什么?
2、我觉得还是先熟悉UI比较实用,比较容易理解,但UI函数回调到底是怎么回事?
2.1 我大致理清了UI的思路,但回调不理解,首先是究竟UI的回调函数(过程)一般是在标准模块上,那么窗体模块的函数(过程)是否也可行?
2.2 COM加载使用要求一定要函数(即FUNCTION),似乎在UI的回调函数可以使用过程(即SUB),UI对过程和函数没有限定,这个理解对不对?
2.3 UI回调函数在【USysRibbons】表里的【RibbonXml】字段里面描述回调过程的关键字好像是OnAction,那么"OnAction=”后面的回调函数应该怎么写?是不是应该“模块名.工程名”,例如:RibbonLoder. Sub CreateFormButtons()
2.4 在参考书中我看了他回调函数的代码他是这样申明的:Public Sub ListTableFields(ByVal control As IRibbon.Control),代码我是看懂了,很简单的一段应用DAO自动填表,并且列出所有表的列名的过程,莫名的是这个Control我从头到尾我都在这段代码里都没看到。
以上。
作者:
zhuyiwen
时间:
2011-10-16 10:32
你检查一下,你生成的xml对不对。
你把生成的xml贴出来看看。
作者:
williamwangc
时间:
2011-10-16 19:57
现在xml还不是很熟,但试着已经自己写出了一段简单的xml,并且已经成功了,但回调函数还是不太了解,希望管理员指导下。
我测试的xml代码如下:
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="TabExternalData" label="test"
visible="true">
<group id="GroupImport" label="open form">
<button id="CreateForm"
label="open form1"
onAction="test.OpenF1"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
复制代码
这段xml本身已经没有问题了,但回调函数还是有问题。代码如下:
Public Sub OpenF1(ByVal control As IRibbonControl)
DoCmd.OpenForm "Form1", acNormal
End Sub
复制代码
以上代码出现了,“确认宏或函数存在并使用了正确的参数”
请问以上的回调函数缺少了什么?
作者:
zhuyiwen
时间:
2011-10-16 21:12
onAction="test.OpenF1"
这种方式是指从宏组中调用宏命令,也就是说"test"宏组中的"OpenF1",而不是VBA。
应该是:
onAction="OpenF1"
作者:
williamwangc
时间:
2011-10-17 07:36
谢谢管理员,我明白了。原来我以为一定要写出标准模块的名称“TEST”的。那么我想再问几个问题。
1.回调对窗体模块的private sub 也可以直接引用吗?
2.一个RibbonName就是一个Ribbon,再继续加里面的Tab,Group,Button就可以了是吧?
3.如果我要做成一般的菜单栏式样应该怎么做呢?
作者:
zhuyiwen
时间:
2011-10-17 09:14
1、回调只能是全局 Public Sub和宏,不能使用窗口、报表、类中的过程
2、一个ribbon里可以有多个Tab,一个Tab中可以有多个Group,一个Group可以有多个Ribbon Control。
3、如果想用2003那样的菜单,你最好用Access2003设计程序,然后在2007/2010下使用。只是这样做会丢失许多2007/2010的优势,并不提倡。
作者:
williamwangc
时间:
2011-10-17 16:48
哦。明白了。关于问题1,我还有些新的疑问,本来想问的但怕描述不清,我再看看书,再思考思考再问。谢谢你的回答。
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/)
Powered by Discuz! X3.3