none
Caixa de pesquisa (pesquisar por bocados da palavra ou bocados da definição) RRS feed

  • Pergunta

  • O meu programa é um glossário, onde posso adicionar palavras e as suas definições. 

    O meu objetivo: colocar tudo em minúsculas, converter os caracteres com acentos em simples, tanto para os itens das my.settings como para o texto pesquisado.

    p_nível: lista (combobox) de vários níveis

    p_classe: (combobox) lista de várias classes

    p_ter: caixa de pesquisa (textbox) por termo (bocados da palavra)

    p_def: caixa de pesquisa (textbox) por definição (bocados da definição da palavra)

    Pesquisar: botão para procurar

    itens: objeto do tipo listview, onde todas as palavras encontradas aparecem

    Todas as definições em my.settings são do tipo system.collections.specialized.stringcollection e já têm inicialmente um item adicionado.

    Private Sub Pesquisar_Click(sender As Object, e As EventArgs) Handles Pesquisar.Click
            itens.Clear()
    
            'Conversão das definições
            Dim defs As New ListBox
            defs.Items.Clear()
            Dim novotdef As String = "texto"
            Dim substituir() As Char = "àèìòùÀÈÌÒÙ äëïöüÄËÏÖÜ âêîôûÂÊÎÔÛ áéíóúÁÉÍÓÚðÐýÝ ãñõÃÑÕšŠžŽçÇåÅøØ".ToCharArray
            Dim substituição() As Char = "aeiouAEIOU aeiouAEIOU aeiouAEIOU aeiouAEIOUdDyY anoANOsSzZcCaAoO".ToCharArray
    
            If p_def.Text <> Nothing Then
                For Each obj As String In My.Settings.Pal_significado
                    Dim novoobj As String = obj.ToLower
                    For ind2 As Integer = 0 To substituir.GetUpperBound(0)
                        novoobj = novoobj.Replace(substituir(ind2), substituição(ind2))
                    Next
                    defs.Items.Add(novoobj)
                Next
    
                novotdef = p_def.Text.ToLower
                For ind3 As Integer = 0 To substituir.GetUpperBound(0)
                    novotdef = novotdef.Replace(substituir(ind3), substituição(ind3))
                Next
            End If
            'Conversão das palavras
            Dim pals As New ListBox
            pals.Items.Clear()
            For Each obj2 As String In My.Settings.Pal_palavra
                Dim novoobj2 As String = obj2.ToLower
                For ind4 As Integer = 0 To substituir.GetUpperBound(0)
                    novoobj2 = novoobj2.Replace(substituir(ind4), substituição(ind4))
                Next
                pals.Items.Add(novoobj2)
            Next
            Dim novotpal As String = "texto"
            If p_ter.Text = Nothing Then
            Else
                novotpal = p_ter.Text.ToLower
                For ind5 As Integer = 0 To substituir.GetUpperBound(0)
                    novotpal = novotpal.Replace(substituir(ind5), substituição(ind5))
                Next
            End If
    
            For ind As Integer = 0 To My.Settings.Pal_nível.Count - 1
                If p_nível.SelectedIndex = 0 Or My.Settings.Pal_nível(ind).Contains(p_nível.SelectedItem) Then
                    If p_classe.SelectedIndex = 0 Or My.Settings.Pal_classes(ind).Contains(p_classe.SelectedIndex) Then
                        If p_ter.Text = Nothing Or pals.Items(ind).Contains(novotpal) Then
                            If p_def.Text = Nothing Or defs.items(ind).Contains(novotdef) Then
    
                                Dim índice As Integer = My.Settings.Pal_palavra.IndexOf(p_ter.Text)
    
                                Dim cor1 As Integer = aleat.Next(0, 256)
                                Dim cor2 As Integer = aleat.Next(0, 256)
                                Dim cor3 As Integer = aleat.Next(0, 256)
                                Dim coro As Integer = 0.2 * cor1 + 0.6 * cor2 + 0.2 * cor3
    
                                itens.Items.Add(My.Settings.Pal_palavra(ind))
                                itens.Items.Item(itens.Items.Count - 1).BackColor = Color.FromArgb(cor1, cor2, cor3)
                                If coro > 128 Then
                                    itens.Items.Item(itens.Items.Count - 1).ForeColor = Color.Black
                                Else
                                    itens.Items.Item(itens.Items.Count - 1).ForeColor = Color.White
                                End If
    
                            End If
    
                        End If
    
                    End If
    
                End If
    
            Next
    
        End Sub

    O erro irritante que obtenho é:

    An unhandled exception of type 'System.NullReferenceException' occurred in Glossariadas_b.exe

    Additional information: A referência de objecto não foi definida como uma instância de um objecto.

    Alguém para ajudar? Obrigado, desde já.


    • Editado João Fradus domingo, 15 de fevereiro de 2015 12:14
    domingo, 15 de fevereiro de 2015 11:07

Respostas

  • Ok, primeiro - que use o debuger para acompanhar passo a passo e veja em que linha o erro acontece.

    Segundo, por que?

    Dim defs As New ListBox
    Dim pals As New ListBox

    O ListBox é um componente visual para Windows Forms, se você está utilizando só para trabalhar na memória, use um array ou uma coleção de "System.Collections.Generic", como "List(String)".

    Como eu vejo, o erro pode acontecer também no "Replace(String, String)". Você filtrou se a String é diferente de NOTHING, mas NOTHING e vazio ("") são coisas diferentes. E em "obj2" esse filtro não é feito.

    Para te dar uma explicação melhor, diga em que linha você está recebendo o erro.

    domingo, 15 de fevereiro de 2015 22:21

Todas as Respostas

  • Ok, primeiro - que use o debuger para acompanhar passo a passo e veja em que linha o erro acontece.

    Segundo, por que?

    Dim defs As New ListBox
    Dim pals As New ListBox

    O ListBox é um componente visual para Windows Forms, se você está utilizando só para trabalhar na memória, use um array ou uma coleção de "System.Collections.Generic", como "List(String)".

    Como eu vejo, o erro pode acontecer também no "Replace(String, String)". Você filtrou se a String é diferente de NOTHING, mas NOTHING e vazio ("") são coisas diferentes. E em "obj2" esse filtro não é feito.

    Para te dar uma explicação melhor, diga em que linha você está recebendo o erro.

    domingo, 15 de fevereiro de 2015 22:21
  • Olá!

    Parece que consegui resolver o erro ao alterar o contains da linha por um =

    If p_classe.SelectedIndex = 0 Or My.Settings.Pal_classes(ind) = p_classe.SelectedIndex Then

    , e era mesmo isto que queria,

    mas houve outro erro, apenas 2 linhas abaixo, que diz:

    An unhandled exception of type 'System.ArgumentOutOfRangeException' occurred in System.Windows.Forms.dll

    Additional information: InvalidArgument=Valor de '0' inválido para 'index'.


    A linha onde ocorre é:

    If p_def.Text = Nothing Or defs.Items(ind).Contains(novotdef) Then

    Já agora, quanto a fazer um array ou uma coleção de "System.Collections.Generic", ainda vou ter que pesquisar um pouco, é que não percebo ainda muito disto, ando a aprender umas coisitas enquanto faço este e outros programinhas.

    Agradeço a disponibilidade!


    • Editado João Fradus quinta-feira, 26 de fevereiro de 2015 21:49
    quinta-feira, 26 de fevereiro de 2015 21:48