ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 1218|回复: 5

[求助] 请问下,我在VSTO里的项目中,如果直接复制一份类模块代码是不是不可以的?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-6-21 11:18 | 显示全部楼层 |阅读模式
例如,我想新建多几个操作窗格的类,我直接复制做好的,再做一点点小改动,但发现,好像复制粘贴后,就会引起错误,是不是在同一个项目中复制的话会报错的?如果不能复制,同一个东西只要稍微改一点点东西就要重头来过,是不是效率太低了?有没有什么好的方法来操作?
QQ图片20160621110858.png

TA的精华主题

TA的得分主题

发表于 2016-6-21 13:05 | 显示全部楼层
本帖最后由 excelhomesnake 于 2016-6-21 13:10 编辑

哎,这就是我为什么都建议从vba转vsto的人,尽可能先学好.net方面的基础.
我用创建一个Ribbon1为例子.

当你用vs操作添加一个Ribbon1后,项目中多了一个Ribbon1.vb和Ribbon1.Designer的文件.
这个文件名字其实一点都不重要.重要的是,里面的代码定义的类名字.你要留意这个类名是Ribbon1

然后,你通过复制黏贴,这个时候项目又多了一个文件,但有后缀-复制,为了避免文件名字重复.
点击进去,看到,里面的类名字还是Ribbon1的.
-----------------
为什么到这里会报错.是因为,类Ribbon1中定义了相同的方法和属性(统称成员)
所以,你复制后,要打开复制的文件,修改类名字为另外一个新的名字
要注意的是,Ribbon1.vb文件中和Ribbon1.Designer.vb都要修改.
而且在Ribbon1.Designer.vb中,文件的最后,你会发现有一段创建ThisRibbonCollection类的代码,其中有一段属性的代码,里面也要修改,否则,你就不能通过Gloable.什么鬼的,找到你创建的类对象了.
概况来说,以你的复制操作,需要修改3个地方的类名字.
如果你只是为了方便复制之前弄好的界面设计,我建议你的做法是:
1,vs操作添加一个对象.
2,在Designer的方法InitializeComponent中,用你弄好界面的那个中的代码替换
3,替换下方的Friend WithEvents之类的代码.这些代码是你从设计界面拖一个控件时生成的代码.


说白了,就是运行时生成控件对象的过程





很多人都没有坚持从基层学起,拖界面拖几年一样开发成功,只是他们的开发效率一般都是停留在vba的层面.



TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-22 17:57 | 显示全部楼层
excelhomesnake 发表于 2016-6-21 13:05
哎,这就是我为什么都建议从vba转vsto的人,尽可能先学好.net方面的基础.
我用创建一个Ribbon1为例子.

最后的建议操作步骤不是太明白,是先拖了新的对象后,再另外建一个vs对象,然后这个对象的设计内容怎么弄?这个对象只是用来存放Ribbon1.Designer.vb里的代码?把里面的代码复制过来,重命名为Ribbon2.Designer.vb?把拖出来自动生成的Ribbon复件.Designer.vb之类的文件删除掉?

TA的精华主题

TA的得分主题

发表于 2016-6-22 20:53 | 显示全部楼层
本帖最后由 excelhomesnake 于 2016-6-22 20:57 编辑
minren118 发表于 2016-6-22 17:57
最后的建议操作步骤不是太明白,是先拖了新的对象后,再另外建一个vs对象,然后这个对象的设计内容怎么弄 ...

图1

图1


tu_2.png

一,通过操作,添加一个Ribbon1,从解决方案管理器中,点选"显示所有文件",你会看到Ribbon1.vb下还有两个文件.点看Ribbon1.Designer.vb的代码,你会看到如图的代码.
1,这里面的定义了一个类,名字居然也是叫Ribbon1 .这样不就相同的命名空间下有两个相同名字的类吗?但,因为用了Partial关键字,因此这是一个部分类.其实也只是说,这个类的定义,可以写在多个文件中.最后编译的时候,会把所有的文件合起来编译成一个Ribbon1类.你想象一下,最后所有同名的类里面的方法和属性都塞到一个文件中的时候.我想你应该明白为什么会错误的吧


2,我往这个功能区添加了一个按钮叫Button1.继续留意Ribbon1.Designer.vb的代码.找到方法InitializeComponent.里面你可以看到当你运行的时候,那些按钮什么鬼的控件是怎样通过这些代码生成出来的.这个方法里面的代码,就是整个画面的布局代码了.

3,留意方法InitializeComponent结束后,下面有几句定义变量的语句.Friend WithEvents Button1 As .就是刚刚点2里面用到的控件的变量了.不然你怎么可能在Ribbon1.vb文件写代码的时候,可以直接引用自己刚刚拖到界面的控件呢?想一想.

4,继续留意Ribbon1.Designer.vb的代码.在类Ribbon1定义结束后,又定义了一个类ThisRibbonCollection.还是部分类啦.这个类的另一个定义文件其实在ThisWorkbook.Designer.vb文件中.........这个类其实就是你用Globals.Ribbons返回对象了.正因为有这里的定义,才有你后来可以使用Globals.Ribbons.Ribbon1.


.................................
这里才回答你的问题,我真是啰嗦了.
此时如果你还想增加一个叫Ribbon2的类,界面布局与刚刚的Ribbon1一样.那么
1,通过操作新增一个Ribbon2
2,打开Ribbon2.Designer.vb代码,把方法InitializeComponent中的代码用Ribbon1的方法InitializeComponent的来 替换.
3,把Ribbon2中,方法InitializeComponent结束后,下面有几句定义变量的语句,也用Ribbon1的定义变量语句来替换.

到这里,应该就可以了.虽然我没有试验过.即使有错误,如果你真的理解我上面说的.应该就明白怎样修改的.

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-23 09:11 | 显示全部楼层
本帖最后由 minren118 于 2016-6-23 09:17 编辑
excelhomesnake 发表于 2016-6-22 20:53
一,通过操作,添加一个Ribbon1,从解决方案管理器中,点选"显示所有文件",你会看到Ribbon1.vb下还有 ...

这次明白了,是新建一个空模块,然后把designer里面的初始化组件的代码复制过来就可以新增控件,这个复制代码还比复制整个项目文件来得方便,呵呵,又学到一招,谢谢热心详细的回答,对于新手,一点都不觉得啰嗦。 QQ截图20160623090321.png QQ截图20160623091044.png

TA的精华主题

TA的得分主题

发表于 2016-6-23 21:07 | 显示全部楼层
minren118 发表于 2016-6-23 09:11
这次明白了,是新建一个空模块,然后把designer里面的初始化组件的代码复制过来就可以新增控件,这个复制 ...

虽然说,你完全可以从一个空白项去写.但这样有可能会造成之后不能通过界面拖拉控件来调整.还是建议你还是按照它本身的文件结构去修改比较好.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-29 03:14 , Processed in 0.036031 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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