正在做一个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程序员更好更方便的使用你的控件。
下面我把问题详细说明一下,恳请各位大侠帮忙,或指引相关资料及连接!
我所说的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程序员更好更方便的使用你的控件。
可以去 www.codeproject.com www.codeguru.com 找找也可以修改 MFCGrid 自己实现一个 ,MFCGird 可以在 CodeProject 上找到
To djzblue : 多谢了!
谢谢你的回复!
这个宿主程序是自己实现的,而且是通过按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(丹焰),再次谢谢您的回复,随着问题的进一步讨论与解决,我会给您加分的! :) (我的分数很实的噢,它绝对代表着您具备着实力!)
同时谢谢所有读过本帖子的各位,希望能得到大家的进一步帮助!
mfc还在学习有要学com累阿
我帮你抬抬吧
http://www.csdn.net/expert/topic/404/404487.shtm
如能解决,下限200分,多少随你
To demand(何妨) : 但愿你在考虑我的问题,希望能得到你的帮助!
To chenkan2000(侃侃) : 愿你永远都不要把3换成4或其他更大的数!
To code_cold(玉米) : (真不知对你说些什么)
说点:
首先你得抓住你的问题的本质:你的意图就是想PropertiesWindow中想在Property Value Picker中响应,可是你不知道如何做?,对不?
其实我的看法有两点:1.查一下在VBA SDK中有没有定制PropertiesWindow的方法,如果没有,此路不通。2.你说的Property Value Picker,无非是一些属性是枚举或一些特殊的属性(Color)等,在第一条中不行的条件下,只好自已做,VBA的属性页也就是调用一些COM接口,但不只一个,深入解析ATL也提到了几个,好像很多语言读属性都是从类型库中取得,你也可以试一下,所以你得查一下此方面的资料。
唉!,说来说去,还是帮不了你,祝你好运,我要下网了,再见了.................
有两个COM对象,它们各自的属性可以通过对方以方便地设置
同时,也谢谢大家对这个帖子(问题)的关注与帮助!谢谢!
哈工大的怎么了?
proplist.SelectObjects controlname
该属性将会显示该控件的所有属性,同vb类似
http://www.cnscript.com/images/proplist.jpg
非常easy
微软在.net中也加入了类似的东西
system.windows.forms.propertygrid
用法也类似http://www.cnscript.com/images/propertygrid.jpg希望对你有所帮助
你见过 心予姐姐 啊?我不相信。
我还是头一回听说她是个女的。
http://www.csdn.net/expert/topic/411/411075.shtm
分数为150分
十万火级,如能给出答案,再送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
********************************************************************************
我的方法是每个vc程序员都会的,自己做个grid的控件,保证每个格子的句柄都是可获得的,而不单单是整个grid控件的句柄可获得,句柄可获得了,什么不能做。
代码有13000行的超cool表格程序,如何开发成activeX控件,有兴趣的人留下email,我把源程序发给你们
分数为150分
十万火级,如能给出答案,再送300分
有兴趣的人留下email
我把程序发给你们。
一个很cool的表格程序,请问如何改为activeX控件,有兴趣的我把源代码发给你们,感兴趣的人留下email,
是vc写的非常cool
用detours吧,反正也是微软的,hehehe...
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 中
我在http://www.summsoft.com了解过,比较贵,MS对中国的这个运行许可有没有国内专门的代理能便宜点的也?
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(春雨)兄不会介意,不过可以开另外帖给分~)