Usuário com melhor resposta
Caixa de pesquisa (pesquisar por bocados da palavra ou bocados da definição)

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
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.
- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 17 de fevereiro de 2015 16:12
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 17 de fevereiro de 2015 16:12
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.
- Sugerido como Resposta Ricardo Barbosa Cortes terça-feira, 17 de fevereiro de 2015 16:12
- Marcado como Resposta Ricardo Barbosa Cortes terça-feira, 17 de fevereiro de 2015 16:12
-
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