VB6 PESQUISA EM LISTVIEW

LUISLPC 30/03/2013 15:38:26
#421276
Boa tarde amigos

a uns dias venho tentando fazer uma pesquisa em items de um listview.....consegui com o codigo abaixo:
no change do textbox

Citação:

Dim itm As MSComctlLib.ListItem

[ô]Set itm = ListView1.FindItem(Text1.Text, lvwSubItem)
[ô]for partial search use this:
Set itm = ListView1.FindItem(Text1.Text, lvwSubItem, , lvwPartial)
If Not itm Is Nothing Then
itm.EnsureVisible
itm.Selected = True
ListView1.SetFocus
Call pesquisa2
End If



porem ele so acha se e digitar o nome completo do item....preciso fazer que ele ache conforme eu va digitando......acho q nao seria esse codigo...tipo ele teria que ir filtrando conforme a palavra vai se formando no textbox....ja fiz uma vez isso mandando a pesquisa direto pro banco de dados....mas agora como o banco é enorme fica muito lento....tem como fazer direto no listview?
FFCOUTO 30/03/2013 16:35:10
#421277
Resposta escolhida
Esta rotina deve te ajudar.


[ô]*******************************************************************
[ô] Procedimento: PesquisarListView
[ô] Argumentos : Obj As Object
[ô] -> Qualquer ListView
[ô] TextoPesquisa As String
[ô] -> Texto que será pesquisado
[ô] Onde As Integer
[ô] -> Local da pesquisa, Item ou Subitems. 0 para Item
[ô] DiferenciarLetras As Boolean
[ô] -> Diferencia letras MAIÚSCULAS de minúsculas
[ô] PalavraInteira As Boolean
[ô] -> Pesquisa somente palavra inteira ou parte dela
[ô] Retorno : Integer
[ô] -> Item onde o critério de pesquisa foi encontrado
[ô] Objetivo : Procura no ListView por itens que satisfazem o critério
[ô] de pesquisa especificado nos parâmetros da rotina
[ô]*******************************************************************
Public Function PesquisarListView(ByVal obj As Object, ByVal TextoPesquisa As String, ByVal Onde As Integer, ByVal DiferenciarLetras As Boolean, ByVal PalavraInteira As Boolean) As Integer
Dim strFindString As String [ô]Declara as variáveis
Dim strSearch As String
Dim intSubItem As Integer
Dim szList As ListItem
Dim i As Integer

PesquisarListView = 0 [ô]Atribui falha
intSubItem = Onde [ô]Passa o local da pesquisa

[ô]Inicia a pesquisa no ListView, percorre cada item da lista
For i = 1 To obj.ListItems.Count
[ô]For Each szList In obj.ListItems
Set szList = obj.ListItems(i)
szList.Selected = False [ô]Desmarca a seleção do item

[ô]Difenciar maiúsculas/minúsculas
If DiferenciarLetras Then
strFindString = TextoPesquisa [ô]Passa o texto de pesquisa
If intSubItem = 0 Then [ô]Item da lista
strSearch = szList.Text
Else [ô]Subitem da lista
strSearch = szList.SubItems(intSubItem).Caption
End If
Else
strFindString = UCase(TextoPesquisa) [ô]Passa o texto e converte as letras para maiúsculas
If intSubItem = 0 Then [ô]Item da lista
strSearch = UCase(szList.Text)
Else [ô]SubItem da Lista
strSearch = UCase(szList.SubItems(intSubItem).Caption)
End If
End If

[ô]Verifica se é com palavra inteira
If PalavraInteira Then
[ô]Encontrou
If strSearch = strFindString Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If
Else
[ô]Encontrou
If Left$(strSearch, Len(strFindString)) = strFindString Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If
End If
Next
End Function


Para chamar a função:


iIndex = PesquisarListView(ListView1, Text1.Text, 0, False, False)

If iIndex > 0 Then
ListView1.ListItems(iIndex).EnsureVisible
ListView1.ListItems(iIndex).Selected = True
ListView1.SetFocus
Call pesquisa2
End If
LUISLPC 30/03/2013 16:43:14
#421278
opa

amigo

esta dando este erro:

Citação:

Invalid qualifier



nesta linha:

Citação:

strSearch = UCase(szList.SubItems(intSubItem).Caption)



pelo que vi a função é generica e posso usala em qualquer listview...basta especificalo no PesquisarListView.....certo?
LUISLPC 30/03/2013 18:16:41
#421280
Consegui, alterei de

SubItems

para

ListSubItems

ai funcionou...so q tem q ser pra chamar em um botao, pq se botar no change do textbox ele ja pega a primeira letra e vai pro resultado....

so que se for a segunda palavra que esteja no campo ele nao acha...o problema eh q assim, precisaria que ele buscasse e me listasse todos os items que estao no listview que contem a palavra [Ô]TESTE[Ô] por exemplo, indiferente se ela esteja no começo ou no fim do texto...

é possivel?
FFCOUTO 30/03/2013 18:26:37
#421282
LuisPC,

Realmente, esta é uma função genérica para qualquer ListView.
No fim da rotina nesta parte basta você efetuar uma mudança:

[ô]Encontrou
If Left$(strSearch, Len(strFindString)) = strFindString Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If

Para

[ô]Encontrou
If InStr(1, strSearch, strFindString) > 0 Then
PesquisarListView = szList.Index [ô]Retorna o resultado
Exit For [ô]Sai da função
End If


LUISLPC 30/03/2013 18:41:38
#421283
amigo

brigadao, perfeito...

funciona de ambas as formas....mas fiz o seguinte, ele filtra primeiro no banco de dados, depois aplica sua função, ou seja...ele busca no campo observação, tudo que contiver a palavra TESTE, depois aplica a pesquisa no list view e seleciona o primeiro item da lista com essa palavra...melhor do que eu precisava..pq antes o cliente reclamava que digitava oleo e aparecia primeiro vareta de oleo...agora ele seleciona o primeiro item que tenha a palavra oleo....

precisava agora so fazer o seguinte....ele seleciona o primeiro item perfeito, mas precisava que trouxesse a barra de rolagem pra cima...

anexei um arquivo para tentar demonstrar.

teria como?

FFCOUTO 01/04/2013 10:50:59
#421329
Olá LuisPC,

Acho que a questão da barra de rolagem não tem uma solução muito fácil. Pois é o próprio ListView que controla a posição depois que você executa o método EnsureVisible. Talvez com uso de API você possa solucionar isso, mas não tenho ideia de qual usar.

Mas creio que isso não vá atrapalhar em nada o seu uso.
LUISLPC 03/04/2013 21:45:13
#421480
boa noite

amigo, entao, como ficou o cliente ja gostou bastante, realmente como falasse da barra é complicado...mas aproveitando e nao querendo ser chato, com a função que me passasse, para ele ir filtrando conforme a palavra vai se formando, precisaria de muita alteraçao ou colocando no evento change do textbox usando a segunda opção que desse ja resolveria ?

Tópico encerrado , respostas não são mais permitidas