2009-12-04 49 views
1

有没有办法在循环中要求一个控件属性?Visual Basic 6中的控件属性

我需要somethig这样的:

For each p in control.properties 
    if p = "Value" then 
     msgbox "I Have Value Property" 
    elseif p = "Caption" then 
     msgbox "I Have Caption Property" 
    end if 
next 

它可能以某种方式做?

+0

作为一个侧面说明,VB.NET的的主要优点之一是,所有的控件都有'。文本属性而不是“Caption”或“Value”。 – Powerlord 2009-12-04 15:26:30

回答

5

在专家交流中找到此代码。添加对的参考TypeLib信息

Public Enum EPType 
    ReadableProperties = 2 
    WriteableProperties = 4 
End Enum 

Public Function EnumerateProperties(pObject As Object, pType As EPType) As Variant 
    Dim rArray() As String 
    Dim iVal As Long 
    Dim TypeLib As TLI.InterfaceInfo 
    Dim Prop As TLI.MemberInfo 
    On Error Resume Next 
    ReDim rArray(0) As String 
    Set TypeLib = TLI.InterfaceInfoFromObject(pObject) 
    For Each Prop In TypeLib.Members 
     If Prop.InvokeKind = pType Then 
      iVal = UBound(rArray) 
      rArray(iVal) = UCase$(Prop.Name) 
      ReDim Preserve rArray(iVal + 1) As String 
     End If 
    Next 
    ReDim Preserve rArray(UBound(rArray) - 1) As String 
    EnumerateProperties = rArray 
End Function 

您可以要求列出可读或可写属性。

红利,询问是否存在特定财产。

Public Function DoesPropertyExist(pObject As Object, ByVal _ 
    PropertyName As String, pType As EPType) As Boolean 
    Dim Item As Variant 
    PropertyName = UCase$(PropertyName) 
    For Each Item In EnumerateProperties(pObject, pType) 
     If Item = PropertyName Then 
      DoesPropertyExist = True 
      Exit For 
     End If 
    Next 
End Function 
+0

+1。还有一些很好的代码在这里工作http://stackoverflow.com/questions/547903/self-inspection-of-vb6-udts/550059#550059 – MarkJ 2009-12-04 17:38:53

0

我不确定你希望完成什么,但我很肯定VB6不支持你在说什么。你可以尝试这样的事情:

If control.Value Is Not Nothing Then 
    msgbox "I Have Value Property" 
Else If control.Caption Is Not Nothing Then 
    msgbox "I Have Caption Property" 

看看是否完成了你想要做的事情。

+1

会崩溃 – Fredou 2009-12-04 15:34:03

+0

其实,我甚至不确定它会编译。我仍然发现它比“对不起,你被搞砸了”更有帮助。 – iandisme 2009-12-04 15:49:12

2

比纳对你问的问题给出了很好的direct answer

我猜你可能会尝试做什么。也许你试图从控件中获取“文本”,但你不知道运行时控件的类型。你可以考虑类似这样的东西,它会依次尝试一些硬编码的属性名称,直到某些东西有效。

Function sGetSomeText(ctl As Object) As String 
    On Error Resume Next 
    sGetSomeText = ctl.Text 
    If Err = 0 Then Exit Function 
    sGetSomeText = ctl.Caption 
    If Err = 0 Then Exit Function 
    sGetSomeText = ctl.Value 
    If Err = 0 Then Exit Function 
    sGetSomeText = "" 'Nothing worked ' 
End Function 

另一种方法是在运行时检查控件的类型。您可以使用

然后,你可以切换到该绝对有Text属性的特定类型的控制代码等