设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3596|回复: 7
打印 上一主题 下一主题

正在学习UIRIBBON,碰到问题

[复制链接]
跳转到指定楼层
1#
发表于 2011-10-15 21:56:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
现在正在学习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
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
8#
 楼主| 发表于 2011-10-17 16:48:04 | 只看该作者
哦。明白了。关于问题1,我还有些新的疑问,本来想问的但怕描述不清,我再看看书,再思考思考再问。谢谢你的回答。

点击这里给我发消息

7#
发表于 2011-10-17 09:14:01 | 只看该作者
1、回调只能是全局 Public Sub和宏,不能使用窗口、报表、类中的过程
2、一个ribbon里可以有多个Tab,一个Tab中可以有多个Group,一个Group可以有多个Ribbon Control。
3、如果想用2003那样的菜单,你最好用Access2003设计程序,然后在2007/2010下使用。只是这样做会丢失许多2007/2010的优势,并不提倡。
6#
 楼主| 发表于 2011-10-17 07:36:48 | 只看该作者
谢谢管理员,我明白了。原来我以为一定要写出标准模块的名称“TEST”的。那么我想再问几个问题。
1.回调对窗体模块的private sub 也可以直接引用吗?
2.一个RibbonName就是一个Ribbon,再继续加里面的Tab,Group,Button就可以了是吧?
3.如果我要做成一般的菜单栏式样应该怎么做呢?

点击这里给我发消息

5#
发表于 2011-10-16 21:12:30 | 只看该作者
onAction="test.OpenF1"

这种方式是指从宏组中调用宏命令,也就是说"test"宏组中的"OpenF1",而不是VBA。

应该是:
onAction="OpenF1"
4#
 楼主| 发表于 2011-10-16 19:57:43 | 只看该作者
现在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
复制代码
以上代码出现了,“确认宏或函数存在并使用了正确的参数”
请问以上的回调函数缺少了什么?

点击这里给我发消息

3#
发表于 2011-10-16 10:32:00 | 只看该作者
你检查一下,你生成的xml对不对。
你把生成的xml贴出来看看。
2#
 楼主| 发表于 2011-10-16 00:24:43 | 只看该作者
我前面看了不少参考资料,发现应该是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我从头到尾我都在这段代码里都没看到。
以上。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2025-1-10 06:23 , Processed in 0.123227 second(s), 32 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表