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.