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:

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:

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!

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()

Como resultado temos:

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.

Abra o módulo VBA do formulário e veja como foi aplicado a função apresentada aqui.
Os dez artigos mais visitados
MontaRibbons v3.1 - Assistente completo para criar ribbons no Access
Utilizando Classe no Access - Introdução
Vídeo - Controle personalizado de Acesso de Usuários
Vídeo - Criando Ribbons parte 1 - Conhecendo a estrutura Xml
Vídeo - Segurança máxima, usando o OPEN
DVD - Coletânea de artigos, vídeos e exemplos do site
Vídeo - Manutenção e Sistema de Backup com Barra de Progresso
Vinculando tabelas com barra de progresso ( front-end x back-end )
Vídeo - Criando Ribbons parte 4 - Imagens externas em pasta local
Gerar relatórios em pdf e enviar por email
|
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 |