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。”
我看过了,错误应该是在模块的代码里面。模块代码如下

  1. Option Compare Database

  2. Function CreateFormButtons()
  3. Dim xml As String
  4. xml = _
  5. "<customUI xmlns=""http://schemas.microsoft.com/" & _
  6. "office/2006/01/customui"">" & vbCrLf & _
  7. " <ribbon startFromScratch=""false"">" & vbCrLf & _
  8. "  <tabs>" & vbCrLf & _
  9. "   <tab id=""DemoTab"" label=""LoadCustomUI Demo"">" & _
  10. vbCrLf & _
  11. "    <group id=""loadFormsGroup"" label=""Load Forms"">" & _
  12. vbCrLf & _
  13. "{0}" & vbCrLf & _
  14. "    </group>" & vbCrLf & _
  15. "   </tab>" & vbCrLf & _
  16. "  </tabs>" & vbCrLf & _
  17. " </ribbon>" & vbCrLf & _
  18. "</customUI>"
  19. Dim template As String
  20. template = "<button id=""load{0}Button"" " & _
  21. "label=""Load {0}"" onAction=""HandleOnAction"" " & _
  22. "tag=""{0}""/>" & vbCrLf
  23. Dim formContent As String
  24. Dim frm As AccessObject
  25. For Each frm In CurrentProject.AllForms
  26. formContent = formContent & _
  27. Replace(template, "{0}", frm.Name)
  28. Next frm
  29. xml = Replace(xml, "{0}", formContent)
  30. Debug.Print xml
  31. On Error Resume Next
  32. ' 如果从AutoExec宏中调用这段代码,
  33. ' 如果在USysRibbons表中有一个使用相同名称的定制
  34. ' 则会失败
  35. Application.LoadCustomUI "FormNames", xml
  36. End Function

  37. Public Sub HandleOnAction(control As IRibbonControl)
  38. ' 装载指定的窗体
  39. ' 设置其RibbonName属性以便显示自定义UI.
  40. DoCmd.OpenForm control.Tag
  41. Forms(control.Tag).RibbonName = "FormNames"

  42. 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代码如下:
  1. <customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  2.         <ribbon>
  3.                 <tabs>
  4.                         <tab id="TabExternalData" label="test"
  5.                                         visible="true">
  6.                                 <group id="GroupImport" label="open form">
  7.                                                                 <button id="CreateForm"  
  8.                                         label="open form1"
  9.                                         onAction="test.OpenF1"/>
  10.                                                                         </group>
  11.                         </tab>
  12.                 </tabs>
  13.         </ribbon>
  14. </customUI>
复制代码
这段xml本身已经没有问题了,但回调函数还是有问题。代码如下:
  1. Public Sub OpenF1(ByVal control As IRibbonControl)
  2. DoCmd.OpenForm "Form1", acNormal
  3. 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