2009-12-04 70 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屬性的特定類型的控制代碼等