Visual Basic, VB .NET, ASP, Active X, Access, SQL Server

Como criar uma lista dos arquivos mais recentemente utilizados (MRU) no Visual Basic

Muitas aplicações oferecem uma lista dos arquivos mais recentemente utilizados. Esta lista é usada para selecionar rapidamente um arquivo ou projeto que foi recentemente aberto sem ter que selecionar o menu Arquivo\Abrir e navegar ao local do arquivo. Este artigo demonstra uma abordagem para conseguir esta funcionalidade.

O Visual Basic não oferece nenhum mecanismo próprio para gerenciar a lista de arquivos mais recentemente utilizados. Contudo, como um desenvolvedor, você pode facilmente criar esta lista através do uso de uma matriz de menus. O uso da matriz de menus  permite que você adicione dinamicamente itens de menus a um formulário Visual Basic durante a execução do programa. Há alguns pré-requisitos para uma matriz de menus funcionar. Primeiramente, a primeiro elemento da matriz deve ser criado durante a fase de design do formulário. Isto é tão simples como criar um item qualquer de menu e, então, atribuir à sua propriedade INDEX o valor 0, fazendo dele o primeiro elemento, elemento 0, da matriz. Uma vez feito isto, o método LOAD pode ser usado para criar elementos adicionais na matriz. Uma coisa importante de notar é que, por padrão, a propriedade VISIBLE dos elementos da matriz criados em tempo de execução é FALSE. Portanto, você também precisa atribuir TRUE a esta propriedade se quiser que o usuário veja o novo item. 

Para maires informações sobre matrizes de menus e de controles em geral, favor consultar a documentação online do VB pesquisando por "Control Array".

Na seqüência, criaremos um pequeno, mas plenamente funcional exemplo de lista de arquivos MRU. Este exemplo apresenta os seguintes recursos:

Ele é dinâmico e permite número variável de itens de MRU.
Um número máximo de entradas MRU pode ser definido.
A lista sempre é classificada do "mais recente" para o "menos recente".
A lista MRU é salva no registro do Windows após a aplicação se encerrar e carregada na inicialização da aplicação.

PASSOS PARA CRIAR O EXEMPLO

Crie um novo projeto padrão no Visual Basic. Form1 é criado por padrão.
Do menu Project, selecione Components, cheque Microsoft Common Dialog control e clique OK.
Adicione um controle Common Dialog ao Form1.
Do menu Tools, selecione Menu Editor, e crie a seguinte estrutura de menu: 

Arquivo (Name = mnuArquivo) 
---Abrir (Name = mnuAbrir) 
---Lista MRU (Name = mnuMRU, Visible = False, Index = 0) 
---Sair (Name = mnuSair)


Cole o código a seguir na janela de código de Form1:

Option Explicit

Private Const MaxMRU = 4 'Número máximo de MRUs na lista (-1 para sem limite)
Private Const NaoEncontrado = -1 'Indica que uma entrada duplicada não foi encontrada
Private Const SemMRUs = -1 'Indica que nenhum MRUs está criado

Private MRUCount As Long 'Mantém uma contagem de MRUs criados

Private Sub Form_Load()
' Inicializa o contador de MRUs
MRUCount = SemMRUs

' Chama sub para retornar os nomes de arquivos MRU

    GetMRUFileList
End Sub

Private Sub Form_Unload(Cancel As Integer)
' Chama sub para salvar nomes de arquivos MRU 
    SaveMRUFileList
End Sub

Private Sub mnuMRU_Click(Index As Integer)
' Chama sub para reordenar a lista de MRUs
    ReorderMRUList mnuMRU(Index).Caption, CLng(Index)
End Sub

Private Sub mnuAbrir_Click()
' Mostra o diálog de abertura de arquivo
Me.CommonDialog1.ShowOpen

' Chana sub para adicionar este arquivo ao MRU
AddMRUItem Me.CommonDialog1.FileName
End Sub

Private Sub AddMRUItem(NewItem As String)
Dim result As Long

' Cham sub para checar por duplicidades
result = CheckForDuplicateMRU(NewItem)

' Trata caso em que é encontrada duplicidade
If result <> NaoEncontrado Then
' Chama sub para reordenar a lista MRU
ReorderMRUList NewItem, result
Else
' Chama sub para adicionar novo item ao menu MRU
AddMenuElement NewItem
End If
End Sub

Private Function CheckForDuplicateMRU(ByVal NewItem As String) As Long
Dim i As Long

' Muda NewItem para caixa alta para fazer comparação
NewItem = UCase$(NewItem)

' Checa todos os MRUs existentes em busca de duplicidade
For i = 0 To MRUCount
If UCase$(Me.mnuMRU(i).Caption) = NewItem Then
' Duplicação encontrada, retorna a localização da duplicação
CheckForDuplicateMRU = i

' Para pesquisa
Exit Function
End If
Next i

' Nenhum duplicado foi encontrado, retorna -1
CheckForDuplicateMRU = -1
End Function

Private Sub mnuSair_Click()
' Fecha o programa
Unload Me
End Sub

Private Sub AddMenuElement(NewItem As String)
Dim i As Long

' Verifica que não vamos exceder o máximo de MRUs
If (MRUCount < (MaxMRU - 1)) Or (MaxMRU = -1) Then
'Incrementa o contador de menus
MRUCount = MRUCount + 1

'Verifica se este é o primeiro item
If MRUCount <> 0 Then
' Adiciona um novo elemento ao menu
Load mnuMRU(MRUCount)
End If

' Torna o novo elemento visível
mnuMRU(MRUCount).Visible = True
End If

' Move itens para manter ordem do mais recente para o menos recente
For i = (MRUCount) To 1 Step -1
' Ajusta os captions
mnuMRU(i).Caption = mnuMRU(i - 1).Caption
Next i

' Atribui caption para o novo item
mnuMRU(0).Caption = NewItem
End Sub

Private Sub ReorderMRUList(MRUDuplicado As String, LocalDoDuplicado As Long)
Dim i As Long

' Move entradas previamente "mais recentes" que o 
' duplicado uma posição abaixo na lista de MRU
For i = LocalDoDuplicado To 1 Step -1
mnuMRU(i).Caption = mnuMRU(i - 1).Caption
Next i

' Atribui caption do novo item
mnuMRU(0).Caption = MRUDuplicado 
End Sub

Private Sub GetMRUFileList()
Dim i As Long 'variável de controle de loop
Dim result As String 'Nome do MRU do registry

' Loop por todas as entradas
Do
' Pega entrada do registro
result = GetSetting(App.Title, "ArquivosMRU", Trim$(CStr(i)), "")

' Verifica se foi retornado um valor
If result <> "" Then
' Chama sub que adiciona item à lista MRU
AddMRUItem result
End If

' Incrementa contador
i = i + 1
Loop Until (result = "")
End Sub

Private Sub SaveMRUFileList()
Dim i As Long ' variável de controle de loop
' Loop por todos MRUs
For i = 0 To MRUCount
' Grava MRU no registro com argumento Key igual à sua posição na lista
SaveSetting App.Title, "ArquivosMRU", Trim$(CStr(i)), mnuMRU(i).Caption
Next i
End Sub

Salve e execute o exemplo.
Do menu Arquivo, selecine Abrir e escolha qualquer arquivo. Repita este passo várias vezes e você poderá ver a lista de arquivos MRU no menu Arquivo. Cada arquivo que você selecionar aparece, na ordem do mais recentemente selecionado, como um item de menu abaixo do menu Arquivo. Se você selecionar o mesmo arquivo duas vezes, ele apenas aparece uma na lista. Se você selecioná-lo uma segunda vez, ele deve ser movido para o topo da lista. Selecinando um destes itens do menu Arquivo, também o move para o topo da lista MRU.


Note que há uma constante nomeada MaxMRU. Esta constante define o número máximo de entradas que aparecem como arquivos recentes no menu Arquivo. No código de exemplo acima, este valor foi deixado em 4.