Caminho relativo mais enumeração

Lá no meu começo de programador, eu tinha o hábito de indicar o local de arquivos, utilizando o caminho absoluto.  Um exemplo de como eu carregava uma imagem:

me!MeuCampoImagem.Picture = "C:\MeuProjeto\imagens\NomeImagem.gif"

Imagina um projeto grande e cheio de "c:\" espalhado pelo vba?  Pois é, se tivesse que mudar a minha pasta de local, como por exemplo, para o Arquivos de Programas ou para uma unidade de pendrive, passaria a ter uma pequena dor de cabeça.  Isso é até relativamente fácil de se resolver com o Localizar e Substituir do vba, mas ter que mexer em algo que já estava funcionando é perda de tempo.

Isso é bem fácil de se resolver com a propriedade Path do objeto CurrentProject.  Exemplo:

me!MeuCampoImagem.Picture = currentProject.path & "\imagens\NomeImagem.gif"

O CurrentProject.path informa então o caminho completo aonde se encontra o banco de dados.  Abra a Janela Imediata do Visual Basic, através do menu exibir ou dando um CTRL+G e faça um teste digitando o comando CurrentProject.path.  Veja o meu teste na figura abaixo:

Usando Access

 

Mesmo que se troque a localidade da pasta ou o nome da pasta, o caminho sempre será indicado corretamente.

Então o currentproject.path acaba se tornando um caminho relativo para todas as subpastas aonde se encontra o banco de dados.  Veja na figura abaixo um exemplo de como você deve montar a arquitetura de pastas e arquivos do seu projeto:

Usando Access

 

Baseada na estrutura do exemplo acima, vou sofisticar o caminho relativo montando uma função para acrescentar as subpastas.  No exemplo do caminho da imagem eu teria uma escrita assim:

me!MeuCampoImagem.Picture = fncOrigem(4) & "NomeImagem.gif"

Onde fncOrigem(4) retorna o caminho C:\MeuProjeto\Imagens.  Observou bem a função incluindo a subpasta imagens.

Vamos montar nosso primeiro esboço da função, que retorna o caminho relativo acrescentando as subpastas.

Public Function fncOrigem(pasta as byte)

Dim strlocal As String
 
  Select Case pasta
    Case 0: strlocal = "\backup\"
    Case 1: strlocal = "\"
    Case 2: strlocal = "\div"
    Case 3: strlocal = "\icones\"
    Case 4: strlocal = "\imagens\"
    Case 5: strlocal = "\sons\"
  End Select
fncOrigem = Application.CurrentProject.Path & strlocal

End Function

O Select Case lê o valor numérico informado do argumento pasta e então carrega a variável  strlocal com o nome da subpasta correspondente.  Essa variável strlocal é então concatenada com o currentproject.path.

fncOrigem(3)  me retornará C:\MeuProjeto\icones\

Não está prático ficar lembrando do número correspondente à pasta.  Felizmente temos um recurso à nossa  disposição muito interessante que é a de se poder criar uma lista suspensa para argumentos, através da instrução enum.  Veja como é simples:

Public Enum mPasta
   mBackup
   mBd
   mDiv
   mIcones
   mImagens
   mSons
End Enum
 

Os itens da enum assumem um número, conforme a posição na lista, começando por 0(zero).  Por exemplo, mIcones = 3

Poderíamos montar com uma numeração diferente.  Exemplo:

Public Enum mPasta
   mBackup = 5
   mBd = 6
   mDiv = 4
   mIcones = 2
   mImagens =3
   mSons = 1
End Enum

Para o argumento assumir esta lista, basta referenciar o enum mPasta a variável pasta

Public Function fncOrigem(pasta as mPasta)

Quando você então abre o colchete da função para digitar o argumento, veja o que acontece!

Usando Access

 

Show, não é? Não tem que decorar mais nada.  Mesmo assim se quiser entrar com o número correspondente também pode.

O item mbd da lista é o único que não se refere a uma subpasta e sim ao local do banco de dados, ou seja, retorna a pasta do projeto.  fncOrigem(mbd) retona C:\MeuProjeto\.   O que eu quero acrescentar ao projeto é uma comodidade da função, retornando o caminho do projeto e omitindo o argumento da função. Assim: fncOrigem() deverá  retornar também C:\MeuProjeto\

Para se omitir o argumento da função é necessário acrescentarmos a palavra chave Optional na frente do argumento.  exemplo:

Public Function fncOrigem(Optional pasta as mPasta)

Ao omitirmos o argumento, pasta assumirá o valor padrão zero , que é o primeiro item da lista de mPasta.  Só que o primeiro item da lista refere-se a subpasta Backup e não o local do banco de dados.  Então fncOrigem() retornará C:\Meuprojeto\Backup\ .    Para resolver a questão, basta informarmos o item que desejamos como padrão.  Assim:

Public Function fncOrigem(Optinal pasta as mPasta = mbd)

Observe bem a figura abaixo.  Quando se digita a função é fornecida uma dica de qual item é o padrão, caso você não entre com o argumento. 

Isso é muito comum aparecer nas funções do Access.  Por exemplo, você pode observar isso na função msgbox()

Usando Access

 

Como resultado temos:

Usando Access

 

Veja a função completa:

Option Compare Database
'-------------------------------------------------
'Cria uma lista para usar com o argumento pasta
'Cada item corresponde a número começando do zero
'-------------------------------------------------
Public Enum mPasta
  mBackup
  mbd
  mDiv
  mIcones
  mImagens
  mSons
End Enum

---------------------------------------------------------------------------

Public Function fncOrigem(Optional pasta As mPasta = mbd)
 
On Error Resume Next
Dim strLocal As String
 
Select Case pasta
  Case 0: strLocal = "\backup\"
  Case 1: strLocal = "\"
  Case 2: strLocal = "\div\"
  Case 3: strLocal = "\icones\"
  Case 4: strLocal = "\imagens\"
  Case 5: strLocal = "\sons\"
  Case Else: MsgBox "Pasta informada fora da lista...", vbInformation, "Aviso"
End Select
 
fncOrigem = Application.CurrentProject.Path & strLocal

End Function

Coloquei o projeto em um arquivo zip pra você baixar.  Independente do local que você escolher baixar, ele tem que carregar a figura no formulário e quando der o clique no botão, a caixa de mensagem tem que informar o valor 4.   Essa é a idéia: de você escolher o local qualquer e tudo continuar  funcionando.

Usando Access

 

Abra o módulo VBA do formulário e veja como foi aplicado a função apresentada aqui.

 

 


7 comentário(s)

alberto rufino   2/2/2010 15:32:31

gostei muito da dica amigo
pois estou precisando muito dela
albertorufino@hotmail.com

alberto rufino    15/2/2010 22:59:10

ai amigo gostei muinto do artigo.. so queria era sabe como cria uma pasta
digitando o nome no campo e cria direto um diretorio .. se vc pode mim da uma dica agradeço
e pq estou desenvolvento sisteama para digitalizar documento e tem q grava em cada pasta diferentes
alberto rufino (albertorufino@hotmail.com

Avelino Sampaio   16/2/2010 07:47:23

Alberto,

estude pelo help do Access o comando FileSystem do VBA

Para criar um diretório:

FileSystem.mkdir("c:\PastaDoSeuProjeto\NomeDaSuaNovaPasta")


Sucesso


Marcelo   13/5/2010 14:40:05

Grande Avelino, sempre colaborando com o aprendizado dos menos favorecidos. Eu estava mesmo precisando desse recurso, pois estou desenvolvendo um bd aqui e estava pegando as imagens pelo caminho absoluto. Aí pensei que se simplesmente colocasse "\Meu projeto\Imagens\imagem.bmp" fosse dar certo, mas não deu. Então joguei a questão no Google e ele me enviou à essa página. O CurrentProject.Path funcionou direitinho. Agora não preciso mais me preoucupar com o local aonde colocarão o sistema, pois esse sistem será ampacotado no developer e distribuído para algumas pessoas juntamente com o runtime.
Valeu mesmo pela dica.
Abração.

sergio   4/6/2010 09:52:09

Show de bola, pena que o 2000 e 2003 esteja tão esquecido e só o 2007 seja o rei. De qualquer forma os meus parabéns pelos códigos fantásticos e pelo ecelente trabalho que está à disposição de toda a comunidade.

Abraço

Avelino Sampaio   7/6/2010 08:28:34

Sergio,

Fico muito feliz por ter ajudado. Com o lançamento do Office 2010 a coisa piorou ainda mais para o Access 2003 e 2000.

Sucesso

Darlan Canez   30/8/2010 11:22:55

Caro Avelino, realmente a dica é muito boa, sou iniciante no acces e gostaria de sebar porque no seu exemplo, não consigo carregar JPEG, se puder me ajudar fico grato, pois quero usar estas imagens para vincular como fundo de formulário e está dando erro, uso o 2007.
Obrigado


Envie seu comentário: