`

CallByName的深入研究

阅读更多
由于工作的需要,我希望将长长的Case取消掉,但是CallbyName在层次和集合对象上的处理十分头疼,为了解决这个问题只能想别的办法了,唯一的办法是重新包装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 = 0As 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 StringAs 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 StringAs Boolean
    IsCollectionAttribute 
= (InStr(1, AttributeName, "("> 0)
End Function

相关测试类:
'ClassName :Student
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的一些缺陷
分享到:
评论

相关推荐

    vb.net下Callbyname的应用案例

    在本篇文章中,我们将深入探讨`CallByName`的应用案例,并通过实例来理解其工作原理。 首先,`CallByName`的基本语法如下: ```vb.net CallByName(Object, MethodOrProperty, CallType, [Arguments]) ``` - `...

    vb_js_example.rar_VB CallByName JS_VB控制_[JS_example.js]_vb WebBr

    VB代码与WebBrowser控制中的HTML代码,互相控制... 点VB中的按钮,改变网页的显示样式或内容。点网页中的按钮,修改VB中控件的属性,或调用VB中的函数。这只是一个如何实现的示例,没有什么强大功能,代码有中文说明。

    vb程序调用函数

    调用函数vb程序

    asp.net常用函数

    以下将详细介绍在ASP.NET中常见的几个函数:Abs、CallByName和CDec。 1. Abs函数: Abs函数是一个数学函数,用于返回指定数值的绝对值。在VB.NET或C#中,你可以这样使用它: ```csharp double num = -123.45; ...

    C#动态调用类方法

    1.动态调用类方法,模拟VB中的CallByName 2.附带了C#和VB的代码 3.主要是一个项目中用到了要调用很多参数和返回值相同的一系列函数,所以 想到了这个方法,不用重复的写方法名,使用循环调用

    张志晨VB实例教程之字符串转换成变量名

    3. **使用CallByName访问变量**:在循环中,根据复选框的状态,使用`CallByName`方法获取对应字符串变量的值,并进行拼接。 **示例代码**: ```vb Private Sub Command1_Click() Dim str1 As String = "a" Dim ...

    任意单变量函数求解与求极值.xlsm

    VBA中使用CallByName函数实现任意单变量函数求极值和方程求解

    vb6面对对象编程经典技术教程指南(推荐).doc

    CallByName函数的用法如下:Result = CallByName(Object, ProcedureName, CallType, Arguments())CallByName的第一个参数包含要对其执行动作的对象名。第二个参数,ProcedureName,是一个字符串,包含将要调用的方法...

    access vba函数

    例如,`CallByName(obj, "PropertyName", vbLet, newValue)`会设置对象的属性,`CallByName(obj, "MethodName", vbMethod, [parameters])`则会调用对象的方法。 6. **类型转换函数**: Access VBA提供了多种类型...

    VBA 函数大全.doc

    上述代码演示了如何使用 `CallByName` 函数设置属性、获取属性值以及调用对象的方法。 #### 六、类型转换函数 **功能描述**: 类型转换函数用于将表达式强制转换为特定的数据类型。 **语法格式**: ```vba CBool...

    ACCESS 函数

    - **功能**:`CallByName` 函数用于执行对象的方法、设置或返回对象的属性。 - **语法**:`CallByName(object, procname, calltype[, args()])` - **参数**: - `object`:必需的参数,对象的名称。 - `procname`...

    vb.net 函数查询手册

    本篇将详细介绍这些函数的关键知识点,包括但不限于`Abs`、`Array`、`Asc`、`Atn`、`CallByName`、`Choose`、`Chr`、`Command`、`Cos`以及`CreateObject`等函数的用法与应用场景。 #### 1. Abs 函数 - **功能简介**...

    VB函数.pdf

    - `CallByName` 函数可用于获取或者设置一个属性,或者在运行时调用方法。 - 此函数提供了动态调用对象方法和属性的能力,增强了程序的灵活性。 - 调用类型包括 `vbLet`(设置属性)、`vbSetProperty`(获取属性)和...

    宏病毒的研究与实例分析01——基础篇1

    例如,使用`Chr()`函数将ASCII码转换为字符,`Replace()`函数进行字符串替换,`CallByName`函数动态调用对象的方法,以及使用`Alias`替换函数名来混淆分析。 【防御宏病毒的手段】 防止宏病毒的关键在于禁用宏,这...

    查看TypeLib(TLB_205)

    总的来说,这个“查看TypeLib(TLB_205)”项目提供了一套工具和资源,帮助开发者深入理解TypeLib的工作原理,增强对COM组件的调试和使用能力。通过学习和使用这些文件,开发者可以更好地掌握COM编程,提高代码的可...

    VB常用函数与语句.txt

    CallByName 函数调用对象的方法或属性,其语法为 `CallByName(object, procedureName, callType, [arguments()])`。此函数允许动态调用方法或设置/获取属性,其中 `object` 是任何有效的对象引用,`procedureName` ...

    vb6面对对象编程经典技术教程指南.pdf

    综上所述,这份教程深入浅出地介绍了VB6中的面向对象编程技术,包括对象的概念、类与实例的关系、接口的使用、类型检查以及动态调用方法,为学习和实践VB6的OOP提供了坚实的理论基础和实用技巧。

    EXCEL VBA函数手册

    CallByName obj, "Add", vbMethod, Array("key", "value") ``` **说明**: - `CallByName`函数可用于动态调用方法或设置/获取属性。 - 通过字符串指定过程名使得程序更加灵活,但也会增加调试难度。 ### 总结 以上...

Global site tag (gtag.js) - Google Analytics