none
Erro quando código encontra um separador de menus. Só ocorre no XP, no Vista o erro não ocorre. RRS feed

  • Pergunta

  • Montei o código abaixo, com a ajuda do Alan Cossari, o qual agradeço aqui novamente.
    Mas tá dando um erro quando o código encontra um separador de menus. E este erro só ocorre quando o programa roda em XP, no Vista roda sem problenas.
    Coloquei este código "If TypeOf (Item) Is ToolStripMenuItem Then" na tentativa de evitar o erro, mas não resolveu.


    Private
    Sub Escalas_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    For Each Item As ToolStripMenuItem In MenuStrip1.Items

    If TypeOf (Item) Is ToolStripMenuItem Then 'ignora tudo o que no for ToolStripMenuItem

    ListBox2.Items.Add(Item.Text)

    preenchelistbox(Item) 

    End If

    Next

     

    End Sub

       


    Public
    Sub preenchelistbox(ByVal ToolstripMenuItem As ToolStripMenuItem) 
    'Faz a mesma coisa que a rotina do load 

    For Each Item As ToolStripMenuItem In ToolstripMenuItem.DropDownItems  

    If TypeOf (Item) Is ToolStripMenuItem Then 'ignora tudo o que não for ToolStripMenuItem
    'exemplo: se encontrar um separador de menus, vai ignor-lo e não dar erro 

    ListBox2.Items.Add(Item.Text)  

    End If

    'Aqui a parte mais importante. Isso se chama recursão, onde um mtodo
    'chama ele mesmo, e passa o prprio item que est sendo adicionado ao listbox
    'Assim ele adiciona o item e chama a mesma rotina para adicionar os seus respectivos
    'subItems 
     preenchelistbox(Item) End If 

    Next

     

    End Sub


    domingo, 16 de agosto de 2009 23:54

Respostas

  • Olá BladeRunner2019, não precisa me agradecer cara.
    Somos uma comunidade de desenvolvedores e temos muitas dúvidas. Nunca saberemos tudo e sempre existe alguém que sabe o que não sabemos por isso devemos compartilhar nossos conhecimentos. Só estou retribuindo o que muito já fizeram por mim.

    Agora sobre o seu problema. Estou com XP na minha máquina e uma solução que cheguei foi a de usar um for normal ao invés de for each. Veja:

    Public Sub preenchelistbox(ByVal ToolstripMenuItem As ToolStripMenuItem)
            'Faz a mesma coisa que a rotina do load 
    
    
            For i = 0 To ToolstripMenuItem.DropDownItems.Count - 1
                If TypeOf (ToolstripMenuItem.DropDownItems.Item(i)) Is ToolStripMenuItem Then 'ignora tudo o que não for ToolStripMenuItem
                    ListBox2.Items.Add(ToolstripMenuItem.DropDownItems.Item(i).Text)
                    preenchelistbox(ToolstripMenuItem.DropDownItems.Item(i))
                End If
            Next
    

    Debuguei aki na minha máquina e observei que o erro dava antes do if, dava quano o next do for each encontrava um separator, então resolvi usar o for normal
    espero ter te ajudado

    Grande Abraço.
    Alan
    • Sugerido como Resposta Alan Cossari segunda-feira, 17 de agosto de 2009 14:58
    • Marcado como Resposta BladeRunner2019 segunda-feira, 17 de agosto de 2009 22:03
    • Editado Alan Cossari quarta-feira, 27 de janeiro de 2010 11:14
    segunda-feira, 17 de agosto de 2009 03:27

Todas as Respostas

  • Olá BladeRunner2019, não precisa me agradecer cara.
    Somos uma comunidade de desenvolvedores e temos muitas dúvidas. Nunca saberemos tudo e sempre existe alguém que sabe o que não sabemos por isso devemos compartilhar nossos conhecimentos. Só estou retribuindo o que muito já fizeram por mim.

    Agora sobre o seu problema. Estou com XP na minha máquina e uma solução que cheguei foi a de usar um for normal ao invés de for each. Veja:

    Public Sub preenchelistbox(ByVal ToolstripMenuItem As ToolStripMenuItem)
            'Faz a mesma coisa que a rotina do load 
    
    
            For i = 0 To ToolstripMenuItem.DropDownItems.Count - 1
                If TypeOf (ToolstripMenuItem.DropDownItems.Item(i)) Is ToolStripMenuItem Then 'ignora tudo o que não for ToolStripMenuItem
                    ListBox2.Items.Add(ToolstripMenuItem.DropDownItems.Item(i).Text)
                    preenchelistbox(ToolstripMenuItem.DropDownItems.Item(i))
                End If
            Next
    

    Debuguei aki na minha máquina e observei que o erro dava antes do if, dava quano o next do for each encontrava um separator, então resolvi usar o for normal
    espero ter te ajudado

    Grande Abraço.
    Alan
    • Sugerido como Resposta Alan Cossari segunda-feira, 17 de agosto de 2009 14:58
    • Marcado como Resposta BladeRunner2019 segunda-feira, 17 de agosto de 2009 22:03
    • Editado Alan Cossari quarta-feira, 27 de janeiro de 2010 11:14
    segunda-feira, 17 de agosto de 2009 03:27
  • Perfeito Alan

    Obrigado
    segunda-feira, 17 de agosto de 2009 22:04