CallByName的深入研究

由于工作的需要,我希望将长长的Case取消掉,但是CallbyName在层次和集合对象上的处理十分头疼,为了解决这个问题只能想别的办法了,唯一的办法是重新包装Callbyname,代码如下:

None.gif ' ClassName :ParaseTier
None.gif

None.gif
' 缺陷没有考虑错误处理
None.gif

None.gif
Public  Event onError()
None.gif
None.gif
' 根据字符串得到具体的属性值
None.gif
Public   Function  GetAttributeValue( Object   As   Object , ByVal AttributeName  As   String )
None.gif    GetAttributeValue 
=  VBA.Interaction.CallByName( GetObject ( Object , AttributeName),  Trim (AttributeName), VbGet)
None.gif
End Function
None.gif
None.gif
' 根据字符串得到具体的对象
None.gif'
AttributeIsObject = 0,表示当AttributeName表示的是属性名称
None.gif'
AttributeIsObject = 1,表示当AttributeName表示的是对象名称
None.gif
Public   Function   GetObject (ByVal  Object   As   Object , ByRef AtrributeName  As   String , Optional AttributeIsObject  =   0 As   Object
None.gif    
Dim  parseProcName()  As   String
None.gif    parseProcName 
=   Split (AtrributeName,  " . " )
None.gif    
Dim  i  As   Integer
None.gif    
Set   GetObject   =   Object
None.gif    
For  i  =   0   To   UBound (parseProcName)  -   1
None.gif       
If  IsCollectionAttribute(parseProcName(i))  Then
None.gif            
Set   GetObject   =  GetItemObject( GetObject , parseProcName(i))
None.gif       
Else
None.gif            
If   IsObject (VBA.Interaction.CallByName( GetObject , parseProcName(i), VbGet))  Then
None.gif                
Set   GetObject   =  VBA.Interaction.CallByName( GetObject , parseProcName(i), VbGet)
None.gif            
End   If
None.gif       
End   If
None.gif    
Next
None.gif    
None.gif    
' 处理需要单独返回对象的属性
None.gif
     If  AttributeIsObject  =   1   Then
None.gif        
If   IsObject (VBA.Interaction.CallByName( GetObject , parseProcName( 0 ), VbGet))  Then
None.gif            
Set   GetObject   =  VBA.Interaction.CallByName( GetObject , parseProcName( 0 ), VbGet)
None.gif        
End   If
None.gif    
End   If
None.gif    
None.gif    AtrributeName 
=  parseProcName( UBound (parseProcName))
None.gif    
Erase  parseProcName
None.gif
End Function
None.gif
None.gif
' 解析集合类对象
None.gif'
用来解释如“Sections(1)”格式的集合对象
None.gif'
要求集合对象必须包含Item方法
None.gif'
字符串不允许包含类似Item(1)的方法
None.gif
Public   Function  GetItemObject(ByVal  Object   As   Object , ByVal AttributeName  As   String As   Object
None.gif    
Dim  parseProcName()  As   String
None.gif    parseProcName 
=   Split (AttributeName,  " ( " )
None.gif    AttributeName 
=   Trim (parseProcName( 0 ))
None.gif    
Dim  Index  As   Integer
None.gif    Index 
=   Trim ( Replace (parseProcName( 1 ),  " ) " "" ))
None.gif    
Set  GetItemObject  =   GetObject ( Object , AttributeName,  1 )
None.gif    
Set  GetItemObject  =  GetItemObject.Item(Index)
None.gif    
Erase  parseProcName
None.gif
End Function
None.gif
None.gif
' 判断当前的对象是否为集合对象
None.gif
Private   Function  IsCollectionAttribute(ByVal AttributeName  As   String As   Boolean
None.gif    IsCollectionAttribute 
=  ( InStr ( 1 , AttributeName,  " ( " >   0 )
None.gif
End Function
None.gif

相关测试类:
None.gif ' ClassName :Student
None.gif
Public  Name  As   String
None.gif
Public  Sex  As   String
None.gif

测试模块:

None.gif
None.gif
Public   Sub  Test1()
None.gif    
Dim  pt  As   New  ParaseTier
None.gif    
Dim  o  As   Object
None.gif    
Set  o  =  Word.Application.ActiveDocument
None.gif    
None.gif    
' Demo 使用字符串获得属性
None.gif
    Debug.Print pt.GetAttributeValue(o,  " Paragraphs(1).Range.Font.Name " )
None.gif    
None.gif    
' Demo 使用字符串获得集合对象属性
None.gif
    Debug.Print pt.GetItemObject(o,  " Paragraphs(1) " ).Range.Font.Name
None.gif    
None.gif    
' Demo 使用字符串获得对象
None.gif
    Debug.Print pt. GetObject (o,  " Paragraphs " 1 ).Count
None.gif    
None.gif    
Set  o  =   Nothing
None.gif    
Set  pt  =   Nothing
None.gif
End Sub
None.gif
None.gif
None.gif
Public   Sub  Test2()
None.gif    
Dim  pt  As   New  ParaseTier
None.gif    
Dim  o  As   Object
None.gif    
Set  o  =  Word.Application.ActiveDocument
None.gif    
' Demo 使用字符串获得属性
None.gif
    Debug.Print pt.GetAttributeValue(o,  " Paragraphs(1).Range.Font.Name " )
None.gif    
' Demo 使用字符串获得集合对象属性
None.gif
    Debug.Print pt.GetItemObject(o,  " Sections(1) " ).Index
None.gif    
' Demo 使用字符串获得对象
None.gif
    Debug.Print pt. GetObject (o,  " Paragraphs " 1 ).Count
None.gif    
Set  o  =   Nothing
None.gif    
Set  pt  =   Nothing
None.gif
End Sub
None.gif
None.gif
Public   Sub  test3()
None.gif    
Dim  s  As   New  Student
None.gif    s.Name 
=   " Duiker"
None.gif
    s.Sex  =   " 男"
None.gif
     Dim  ss  As   String
None.gif    ss 
=   InputBox ( " 请输入需要获得的属性名称 " " Name " )
None.gif    
None.gif    
Select   Case  ss
None.gif        
Case   " Name"
None.gif
            Debug.Print s.Name
None.gif        
Case   " Sex"
None.gif
            Debug.Print s.Sex
None.gif    
End   Select
None.gif    
None.gif    
Set  s  =   Nothing
None.gif
End Sub
None.gif
None.gif
Public   Sub  test4()
None.gif    
Dim  s  As   New  Student
None.gif    s.Name 
=   " Duiker"
None.gif
    s.Sex  =   " 男"
None.gif
     Dim  ss  As   String
None.gif    ss 
=   InputBox ( " 请输入需要获得的属性名称 " " Name " )
None.gif    
Dim  pt  As   New  ParaseTier
None.gif    Debug.Print pt.GetAttributeValue(s, ss)
None.gif    
Set  s  =   Nothing
None.gif
End Sub
None.gif

这只是一个简易的框架,自己用来玩玩还行,主要的好处就是通过字符串可以快速的生成对象,或者获取属性的值,而且支持多层次的属性字符串,也支持类似于Item格式的对象集合。

参考文章:

1: vb6框架设计-对象导航
2: CallByName的一些缺陷
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值