Searches for items with a
          given name "in depth". If the VarDictionary object contains
          other VarDictionary objects in its items they will be searched too.
          See the details below.Syntax:
        
          Set result = object.FindByName( name,
          [first [, maxElements [, depth ]]]) 
           
          IDL definition: 
          [id(18), helpstring("method FindByName")] 
HRESULT FindByName(	[in] BSTR bstrName,
			[in,defaultvalue(1)] long lFirst,
			[in,defaultvalue(1)] long lMax,
			[in,defaultvalue(-1)] long lDepth,
			[out,retval] IDispatch** ppResult);
         
        Parameters: 
        
          object - Previously created VarDictionary object 
          name - String - the name to search 
          first - (optional, number) specifies first element found to
          be returned (1- based). For example if there are 10 elements with this
          name and first is set to 5 - then the first 4 elements will not be
          returned. The default value is 1. 
          maxElement - (optional, number, default is 1) Maximum
          elements to return. Search will end when the maxElements are found. 
          depth - (optional, number, default is -1) If the
          VarDictionary is a collection of collections - i.e. some items in the
          collection are other VarDictionary objects you could think about the
          VarDictictionary object being searched as for a root node in a tree. 
           depth specifies how deep the search will be. Value of
          -1 means unlimited, 0 means - only the current collection, positive
          number specifies the maximum levels to be searched. 
          Returns (result): A collection of the items
          found. Even if the found item is only one it will be placed in a
          collection containing one item (e.g. it will be its first element).
          The returned collection is new VarDictionary object. Thus you could
          determine the actual number of the found items by using the Count
          property and the found items can be enumerated using For Each ...
          constructions or indexing the items from 1 to result.Count. The retuned
          collection enumerates the items (not their names). 
         
        Examples:
          ' Fill some data to prepare the example 
          Set coll = CreateObject("newobjects.utilctls.VarDictionary") 
          coll.Add "A", 15 
          coll.Add "B", 32 
          coll.Add "C", coll.CreateNew 
          coll("C").Add "A", 12 
          coll("C").Add "B", "Blah" 
          Set found = coll.FindByName("A",1,100) 
          For k = 1 To found.Count 
            Response.Write "Found A = " & found(k) &
          "<BR>" 
          Next 
          This example will output: 
          A = 15 
          A = 12 
          Let change the search criteria: 
          ... 
          Set found = coll.Find("C",1,100) 
          This will return 1 item in the result collection. The item will be
          the sub-collection we added under the name "C". In the
          "real world" if you expect items returned to contain values
          and objects as well, and if the difference is important, the code
          inspecting the results will need to test the type of each returned
          item: 
          ' Fill some data to prepare the example 
          Set coll = CreateObject(" newobjects.utilctls.VarDictionary") 
          coll.Add "A", 15 
          coll.Add "B", coll.CreateNew 
          coll("B").Add "X", "Blah blah" 
          coll("B").Add "C", coll.CreateNew 
          coll("B")("C").Add "C", 121 
          coll.Add "C", coll.CreateNew 
          coll("C").Add "A", 12 
          coll("C").Add "B", "Blah" 
          Set found = coll.FindByName("C",1,100) 
          For k = 1 To found.Count 
            If IsObject(result(k)) Then 
              Response.Write "Found object (subtree)
          <BR>" 
            Else 
              Response.Write "Found value C = " &
          found(k) & "<BR>" 
            End If 
          Next 
        Remarks:
          
        VarDictionary object is a flexible collection tool thus it is
        possible to use it to represent different structures and not only simple
        collections of values. For example ASP Compiler's parser returns the
        object model of the page as tree of VarDictionaries, ConfigFile
        object returns or expects VarDictionary trees - then they could be saved
        as entire branch in the registry or to a file. 
        Ability to search through such structures helps to build simple code
        that will not need to trace the tree itself in order to find single item
        (or a few) items. You are able to prepare similar complex structures on
        your own and represent a structured data and then search through
        it.  
        The method returns a collection. This may look a bit hard to deal
        with but note the following statement: 
        Set found = coll.FindByName("C")(1) 
        As the result of the method call is a collection, we could get its
        first element immediately - in the same statement. Thus the (1) after
        the function call refers the result's first element! What will happen if
        nothing is found? The returned collection is a VarDictionary object too
        thus referring non-existent element (suppose the item with name
        "C" is not found) will not cause script error. The value of
        the Missing property will be returned instead. Thus the application may
        check what the result is and understand if the searched item is found or
        not. Usually most of the applications use Empty or Null for the missing
        property and respectively one of these values is returned. If the tree
        you are searching is returned by another object check its documentation
        to see how the collections are configured by the object. Let's
        illustrate the above - suppose Empty is returned: 
        Set found = coll.FindByName("C")(1) 
        If IsEmpty(found) Then 
          ' Deal with the case when nothing is found 
        Else 
          ' Ok - found the item 
        End IF 
        In many cases the application will expect the found item to be an
        object. For example you may want to find an item containing a
        sub-collection (branch of the tree) only. Then the above test of the
        result could become: 
        If IsObject(found) Then 
          '.... 
        The above shows illustrates the benefits of returning a collection
        from the FindByName method (the same is the case with FindByValue
        method). The same method call is good for the both cases - one item
        found and many items found. 
        See also FindByValue
        method.  
           
        
         |