正在做一个VBA的宿主程序,现在需要为内嵌的VBE环境中的PropertiesWindow做一个Custom Property Value Picker,却一直无从下手!
  下面我把问题详细说明一下,恳请各位大侠帮忙,或指引相关资料及连接!
  我所说的VBA宿主程序,是指集成了微软的VBE环境、支持VBA(Visual Basic for Application)语言的程序,就像微软公司的Office系列中的WinWord.exe和Excel.exe一样。VBA宿主程序可以在运行时,让用户使用VBA语言编写自己的宏,制作自己的窗体,构造自己的VB类。而且,VBA宿主程序还可以把自己内部的元件对象按照一定的体系暴露给用户,供用户的VBA代码来支配(调用方法、改变属性、响应事件),这样,就可以把程序内部的各种对象用VBA代码粘连起来,并为用户提供最大可能的“可定制化”。
  我的程序对VBE的集成,是通过使用微软的VBA SDK以MFC、ATL混合COM编程的方式实现的,其中集成相关的工作,已接近完成,却遇到了这个新的问题。
  在普通的Visual Basic的编程环境下,以及VBA宿主程序的VBE环境下(就是用户为宿主程序编写宏代码或构造窗体的环境),都有一个PropertiesWindow(属性窗),用户可以在这个窗口的Grids中修改被选择对象的属性,当用户修改的属性的值是字符型时,可以在格子中的Edit中完成;当用户修改的属性的值是布尔型时,属性窗会在属性值对应的格子下面拉出一个下拉式列表框供用户选择;当用户修改的属性的值是颜色型时,属性窗会在属性值对应的格子下面拉出一个颜色选择框(可能是个多Tab页的模式对话框)供用户选择;属性窗出现的这些为用户提供对属性值进行方便修改的元素被称为是Property Value Picker。
  现在我的问题是,如何让VBE的属性窗(PropertiesWindow)使用自己做出的Picker,以方便用户对某一些特定类型的属性的修改,如对IP地址型的属性值我需要MASK;对日期型的属性值,我需要下拉出一个日历控件;等等
  解决了以上问题,不仅对我所做的这类程序有帮助,对ActiveX控件的设计者也是有利的,因为这项技术可以使VB程序员更好更方便的使用你的控件。

解决方案 »

  1.   

    说了一大堆,就是要一个类似VB属性编辑的窗口吧?
    可以去 www.codeproject.com  www.codeguru.com 找找也可以修改 MFCGrid 自己实现一个 ,MFCGird 可以在 CodeProject 上找到
      

  2.   

    当你在VBA IDE的属性编辑窗口中,修改一类型为OLE_COLOR的属性时,鼠标一点那个格子右边的下拉按钮时,回向下拉出一个颜色选取的模式窗口出来,供你选择颜色值赋给那个属性。现在我想知道的就是,如何能让属性编辑窗口使用我们自己为它设计的一个属性值选取器,就像那个颜色选取器一样!
      

  3.   

    我是低手,但可以帮你upup 。
      

  4.   

    To gboy : 那个带着Grids的属性编辑窗口,随着VBE环境中的VBA IDE都已经有了。不用我做了。我要做的事给它(属性编辑窗口)做个属性值选取器。在编辑某个特定类型的属性值时,能让它把我的选取器界面拉下来,就完成任务了!
    To djzblue : 多谢了!
      

  5.   

    To com235 : 我用的软件,从操作系统到开发平台、VBA SDK 6.3,全部都是微软的正版软件,并且正在向微软咨询VBA的运行许可的发行相关问题!
      

  6.   

    To com235 : 我用的软件,从操作系统到开发平台、VBA SDK 6.3,全部都是微软的正版软件,并且正在向微软咨询VBA的运行许可的发行相关问题!
      

  7.   

    这种问题对一个windows程序员来说是很easy的事情,只要在mouse click里面创造相应的控件(父窗口是当前窗口),再调整一下位置、颜色之类的,然后显示出来。用户选取了某个东东(比如颜色之类的,就由父窗口读取数据,销毁控件。
      

  8.   

    这种问题对一个windows程序员来说是很easy的事情,只要在mouse click事件里面创造相应的控件(父窗口是当前窗口),再调整一下位置、颜色之类的,然后显示出来。用户选取了某个东东(比如颜色之类的,就由父窗口读取数据,销毁控件。
      

  9.   

    To Rayyang2000 : mouse click事件,应该是在Properties窗口的窗口过程中处理的吧!让我怎么响应得到!非要龌龊地去钩挂吗?那么,我的组件,被在Properties窗口中选中,并被在小格子中编辑其属性,为了实现那个方便的Value Picker,Picker的实现者--组件去钩挂Properties窗口 这样一来,我的组件不成了专为这个环境而存在了吗?失去了通用性。而且这种设计从结构上也显得不够合理、科学。难道就没有什么冠冕堂皇的、符合Properties窗口的内部运行规范的方式吗?
      

  10.   

    我不太明白了,这个宿主程序不是你自己实现的吗?脚本宿主和脚本引擎之间的调用协议中,并没有包含属性页的内容。属性页的支持,在于你的组件对ISpecifyPropertyPage接口的实现。换句话说,只要是你自己来实现ISpecifyPropertyPage接口,而不是用MFC或者ATL对ISpecifyPropertyPage缺省实现,就可以想干什么就干什么了。
      

  11.   

    To RedFire(丹焰) : 
      谢谢你的回复!
      这个宿主程序是自己实现的,而且是通过按VBASDK的要求来完成的,是以COM规范集成了VBA APC Host。一般来说,一个应用程序刻有两种方式来提供对VB的支持,一种是嵌进VBE提供对VBA的支持,一种是集成VBScript的引擎来提供对VBS的支持,后者在脚本宿主和脚本引擎之间的调用协议中,确实不包含属性页或属性编辑窗口的内容,但是,我采用的是前一种的方法,即支持VBA(而不是VBS)的方法,这样一来,就必须面对嵌进来的VBE环境中的IDE界面问题,也就是如何能让VBE IDE中的Properties窗口(注意不是属性页)更加“合作”,让它(Properties窗口)能够使用被它编辑的组件自带的Customized Property Value Picker!
      诚然,让组件通过提供自己的属性页,能够完成属性值的修改,而且可以为所欲为的“方便”,但是,既然组件是应用在被集成了的VBE环境下,就应该尽量考虑使用IDE的Properties窗口来修改它的属性值,并提供最大可能的方便。
      RedFire(丹焰),您的回复中提到的ISpecifyPropertyPage接口,是组件的属性页相关的,从您的回复可以看出,您定是位COM高手,希望后面能得到您的进一步指点!
      还有,有一个接口IPerPropertyBrowsing,同我的要求很接近了,只是,它仅提供字符串级别的支持,我其实需要的就是一个GUI版本的IPerPropertyBrowsing。
      RedFire(丹焰),再次谢谢您的回复,随着问题的进一步讨论与解决,我会给您加分的!  :) (我的分数很实的噢,它绝对代表着您具备着实力!)
      同时谢谢所有读过本帖子的各位,希望能得到大家的进一步帮助!
      

  12.   

    春雨姐姐看着你的长篇大论我都怕了
    mfc还在学习有要学com累阿
    我帮你抬抬吧
      

  13.   

    lxas(八云) 
    http://www.csdn.net/expert/topic/404/404487.shtm
    如能解决,下限200分,多少随你 
      

  14.   

    To m_Csdn((csdn的人真好)) : 谢谢你的关注与帮助!祝你学业有成!To yanzhao_528(勺子) : 还没刷呢!谢谢!
    To demand(何妨) : 但愿你在考虑我的问题,希望能得到你的帮助!
    To chenkan2000(侃侃) : 愿你永远都不要把3换成4或其他更大的数!
    To code_cold(玉米) : (真不知对你说些什么)
      

  15.   

    vba 的属性窗口并不是万能的,它也仅仅职能设置一些标准接口数据类型,所以微软又设计了 PropertyPage 接口,你可以利用这个接口。
      

  16.   

    To protale() : 微软有,肯定! 关于您说得源码,能具体指明哪张盘的哪个目录吗?(否则则会认为你有兜售嫌疑) :)To Un1() : 真象你所说得这样吗?真希望能得到能令人信服的证实,我也就死了这条心了!好遗憾,一个产品会就此失去一个好的Feature,不太甘心!
      

  17.   

    老板看我coding不行,今年让我当Architecturer和senior consultant,整天写doc、ppt,真想回到编程序的好日子啊。(条件是不减工资)
      

  18.   

    终于看完了,累.....................
    说点:
    首先你得抓住你的问题的本质:你的意图就是想PropertiesWindow中想在Property Value Picker中响应,可是你不知道如何做?,对不?
    其实我的看法有两点:1.查一下在VBA SDK中有没有定制PropertiesWindow的方法,如果没有,此路不通。2.你说的Property Value Picker,无非是一些属性是枚举或一些特殊的属性(Color)等,在第一条中不行的条件下,只好自已做,VBA的属性页也就是调用一些COM接口,但不只一个,深入解析ATL也提到了几个,好像很多语言读属性都是从类型库中取得,你也可以试一下,所以你得查一下此方面的资料。
    唉!,说来说去,还是帮不了你,祝你好运,我要下网了,再见了.................
      

  19.   

    使用VB ->Activex control 新建一个控件工程,在Usercontrol的属性中选择Propertypage 去自定义就可以了我可以发一个例子给你
      

  20.   

    To protale() : 由于这几天心情焦急,有些言重,请你原谅,不必介意!我会叫人按你说的去找那部分源码的,找到后在与你讨论,谢谢!To gujianxin(木头象) : 你所说得好象是如何为组件做属性页的,在我的开发中(主要是在VC的环境下),已经大量采用属性页了。我的问题的实质是,对于程序中决定提供给VBA项目代码的COM组件,除了提供属性页以及VBE IDE的Properties窗口的缺省支持外,还想进一步能为那个Properties窗口提供一个自定义的ValuePicker,能更加方便用户的使用。To vcmfc(浮躁的菜虫) : 谢谢你耐心地看了我的问题!程序集成了VBE环境,但VBE相关部分(如IDE中的Properties窗口)的源代码,微软是不提供的,它们都是以一系列COM组件的形式提供给开发者供集成使用的。我查遍了VBASDK的文档,都没有找到关于如何为Properties窗口开发ValuePicker的相关内容。自己做,Picker的UI部分(可以是个模式框,也可以是个PropertySheet)总是要自己做的,也会很容易,可问题的关键是,如何让Properties窗口组件,知道你的这个Picker的存在,并在恰当的时候使用它。这就需要Picker或Picker地提供者(被选中编辑的组件)与Properties窗口进行交互,可是连Properties窗口提供的Picker相关的接口是什么,甚至是否提供类似接口或连接点,都不知道,这工作又怎么开始呢?(咳!)  不过,vcmfc(浮躁的菜虫),你的回复又给我些启示,使我更加的肯定,我需要的就是一个GUI版本的IPerPropertyBrowsing,可是,似乎现在的VBA版本的Properties窗口不提供这种机制。这还有待证实!谢谢VCMFC!
      

  21.   

    假设这种情况:
    有两个COM对象,它们各自的属性可以通过对方以方便地设置
      

  22.   

    To hollysky(爱神) : 能再多些提示吗? 谢谢!
      

  23.   

    To protale() & whcentury(新手) : 关于微软公司邓予心女士,我也曾在 Microsft TechED 2001 Beijing 的大会上听过她的课程讲座,她的端庄气质和博学多才、灵敏聪颖,都给我留下了很深的印象!这次,又是她推荐我来这个论坛求解问题,在这里让我学到了许多知识也认识了许多新朋友,所有这些都要感谢微软的邓予心女士!
      同时,也谢谢大家对这个帖子(问题)的关注与帮助!谢谢!
      

  24.   

    予心mm最难得的是长得很pp,使我彻底改变了对女程序员的印象。多么想再见到她一次阿
      

  25.   

    vb IDE  中有一个CreateToolboxWindow函数,创出一个类似属性窗口的可联结子窗口,它使用ActiveX文档,你的代码放到ActiveX文档中就行了,之后当接口激活时,调用此函数,必能如你所愿,详见msdn  
      

  26.   

    关于VBA SDK的问题,请到http://www.summsoft.com处寻求支持,summsoft是全球vba技术开发的支持中心,本人以为,您的答案未必能够得到,因为VBAIDE的属性窗口是“半可定制化”的(除color、bool、Picture、枚举类型等外一般不可开发出Custom Property Value Picker),即使microsoft,亦采用属性页技术。事实上,Microsoft没用为Property Window提供可编程组件,如果存在的话,本人认为您可以参考一下Microsoft的ActiveDesigner SDK,如果您需要,可以与本人联系,ActiveDesigner SDK可以为VBA&VB提供更深入的编程支持(在VBA APC ProjectItem、VBA APC Host Class 、VBA APC Control之外提供可编程设计器支持,VBA UserForm是ActiveDesigner的一种),
      

  27.   

    我没有真正接触过VBA,但是你这个问题让我想到了VS.NET中类似的问题,在VS.NET编写自定义控件,IDE中的属性窗会自动根据控件的属性类型做出相应的改变.也许你可以从中得到提示。真希望能够帮助你,由于太忙了,抱歉。
      

  28.   

    To north_star(北极星) : 谢谢你的回复!我沿着你指引的CreateToolWindow方法,正在MSDN Library中看Visual Basic Extensibility相关的内容。谢谢!To niwalker() : 同样谢谢你“忙里偷闲”的回复 :),下面有我的联系方式,希望我们能保持联系,在您有时间时,再多给我些提示与帮助!To sunhui(无名氏) : 读您的回复时,我感到有些惊讶,您所用的词汇和概念使我有一种非常默契与协调的感觉。在一看署名,似曾相识 如果我没猜错,您是VisualDeveloper的作者孙辉吧!能够得到您的指导,真是我的幸运。谢谢您!您在回复中所说的Summsoft的技术支持,不知道在我尚未拿到微软的许可成为它的VBA Partner时是否有效。另外,对您说的ActiveDesigner SDK,我非常感兴趣也非常需要,我曾经在MSDN Library里读过一些相关的资料,却一直没有拿到这套SDK,不知道怎样才能跟您取得联系!我的联系方式是: [email protected]
      

  29.   

    我是说在COM1还未设置完成时就永远的循环设置下去了?
      

  30.   

    To hollysky(爱神) : 对不起!我综合你前后两篇回复,还是不能理解你所说的同我所问的之间有什么联系,也许,是我的问题没有表达明白,或者你的回复太简练我无法理解!
      

  31.   

    I think it's impossible because OLE can only handle predefined value types, such as long, BSTR, etc. This is discouraging, but nobody have idea.Only .NET framework gives you the ability to custom the value picker.
      

  32.   

    To 007pro(等你说爱我) : 谢谢你的关注与帮助,我必须声明,我不是哈工大的学生,只是我用着一个哈工大的信箱,也可以用这个信箱来联系:[email protected] 谢谢!(这个问题,我曾在清华、哈工大等校的BBS上求助,但都没有结果!)
      

  33.   

    To classfactory(void) & CAYU(中原) : 关于在 .net 下如何做Customized Property Value Picker相关的东西,前一个月来我看了一点,如UITypeEditor, IPropertyValueUIService等等,现在我的这个程序还无法考虑向.Net平台迁移并采用VSA技术,我想还是先在Win32下完成它!谢谢!
      

  34.   

    007pro(等你说爱我)
    哈工大的怎么了?
      

  35.   

    activereports中提供了一个属性窗口控件proplist
    proplist.SelectObjects controlname
    该属性将会显示该控件的所有属性,同vb类似
    http://www.cnscript.com/images/proplist.jpg
    非常easy
    微软在.net中也加入了类似的东西
    system.windows.forms.propertygrid
    用法也类似http://www.cnscript.com/images/propertygrid.jpg希望对你有所帮助
      

  36.   

    本人对vba,vsa等也非常有兴趣,不过只是用vb来做,不懂vc呵呵,有空大家交流,我的msn messageer是:[email protected]
      

  37.   

    对呀,听说微软的心予姐姐好PP的咯,如果中国多D象她这样的程序员就好拉
      

  38.   

    jackyrong()
    你见过 心予姐姐 啊?我不相信。
    我还是头一回听说她是个女的。
      

  39.   

    请关注:
    http://www.csdn.net/expert/topic/411/411075.shtm
    分数为150分
    十万火级,如能给出答案,再送300分
      

  40.   

    求助,先给95分,如果答案详细的话,还可以再开几个贴子给300分!
    请详细点回答!谢谢!(下面几个贴子是同一个问题,为了多给分才开多个的)
    http://www.csdn.net/expert/topic/410/410427.shtm
    http://www.csdn.net/expert/topic/410/410433.shtm
    http://www.csdn.net/expert/topic/410/410493.shtm
      

  41.   

    http://www.csdn.net/expert/topic/411/411271.shtm
      

  42.   

    你不是微软的吗?用你们自己的解决方案“看MSDN”去吧。哈哈!
      

  43.   

    微软也真是的,叫你来这里解答,你知不知道微软还说要技术支持这里的论坛,看来是这里技术支持微软。
    ********************************************************************************
    我的方法是每个vc程序员都会的,自己做个grid的控件,保证每个格子的句柄都是可获得的,而不单单是整个grid控件的句柄可获得,句柄可获得了,什么不能做。
      

  44.   

    我以为是什么问题,不就是选择控件并,修改属性的问题。搞得又用com,有用mfc,有些技术本来就简单,非得搞得那么复杂。国人就是这个样子。多多学习印度。浪费时间
      

  45.   

    To coolyylu(将来是我) : 那么你说说,不用COM和MFC我该怎样更好地做一个VBE宿主程序?
      

  46.   

    To coolyylu(将来是我) : 谢谢,如果你真的想帮我,耐心地、仔细地读读上面我的问题和大家的回复再说吧!
      

  47.   

    To quchunyu(春雨):你看看这么多人给你的回答都没有真正的作用,分析一下原因吧。微软为什么不给你答案,问他们是最好的。e语言也是一个vb的开发环境,你可以参考,设置属性也像你要求的那样子。
      

  48.   

    To coolyylu(将来是我) : 谢谢!
      

  49.   

    http://www.csdn.net/expert/topic/411/411075.shtm
    代码有13000行的超cool表格程序,如何开发成activeX控件,有兴趣的人留下email,我把源程序发给你们
    分数为150分
    十万火级,如能给出答案,再送300分
    有兴趣的人留下email
    我把程序发给你们。 
    一个很cool的表格程序,请问如何改为activeX控件,有兴趣的我把源代码发给你们,感兴趣的人留下email,
    是vc写的非常cool   
      

  50.   

    算了,别太执著了,hook一下算了,一切不就ok了?
    用detours吧,反正也是微软的,hehehe...
      

  51.   

    to coolyylu(将来是我) : 哪个代码一些国外的网站都能找得到?(曾在news.microsoft.com寻求答案,未果),我下载了什么?我需要下在什么吗?所用的工具都是来自合法渠道,你没能力帮我,就不要再来捣乱! To eEriEs(阿蒙) : 谢谢!只是不太心甘!
      

  52.   

    如果你需要,我可以给你一个可行的办法,你可以用ActiveDocument技术创建一个VBE ToolWindow,代码如下:
      VBIDE::Window *m_pToolWindow;
    IDispatch* m_pDoc;
            try{
    CComQIPtr<_Windows, &__uuidof(_Windows)> spWindows(ApcHost->VBE->Windows);
    m_pToolWindow = spWindows ->CreateToolWindow(
    (VBIDE::AddIn*)m_pApplication,
    L"testvba2.VbaToolWnd", //ActiveDocument CLSID
    L"Tangram Development Tool Window", // Tool Window Caption
    L"{5B9ACE50-FED5-11d2-80A2-005004208479}", // Unique Identifier String
    &m_pDoc); _ASSERTE(m_pToolWindow);
    _ASSERTE(m_pDoc);
    }
    catch (const _com_error& e) {
    hr =  e.Error();
    }添加一个菜单命令,其中调用如下代码:
           m_pToolWindow->put_Visible(VARIANT_TRUE);
    你的定制化代码可以写在 ActiveDocument 中
      

  53.   

    To sunhui(无名氏) : 谢谢!关于VBA集成方面的经验和问题,希望能多些跟您交流和请教,能跟您取得联系吗?我的email是[email protected],请不要使用[email protected](我这又连不进去教育网啦),或请您留下联系方式,好吗?
      

  54.   

    这里有没有事情过VBA SDK运行许可的?价格如何?
    我在http://www.summsoft.com了解过,比较贵,MS对中国的这个运行许可有没有国内专门的代理能便宜点的也?
      

  55.   

    向VBA SDK高手请教。
    1、VBA SDK 6.3从那里可以得到?我没有MSDN的宇宙版,没法从MSDN.NET下载,又没有VISA卡不然在M$网站上好象16.75US$倒也会买...
    2、国内到那里申请VBA SDK许可?价格大概如何?我以前跟Summit Software Company通过几封email签过他们的NDA但是那里的报价吓得我乖乖回去用Free的ScriptControl :=(
    (建议用VBA SDK开发的同志了解清楚报价,毕竟我们比不上AutoDesk、Corel等财大气粗)
    如果不方便回复可以给我email: [email protected]  谢了。(由于看这里了解VBA SDK的人多就没开新主题了,借来发发我的问题,希望quchunyu(春雨)兄不会介意,不过可以开另外帖给分~)
      

  56.   

    欢迎大家在这里讨论VBASDK相关问题!关于VBA运行许可的价格,我也是正在咨询联系中,还没有什么概念。(TO shellwee() : 那次你了解到的报价是多少?能透露一下吗?) 
      

  57.   

    quchunyu(春雨),您对界面的执著今人歉佩!
      

  58.   

    To wyuu(steve) : 对VBA的集成,带来的可不仅仅是界面,同样,一个方便且合理接口的Property Value Picker也不是仅仅为了用户操作时的UI方便性,更是为了程序能在用户交互的同时进行分析!