ABOUT Visual Basic Programmieren Programmierung Download Downloads Tips & Tricks Tipps & Tricks Know-How Praxis VB VBA Visual Basic for Applications VBS VBScript Scripting Windows ActiveX COM OLE API ComputerPC Microsoft Office Microsoft Office 97 Office 2000 Access Word Winword Excel Outlook Addins ASP Active Server Pages COMAddIns ActiveX-Controls OCX UserControl UserDocument Komponenten DLL EXE
Diese Seite wurde zuletzt aktualisiert am 13.11.2000

Diese Seite wurde zuletzt aktualisiert am 13.11.2000
Aktuell im ABOUT Visual Basic-MagazinGrundlagenwissen und TechnologienKnow How, Tipps und Tricks rund um Visual BasicActiveX-Komponenten, Controls, Klassen und mehr...AddIns für die Visual Basic-IDE und die VBA-IDEVBA-Programmierung in MS-Office und anderen AnwendungenScripting-Praxis für den Windows Scripting Host und das Scripting-ControlTools, Komponenten und Dienstleistungen des MarktesRessourcen für Programmierer (Bücher, Job-Börse)Dies&Das...

Themen und Stichwörter im ABOUT Visual Basic-Magazin
Code, Beispiele, Komponenten, Tools im Überblick, Shareware, Freeware
Ihre Service-Seite, Termine, Job-Börse
Melden Sie sich an, um in den vollen Genuss des ABOUT Visual Basic-Magazins zu kommen!
Informationen zum ABOUT Visual Basic-Magazin, Kontakt und Impressum

Zurück...

Suchen im Baum

Zurück...


Anzeige

(-hg) mailto:hg_tvwfind@aboutvb.de

Mit Hilfe von rekursiven Prozeduren und Funktionen können Sie alle Knoten eines TreeView-Steuerelements bearbeiten (siehe: Knoten drunter und drüber"Knoten drunter und drüber"). Auf diese Weise können Sie auch die Knoten durchsuchen, und so beispielsweise alle Knoten finden, deren Text- oder Key-Eigenschaft einem bestimmten (Text-)Muster entspricht.

Sie übergeben der im folgenden vorgestellten Funktion im ersten Parameter das zu suchende Textmuster (entsprechend den Möglichkeiten des MSDN Library - VB LikeLike-Operators). Im nächsten, optionalen Parameter StartNode können Sie einen Knoten angeben, ab dem der Baum abwärts durchsucht werden soll. Lassen Sie diesen Parameter weg, sollen alle Knoten im TreeView-Steuerelement durchsucht werden. Dazu müssen Sie dann dieses im nächsten Parameter übergeben. Im weiteren optionalen Parameter geben Sie an, ob nur in den Text-Eigenschaften (Voreinstellung), nur in den Key-Eigenschaften oder ob in beiden Eigenschaften der Knoten gesucht werden soll. Im letzten optionalen Parameter geben sie schließlich die Vergleichsmethode an (Voreinstellung ist tfCompareText).

Damit die verschiedenen Kombinationen der zu durchsuchenden Eigenschaften und der Vergleichsmethoden eine möglichst optimale Performance erreichen, wird die eigentlich Suche in spezialisierten privaten Hilfsprozeduren durchgeführt. Die Funktion gibt eine Collection mit allen gefundenen Knoten zurück.

Da der MSDN Library - VB LikeLike-Operator von der MSDN Library - VB Option CompareOption Compare-Einstellung eines Moduls abhängig ist, werden in diesem Modul Ersatzfunktionen verwendet, die der gewählten Vergleichsmethode entsprechende Like-Operationen in zwei separaten Modulen mit unterschiedlicher Option Compare-Einstellung aufrufen (siehe: Like Binary oder Text"Like Binary oder Text").

Public Enum TreeViewCompareMethodConstants
  tfCompareBinary
  tfCompareText
End Enum

Public Enum TreeViewFindConstants
  tfText = 1
  tfKey = 2
  tfBoth = 3
End Enum

Public Enum TreeViewFindErrorConstants
  tfErrMissingParams = 35001
  tfErrNoNodes = 35002
  tfErrInvalidFindValue = 35003
  tfErrInvalidCompareMethod = 35004
End Enum

Public Function TreeViewFind(FindText As String, _
 Optional StartNode As Node, Optional TreeView As TreeView, _
 Optional ByVal Find As TreeViewFindConstants = tfText, _
 Optional ByVal CompareMethod As _
 TreeViewCompareMethodConstants = tfCompareText) _
 As Collection

  Dim nFound As Collection
  Dim nStartNode As Node
  
  Set nFound = New Collection
  If StartNode Is Nothing Then
    If TreeView Is Nothing Then
      Err.Raise tfErrMissingParams, "TreeViewFind"
    Else
      If TreeView.Nodes.Count Then
        Set nStartNode = TreeView.Nodes(1).FirstSibling
        Select Case CompareMethod
          Case tfCompareBinary
            Select Case Find
              Case tfText
                Do
                  zTreeViewFindTextCompareBinary nStartNode, _
                   FindText, nFound
                  Set nStartNode = nStartNode.Next
                Loop Until nStartNode Is Nothing
              Case tfKey
                Do
                  zTreeViewFindKeyCompareBinary nStartNode, _
                   FindText, nFound
                  Set nStartNode = nStartNode.Next
                Loop Until nStartNode Is Nothing
              Case tfBoth
                Do
                  zTreeViewFindBothCompareBinary nStartNode, _
                   FindText, nFound
                  Set nStartNode = nStartNode.Next
                Loop Until nStartNode Is Nothing
              Case Else
                Err.Raise tfErrInvalidFindValue, "TreeViewFind"
            End Select
          Case tfCompareText
            Select Case Find
              Case tfText
                Do
                  zTreeViewFindTextCompareText nStartNode, _
                   FindText, nFound
                  Set nStartNode = nStartNode.Next
                Loop Until nStartNode Is Nothing
              Case tfKey
                Do
                  zTreeViewFindKeyCompareText nStartNode, _
                   FindText, nFound
                  Set nStartNode = nStartNode.Next
                Loop Until nStartNode Is Nothing
              Case tfBoth
                Do
                  zTreeViewFindBothCompareText nStartNode, _
                   FindText, nFound
                  Set nStartNode = nStartNode.Next
                Loop Until nStartNode Is Nothing
              Case Else
                Err.Raise tfErrInvalidFindValue, "TreeViewFind"
            End Select
          Case Else
            Err.Raise tfErrInvalidCompareMethod, "TreeViewFind"
        End Select
      Else
        Err.Raise tfErrNoNodes, "TreeViewFind"
      End If
    End If
  Else
    Select Case CompareMethod
      Case tfCompareBinary
        Select Case Find
          Case tfText
            zTreeViewFindTextCompareBinary StartNode, FindText, _
             nFound
          Case tfKey
            zTreeViewFindKeyCompareBinary StartNode, FindText, _
             nFound
          Case tfBoth
            zTreeViewFindBothCompareBinary StartNode, FindText, _
             nFound
          Case Else
            Err.Raise tfErrInvalidFindValue, "TreeViewFind"
        End Select
      Case tfCompareText
        Select Case Find
          Case tfText
            zTreeViewFindTextCompareText StartNode, FindText, nFound
          Case tfKey
            zTreeViewFindKeyCompareText StartNode, FindText, nFound
          Case tfBoth
            zTreeViewFindBothCompareText StartNode, FindText, nFound
          Case Else
            Err.Raise tfErrInvalidFindValue, "TreeViewFind"
        End Select
      Case Else
        Err.Raise tfErrInvalidCompareMethod, "TreeViewFind"
    End Select
  End If
  Set TreeViewFind = nFound
End Function

Hier nun stellvertretend eine der spezialisierten Such-Prozeduren. Die Funktionsweise der übrigen Prozeduren ist gleich. Sie finden sie im Modul, das Sie zu diesem Artikel herunterladen können.

Private Sub zTreeViewFindTextCompareBinary(Node As Node, _
 FindText As String, Found As Collection)

  Dim nChildNode As Node
  
  With Node
    If LikeCompBinary(.Text, FindText) Then
      Found.Add Node
    End If
    If .Children Then
      Set nChildNode = .Child
      Do
        zTreeViewFindTextCompareBinary nChildNode, FindText, _
         Found
        Set nChildNode = nChildNode.Next
      Loop Until nChildNode Is Nothing
    End If
  End With
End Sub

Beim TreeView-Steuerelement der Version 6 können Sie der Tag-Eigenschaft eines Knotens auch Objekte zuweisen. Falls Sie dieses praktische Feature nutzen, um Knoten mit Objekten zu verbinden, können Sie die folgende Funktion dazu verwenden, den oder die Knoten ausfindig zu machen, dessen bzw. deren Tag-Eigenschaft Sie ein gegebenes Objekt zugewiesen haben. Im ersten Parameter übergeben Sie das gesuchte Objekt. Im Parameter StartNode geben Sie wieder den Startknoten an, oder Sie übergeben im darauffolgenden Parameter das TreeView-Steuerelement (wie oben bei der Funktion TreeViewFind beschrieben).

Falls Sie sicher sind, ein Objekt nur einem einzigen Knoten zugeordnet zu haben, können Sie den letzten Parameter OnlyFirstOccurance weglassen. Sein Voreinstellung True sorgt dafür, dass nur der erste Knoten ermittelt wird, dessen Tag-Eigenschaft das gesuchte Objekt zugewiesen ist. Als Rückgabewert der Funktion erhalten Sie in diesem Fall den ermittelten Knoten.

Wollen Sie alle Knoten ermitteln, deren Tag-Eigenschaft das gesuchte Objekt zugewiesen sein könnte, setzen Sie den Parameter OnlyFirstOccurance auf False. Die Funktion gibt dann eine Collection zurück, die den oder die gefundenen Knoten enthält.

Public Function TreeViewFindObjectInTag(FindObject As Object, _
 Optional StartNode As Node, Optional TreeView As TreeView, _
 Optional ByVal OnlyFirstOccurance As Boolean = True) As Object

  Dim nFound As Object
  Dim nStartNode As Node
  
  If Not OnlyFirstOccurance Then
    Set nFound = New Collection
  End If
  If StartNode Is Nothing Then
    If TreeView Is Nothing Then
      Err.Raise tfErrMissingParams, "TreeViewFindObjectInTag"
    Else
      If TreeView.Nodes.Count Then
        Set nStartNode = TreeView.Nodes(1).FirstSibling
        Do
          zTreeViewFindObjectInTag nStartNode, FindObject, _
           nFound, OnlyFirstOccurance
          If OnlyFirstOccurance And Not (nFound Is Nothing) Then
            Exit Do
          End If
          Set nStartNode = nStartNode.Next
        Loop Until nStartNode Is Nothing
      Else
        Err.Raise tfErrNoNodes, "TreeViewFindObjectInTag"
      End If
    End If
  Else
    zTreeViewFindObjectInTag StartNode, FindObject, nFound, _
     OnlyFirstOccurance
  End If
  Set TreeViewFindObjectInTag = nFound
End Function

Private Sub zTreeViewFindObjectInTag(Node As Node, _
 FindObject As Object, Found As Object, _
 ByVal OnlyFirstOccurance As Boolean)

  Dim nChildNode As Node
  
  With Node
    If IsObject(.Tag) Then
      If .Tag Is FindObject Then
        If OnlyFirstOccurance Then
          Set Found = Node
          Exit Sub
        End If
      Else
        Found.Add Node
      End If
    End If
    If .Children Then
      Set nChildNode = .Child
      Do
        zTreeViewFindObjectInTag nChildNode, FindObject, _
         Found, OnlyFirstOccurance
        Set nChildNode = nChildNode.Next
      Loop Until nChildNode Is Nothing
    End If
  End With
End Sub

Modul TvwFind und Hilfsmodule (tvwfind.zip - ca. 2,1 KB)


Artikel
Zum Download-Bereich dieses Artikel
Mail an den Autor dieses Artikels

KnowHow
Zur KnowHow-Übersicht

KnowHow-Themen
Themen - Allgemeines
Themen - Entwicklungsumgebung (VB-IDE)
Themen - Forms
Themen - Steuerelemente (Controls)
Themen - Grafik
Themen - Dateien
Themen - UserControls
Themen - Einsteiger-Tipps
Themen - Wussten Sie...?

Übersicht nach Titeln in alphabetischer Reihenfolge
Übersicht nach Erscheinungsdatum

Schnellsuche



Zum Seitenanfang

Copyright © 1999 - 2017 Harald M. Genauck, ip-pro gmbh  /  Impressum

Zum Seitenanfang

Zurück...

Zurück...

Download Internet Explorer