- 浏览: 257587 次
文章分类
- 全部博客 (395)
- Tech (0)
- [随笔分类]心情 (95)
- [随笔分类]技术 (112)
- [随笔分类]管理心得 (13)
- [随笔分类]Code SOP (5)
- [随笔分类]望图知意 (11)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (8)
- [随笔分类]重构代码 (1)
- [随笔分类]童童 (2)
- Program (1)
- [随笔分类]看你知道不知道 (1)
- [网站分类]4.其他技术区 (31)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (21)
- [网站分类]9.求职招聘区(个人求职、企业招聘) (0)
- [随笔分类]昨日关注 (15)
- [网站分类]6.读书区(技术书籍阅读心得、书籍推荐) (3)
- [随笔分类]一步一个脚印 (2)
- [网站分类]网站管理区(网站管理方面的疑问、建议、意见, 寻求管理员帮助) (1)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (3)
最新评论
由于工作的需要,我希望将长长的Case取消掉,但是CallbyName在层次和集合对象上的处理十分头疼,为了解决这个问题只能想别的办法了,唯一的办法是重新包装Callbyname,代码如下:
相关测试类:
测试模块:
Public Sub Test1()
Dim pt As New ParaseTier
Dim o As Object
Set o = Word.Application.ActiveDocument
'Demo 使用字符串获得属性
Debug.Print pt.GetAttributeValue(o, "Paragraphs(1).Range.Font.Name")
'Demo 使用字符串获得集合对象属性
Debug.Print pt.GetItemObject(o, "Paragraphs(1)").Range.Font.Name
'Demo 使用字符串获得对象
Debug.Print pt.GetObject(o, "Paragraphs", 1).Count
Set o = Nothing
Set pt = Nothing
End Sub
Public Sub Test2()
Dim pt As New ParaseTier
Dim o As Object
Set o = Word.Application.ActiveDocument
'Demo 使用字符串获得属性
Debug.Print pt.GetAttributeValue(o, "Paragraphs(1).Range.Font.Name")
'Demo 使用字符串获得集合对象属性
Debug.Print pt.GetItemObject(o, "Sections(1)").Index
'Demo 使用字符串获得对象
Debug.Print pt.GetObject(o, "Paragraphs", 1).Count
Set o = Nothing
Set pt = Nothing
End Sub
Public Sub test3()
Dim s As New Student
s.Name = "Duiker"
s.Sex = "男"
Dim ss As String
ss = InputBox("请输入需要获得的属性名称", "Name")
Select Case ss
Case "Name"
Debug.Print s.Name
Case "Sex"
Debug.Print s.Sex
End Select
Set s = Nothing
End Sub
Public Sub test4()
Dim s As New Student
s.Name = "Duiker"
s.Sex = "男"
Dim ss As String
ss = InputBox("请输入需要获得的属性名称", "Name")
Dim pt As New ParaseTier
Debug.Print pt.GetAttributeValue(s, ss)
Set s = Nothing
End Sub
这只是一个简易的框架,自己用来玩玩还行,主要的好处就是通过字符串可以快速的生成对象,或者获取属性的值,而且支持多层次的属性字符串,也支持类似于Item格式的对象集合。
参考文章:
1:vb6框架设计-对象导航
2:CallByName的一些缺陷
'ClassName :ParaseTier
'缺陷没有考虑错误处理
Public Event onError()
'根据字符串得到具体的属性值
Public Function GetAttributeValue(Object As Object, ByVal AttributeName As String)
GetAttributeValue = VBA.Interaction.CallByName(GetObject(Object, AttributeName), Trim(AttributeName), VbGet)
End Function
'根据字符串得到具体的对象
'AttributeIsObject = 0,表示当AttributeName表示的是属性名称
'AttributeIsObject = 1,表示当AttributeName表示的是对象名称
Public Function GetObject(ByVal Object As Object, ByRef AtrributeName As String, Optional AttributeIsObject = 0) As Object
Dim parseProcName() As String
parseProcName = Split(AtrributeName, ".")
Dim i As Integer
Set GetObject = Object
For i = 0 To UBound(parseProcName) - 1
If IsCollectionAttribute(parseProcName(i)) Then
Set GetObject = GetItemObject(GetObject, parseProcName(i))
Else
If IsObject(VBA.Interaction.CallByName(GetObject, parseProcName(i), VbGet)) Then
Set GetObject = VBA.Interaction.CallByName(GetObject, parseProcName(i), VbGet)
End If
End If
Next
'处理需要单独返回对象的属性
If AttributeIsObject = 1 Then
If IsObject(VBA.Interaction.CallByName(GetObject, parseProcName(0), VbGet)) Then
Set GetObject = VBA.Interaction.CallByName(GetObject, parseProcName(0), VbGet)
End If
End If
AtrributeName = parseProcName(UBound(parseProcName))
Erase parseProcName
End Function
'解析集合类对象
'用来解释如“Sections(1)”格式的集合对象
'要求集合对象必须包含Item方法
'字符串不允许包含类似Item(1)的方法
Public Function GetItemObject(ByVal Object As Object, ByVal AttributeName As String) As Object
Dim parseProcName() As String
parseProcName = Split(AttributeName, "(")
AttributeName = Trim(parseProcName(0))
Dim Index As Integer
Index = Trim(Replace(parseProcName(1), ")", ""))
Set GetItemObject = GetObject(Object, AttributeName, 1)
Set GetItemObject = GetItemObject.Item(Index)
Erase parseProcName
End Function
'判断当前的对象是否为集合对象
Private Function IsCollectionAttribute(ByVal AttributeName As String) As Boolean
IsCollectionAttribute = (InStr(1, AttributeName, "(") > 0)
End Function
'缺陷没有考虑错误处理
Public Event onError()
'根据字符串得到具体的属性值
Public Function GetAttributeValue(Object As Object, ByVal AttributeName As String)
GetAttributeValue = VBA.Interaction.CallByName(GetObject(Object, AttributeName), Trim(AttributeName), VbGet)
End Function
'根据字符串得到具体的对象
'AttributeIsObject = 0,表示当AttributeName表示的是属性名称
'AttributeIsObject = 1,表示当AttributeName表示的是对象名称
Public Function GetObject(ByVal Object As Object, ByRef AtrributeName As String, Optional AttributeIsObject = 0) As Object
Dim parseProcName() As String
parseProcName = Split(AtrributeName, ".")
Dim i As Integer
Set GetObject = Object
For i = 0 To UBound(parseProcName) - 1
If IsCollectionAttribute(parseProcName(i)) Then
Set GetObject = GetItemObject(GetObject, parseProcName(i))
Else
If IsObject(VBA.Interaction.CallByName(GetObject, parseProcName(i), VbGet)) Then
Set GetObject = VBA.Interaction.CallByName(GetObject, parseProcName(i), VbGet)
End If
End If
Next
'处理需要单独返回对象的属性
If AttributeIsObject = 1 Then
If IsObject(VBA.Interaction.CallByName(GetObject, parseProcName(0), VbGet)) Then
Set GetObject = VBA.Interaction.CallByName(GetObject, parseProcName(0), VbGet)
End If
End If
AtrributeName = parseProcName(UBound(parseProcName))
Erase parseProcName
End Function
'解析集合类对象
'用来解释如“Sections(1)”格式的集合对象
'要求集合对象必须包含Item方法
'字符串不允许包含类似Item(1)的方法
Public Function GetItemObject(ByVal Object As Object, ByVal AttributeName As String) As Object
Dim parseProcName() As String
parseProcName = Split(AttributeName, "(")
AttributeName = Trim(parseProcName(0))
Dim Index As Integer
Index = Trim(Replace(parseProcName(1), ")", ""))
Set GetItemObject = GetObject(Object, AttributeName, 1)
Set GetItemObject = GetItemObject.Item(Index)
Erase parseProcName
End Function
'判断当前的对象是否为集合对象
Private Function IsCollectionAttribute(ByVal AttributeName As String) As Boolean
IsCollectionAttribute = (InStr(1, AttributeName, "(") > 0)
End Function
相关测试类:
'ClassName :Student
Public Name As String
Public Sex As String
Public Name As String
Public Sex As String
测试模块:
Public Sub Test1()
Dim pt As New ParaseTier
Dim o As Object
Set o = Word.Application.ActiveDocument
'Demo 使用字符串获得属性
Debug.Print pt.GetAttributeValue(o, "Paragraphs(1).Range.Font.Name")
'Demo 使用字符串获得集合对象属性
Debug.Print pt.GetItemObject(o, "Paragraphs(1)").Range.Font.Name
'Demo 使用字符串获得对象
Debug.Print pt.GetObject(o, "Paragraphs", 1).Count
Set o = Nothing
Set pt = Nothing
End Sub
Public Sub Test2()
Dim pt As New ParaseTier
Dim o As Object
Set o = Word.Application.ActiveDocument
'Demo 使用字符串获得属性
Debug.Print pt.GetAttributeValue(o, "Paragraphs(1).Range.Font.Name")
'Demo 使用字符串获得集合对象属性
Debug.Print pt.GetItemObject(o, "Sections(1)").Index
'Demo 使用字符串获得对象
Debug.Print pt.GetObject(o, "Paragraphs", 1).Count
Set o = Nothing
Set pt = Nothing
End Sub
Public Sub test3()
Dim s As New Student
s.Name = "Duiker"
s.Sex = "男"
Dim ss As String
ss = InputBox("请输入需要获得的属性名称", "Name")
Select Case ss
Case "Name"
Debug.Print s.Name
Case "Sex"
Debug.Print s.Sex
End Select
Set s = Nothing
End Sub
Public Sub test4()
Dim s As New Student
s.Name = "Duiker"
s.Sex = "男"
Dim ss As String
ss = InputBox("请输入需要获得的属性名称", "Name")
Dim pt As New ParaseTier
Debug.Print pt.GetAttributeValue(s, ss)
Set s = Nothing
End Sub
这只是一个简易的框架,自己用来玩玩还行,主要的好处就是通过字符串可以快速的生成对象,或者获取属性的值,而且支持多层次的属性字符串,也支持类似于Item格式的对象集合。
参考文章:
1:vb6框架设计-对象导航
2:CallByName的一些缺陷
发表评论
-
启动NDuiker项目
2005-01-20 17:05 464今天是进驻博客园的第一天,在这里安家真的很不错,十分感谢DuD ... -
NDuiker项目第2天总结
2005-01-21 08:53 657昨天晚上基本上实现了 ... -
NDuiker项目第3天
2005-01-22 22:50 588今天是周六了,原本以为是很轻松的一天,结果只有到了这个时 ... -
NDuiker项目第6天
2005-01-25 16:50 596这几天好忙,也好累呀,这几天是公司项目收尾的阶段,忙的都透不过 ... -
对.Net 类库的一点思索
2005-02-02 09:29 617这些天主要在测试GDI+的 ... -
测试一个网站的想法
2005-02-05 17:07 547由于项目的需要,测试了一下“上海研发公共服务平台” 登录:ht ... -
项目建议书编写总结
2005-02-25 15:46 777昨天完成了项目建议书的编写工作,整个春节期间的工作到今天全部完 ... -
MyIE 增加了RSS功能
2005-02-28 09:54 576今天更新了MyIE,发现MyIE增加了RSS功能,试用了一下, ... -
www.beihua.edu.cn计划摘录
2005-02-28 14:11 786www.beihua.edu.cn工作计划 1:网站后期制作计 ... -
网站调研资料记录
2005-03-01 15:56 634资料整理备忘 1:内外网IP确认 ... -
静静的看书
2005-03-08 17:18 587这几天还是很忙,但是似乎好了很多,因为目前主要是写一个基于Sm ... -
我的Smart Client 的学习笔记
2005-03-09 15:35 1703User Interface Process (UIP) Ap ... -
研发、开发、运营
2005-03-25 12:15 637这些天很忙,网络也不争气,才刚刚好一点。 ... -
当需求变更来临
2005-04-30 14:26 546昨晚已经和老婆安排好5 ... -
重新登录Window2003的域
2005-05-12 09:58 690今天公司要求重新登录Windows2003的域,记录一下,以后 ... -
当不愿意写字得时候
2005-05-16 15:36 720做项目得前期分析得时候,我还是比较喜欢在本子上写写、画画得,通 ... -
远离技术的时候
2005-06-20 11:05 436这一个月一直在忙一个项目,现在项目的可研报告也 ... -
Asp.Net 中使用客户端Activex控件需要注意的事情
2005-08-13 12:57 958案例:Asp.Net +VB制作的Activex控件 操作系统 ... -
Office开发中的测试的与众不同之处
2005-08-22 14:29 736今天修改了一下自己以 ... -
大家确实都很忙
2005-08-27 08:20 738先谈几个技术问题: 1 ...
相关推荐
在本篇文章中,我们将深入探讨`CallByName`的应用案例,并通过实例来理解其工作原理。 首先,`CallByName`的基本语法如下: ```vb.net CallByName(Object, MethodOrProperty, CallType, [Arguments]) ``` - `...
VB代码与WebBrowser控制中的HTML代码,互相控制... 点VB中的按钮,改变网页的显示样式或内容。点网页中的按钮,修改VB中控件的属性,或调用VB中的函数。这只是一个如何实现的示例,没有什么强大功能,代码有中文说明。
调用函数vb程序
以下将详细介绍在ASP.NET中常见的几个函数:Abs、CallByName和CDec。 1. Abs函数: Abs函数是一个数学函数,用于返回指定数值的绝对值。在VB.NET或C#中,你可以这样使用它: ```csharp double num = -123.45; ...
1.动态调用类方法,模拟VB中的CallByName 2.附带了C#和VB的代码 3.主要是一个项目中用到了要调用很多参数和返回值相同的一系列函数,所以 想到了这个方法,不用重复的写方法名,使用循环调用
3. **使用CallByName访问变量**:在循环中,根据复选框的状态,使用`CallByName`方法获取对应字符串变量的值,并进行拼接。 **示例代码**: ```vb Private Sub Command1_Click() Dim str1 As String = "a" Dim ...
VBA中使用CallByName函数实现任意单变量函数求极值和方程求解
CallByName函数的用法如下:Result = CallByName(Object, ProcedureName, CallType, Arguments())CallByName的第一个参数包含要对其执行动作的对象名。第二个参数,ProcedureName,是一个字符串,包含将要调用的方法...
例如,`CallByName(obj, "PropertyName", vbLet, newValue)`会设置对象的属性,`CallByName(obj, "MethodName", vbMethod, [parameters])`则会调用对象的方法。 6. **类型转换函数**: Access VBA提供了多种类型...
上述代码演示了如何使用 `CallByName` 函数设置属性、获取属性值以及调用对象的方法。 #### 六、类型转换函数 **功能描述**: 类型转换函数用于将表达式强制转换为特定的数据类型。 **语法格式**: ```vba CBool...
- **功能**:`CallByName` 函数用于执行对象的方法、设置或返回对象的属性。 - **语法**:`CallByName(object, procname, calltype[, args()])` - **参数**: - `object`:必需的参数,对象的名称。 - `procname`...
本篇将详细介绍这些函数的关键知识点,包括但不限于`Abs`、`Array`、`Asc`、`Atn`、`CallByName`、`Choose`、`Chr`、`Command`、`Cos`以及`CreateObject`等函数的用法与应用场景。 #### 1. Abs 函数 - **功能简介**...
- `CallByName` 函数可用于获取或者设置一个属性,或者在运行时调用方法。 - 此函数提供了动态调用对象方法和属性的能力,增强了程序的灵活性。 - 调用类型包括 `vbLet`(设置属性)、`vbSetProperty`(获取属性)和...
例如,使用`Chr()`函数将ASCII码转换为字符,`Replace()`函数进行字符串替换,`CallByName`函数动态调用对象的方法,以及使用`Alias`替换函数名来混淆分析。 【防御宏病毒的手段】 防止宏病毒的关键在于禁用宏,这...
总的来说,这个“查看TypeLib(TLB_205)”项目提供了一套工具和资源,帮助开发者深入理解TypeLib的工作原理,增强对COM组件的调试和使用能力。通过学习和使用这些文件,开发者可以更好地掌握COM编程,提高代码的可...
CallByName 函数调用对象的方法或属性,其语法为 `CallByName(object, procedureName, callType, [arguments()])`。此函数允许动态调用方法或设置/获取属性,其中 `object` 是任何有效的对象引用,`procedureName` ...
综上所述,这份教程深入浅出地介绍了VB6中的面向对象编程技术,包括对象的概念、类与实例的关系、接口的使用、类型检查以及动态调用方法,为学习和实践VB6的OOP提供了坚实的理论基础和实用技巧。
CallByName obj, "Add", vbMethod, Array("key", "value") ``` **说明**: - `CallByName`函数可用于动态调用方法或设置/获取属性。 - 通过字符串指定过程名使得程序更加灵活,但也会增加调试难度。 ### 总结 以上...