Pesquisar este blog

segunda-feira, 11 de abril de 2011

Localizar nó em um TreeView através de um texto

Vou descrever de forma bem simples como encontrar um nó em um TreeView através de uma String.


const
   Max = 30;

{* @brief GetItemByName
  * Localiza texto no treeview
  *}
function GetItemByName(Wnd : hWnd; hItem : HTREEITEM; szItemName : LPCTSTR) : HTREEITEM ;
var
   szBuffer: array [0..Max+1] of char;
   item : TTVItem;
   hItemFound, hItemChild : HTREEITEM;
begin
   // Se hItem for nil, inicia a busca a partir do primeiro item
   if (hItem = nil ) then
     hItem := HTREEITEM(SendMessage(Wnd, TVM_GETNEXTITEM, TVGN_ROOT, 0));
   while (hItem <> nil ) do
   begin
     item.hItem := hItem;
     item.mask := TVIF_TEXT OR TVIF_CHILDREN;
     item.pszText := szBuffer;
     item.cchTextMax := MAXTEXTLEN;
     SendMessage(Wnd, TVM_GETITEM, 0, longint(@item));
     if (lstrcmp(szBuffer, szItemName) = 0) then
     begin
       Result := hItem;
       Exit;
     end ;
     // Verifica os nós filhos
     if (item.cChildren > 0) then
     begin
       // Recursivo
       hItemChild := HTREEITEM(SendMessage(Wnd, TVM_GETNEXTITEM, TVGN_CHILD, longint(hItem)));
       hItemFound := GetItemByName(Wnd, hItemChild, szItemName);
       if (hItemFound <> nil ) then
       begin
         Result := hItemFound;
         Exit;
       end ;
     end ;
     hItem := HTREEITEM(SendMessage(Wnd, TVM_GETNEXTITEM, TVGN_NEXT, LPARAM(hItem)));
   end ;
   // Não encontrado
   Result := nil ;
end ;