Venho escrever este artigo, pois há pouco tempo precisei realizar isso de forma profissional e foi muito difícil achar informações completas na internet. Muitos sites explicavam pequenas partes do processo, porém não mostravam como realizar a associação de maneira funcional num aplicativo como um todo.
Felizmente depois de um tempinho de pesquisas e testes, consegui juntar todas as peças para realização de um projeto desse tipo. Dividirei o processo em etapas, e explicarei cada uma delas.
Etapa 1 – Diálogos de Salvar e Abrir com o CommonDialog
Esta parte não é efetivamente “difícil” de ser realizada, porém, como disse acima, me preocuparei em explicar todas as etapas, para que até os mais inexperientes consigam realizar o processo completo.
Primeiramente, quando pensamos em associar uma extensão ao nosso aplicativo, devemos nos preocupar com os comandos de Salvar e Abrir, que precisam exibir uma caixa de diálogo para que o usuário selecione onde deseja salvar seu arquivo, ou ainda qual arquivo deseja abrir, para depois podermos realizar nossas tarefas de salvar e abrir sabendo o nome do arquivo escolhido. Para isso, existe um componente do VB chamado CommonDialog.
1.1 – Adicionando o CommonDialog ao projeto
Clique com o botão direito do mouse sobre o ToolBox e selecione “Components…”. Na lista de componentes que será mostrada, escolha o “Microsoft Common Dialog Control” (no meu caso é o 6.0, pois utilizo o Service Pack 6 do VB). Certifique-se de que “ticou” o quadradinho, e confirme no “OK”.
Se deu tudo certo, aparecerá o ícone do componente dentro do ToolBox, como mostra a figura abaixo:
1.2 – Configurando o CommonDialog
Adicione um componente CommonDialog ao seu Form, verificando a sua propriedade “name” (o padrão será CommonDialog1).
Para facilitar, criei uma rotina que irá configurar o CommonDialog1 e retornará o nome do arquivo selecionado para nossas funções de salvar e abrir. Neste caso exemplo, iremos configurar uma extensão “.mex”.
Salvar (copie e cole no Form ou num Módulo):
Public Function Dlg_Salvar() As String
Dim Titulo As String
Dim Ext As String
Dim Ext_Descricao As String
'''''''''''''''''''''''''''''''''''''''''''''''
'''Configurando o CommonDialog (altere aqui)'''
'''''''''''''''''''''''''''''''''''''''''''''''
Titulo = "Salvar..." 'Titulo do CommonDialog
Ext = "mex" 'Extensão do seu arquivo
Ext_Descricao = "Arquivo de Minha Extensão" 'Descrição da sua extensão
''''''''''''''''''''''''''''''''''''''''''''''''''''
'''Rotinas do Common Dialog (não precisa alterar)'''
''''''''''''''''''''''''''''''''''''''''''''''''''''
'indica que, se o usuário cancelar, retornará uma String vazia:
CommonDialog1.CancelError = False
'limpa o antigo FileName para evitar problemas:
CommonDialog1.FileName = ""
'mostra o titulo escolhido acima:
CommonDialog1.DialogTitle = Titulo
'compõe a String de filtro com a extensão escolhida acima:
CommonDialog1.Filter = Ext_Descricao & " (*." & Ext & ") | *." & Ext
'mostra o CommonDialog de Salvar:
CommonDialog1.ShowSave
Dim Arquivo As String
'recebe o caminho do arquivo escolhido:
Arquivo = CommonDialog1.FileName
If Len(Arquivo) > 0 Then 'se usuário escolheu um arquivo válido...
'as quatro linhas abaixo servem para limpar o arquivo, ou seja, se
'o arquivo selecionado já existir, ele será sobrescrito:
Dim AuxArq As Integer
AuxArq = FreeFile
Open Arquivo For Output As #AuxArq
Close #AuxArq
Dlg_Salvar = Arquivo 'RETORNA O CAMINHO DO ARQUIVO
Else 'senão (se o usuário clicou em CANCEL)...
Dlg_Salvar = "" 'RETORNA STRING VAZIA
End If
End Function
Abrir (copie e cole no Form ou num Módulo):
Public Function Dlg_Abrir() As String
Dim Titulo As String
Dim Ext As String
Dim Ext_Descricao As String
'''''''''''''''''''''''''''''''''''''''''''''''
'''Configurando o CommonDialog (altere aqui)'''
'''''''''''''''''''''''''''''''''''''''''''''''
Titulo = "Abrir..." 'Titulo do CommonDialog
Ext = "mex" 'Extensão do seu arquivo
Ext_Descricao = "Arquivo de Minha Extensão" 'Descrição da sua extensão
''''''''''''''''''''''''''''''''''''''''''''''''''''
'''Rotinas do Common Dialog (não precisa alterar)'''
''''''''''''''''''''''''''''''''''''''''''''''''''''
'indica que, se o usuário cancelar, retornará uma String vazia:
CommonDialog1.CancelError = False
'limpa o antigo FileName para evitar problemas:
CommonDialog1.FileName = ""
'mostra o titulo escolhido acima:
CommonDialog1.DialogTitle = Titulo
'compõe a String de filtro com a extensão escolhida acima:
CommonDialog1.Filter = Ext_Descricao & " (*." & Ext & ") | *." & Ext
'mostra o CommonDialog de Abrir:
CommonDialog1.ShowOpen
Dim Arquivo As String
'recebe o caminho do arquivo escolhido:
Arquivo = CommonDialog1.FileName
If Len(Arquivo) > 0 Then 'se usuário escolheu um arquivo válido...
Dlg_Abrir = Arquivo 'RETORNA O CAMINHO DO ARQUIVO
Else 'senão (se o usuário clicou em CANCEL)...
Dlg_Abrir = "" 'RETORNA STRING VAZIA
End If
End Function
Exemplo de uso das função acima:
'''Salvar'''
Dim Arq_Salvar As String
Arq_Salvar = Dlg_Salvar 'a função retorna uma String
If Arq_Salvar = "" Then
MsgBox "Nenhum arquivo escolhido" 'Cancelou
Else
MsgBox Arq_Salvar 'OK
'Pronto! aqui você já pode manipular o arquivo escolhido com
'as rotinas de Salvar do seu aplicativo, onde o path estará
'guardado na variável Arq_Salvar
End If
'''Abrir'''
Dim Arq_Abrir As String
Arq_Abrir = Dlg_Abrir 'a função retorna uma String
If Arq_Abrir = "" Then
MsgBox "Nenhum arquivo escolhido" 'Cancelou
Else
MsgBox Arq_Abrir 'OK
'Pronto! aqui você já pode manipular o arquivo escolhido com
'as rotinas de Abrir do seu aplicativo, onde o path estará
'guardado na variável Arq_Abrir
End If
Etapa 2 – Abrir Arquivos com Duplo-Clique pelo Explorer
Na etapa acima vimos como abrir nossa extensão de dentro do nosso programa, porém ficaria muito mais funcional se o usuário de nosso programa pudesse abrir nossa extensão com um simples duplo-clique através do Windows Explorer. Aqui começa efetivamente a associação da extensão.
Vamos fazer uma pequena reflexão:
– Para que meu aplicativo abra um arquivo de minha extensão, eu preciso apenas saber o endereço (path) do arquivo. Sabendo isso, basta chamar meus comandos de abrir.
– Se meu aplicativo já estiver aberto, utilizo o CommonDialog e recebo o endereço do arquivo.
Agora você deve estar se perguntando:
– E se meu aplicativo não estiver aberto. Como receberei o endereço do arquivo através de um duplo-clique sobre ele no Explorer ?!
Resposta:
– Associação da extensão, utilizada juntamente à função “Command” do VB6.
2.1 – Associando a Extensão Manualmente
Antes de pensarmos em abrir nossos arquivos com duplo-clique, precisamos associar a extensão ao nosso aplicativo dentro do Windows, para que o Explorer a reconheça. Podemos fazer isso manualmente ou através de um programa de instalação do nosso aplicativo.
Para fazer manualmente, iremos no menu “Iniciar > Configurações > Painel de Controle”, então entraremos no ícone “Opções de Pasta”.
Na aba “Tipos de Arquivo”, clique no botão “Novo”. Em seguida, digite a extensão de seu tipo de arquivo e confirme no “OK”:
Em seguida, sua nova extensão aparecerá na lista. Selecione-a e clique no botão “Avançado”. Na nova janela que abriu, clique no botão “Alterar ícone…” e escolha um ícone de sua preferência (ou clique no botão “Procurar…” e localize seu ícone personalizado):
Agora vem a parte mais importante, a associação propriamente dita. Na área de Ações, clique no botão “Novo…”. Na janela de Nova Ação, digite da seguinte forma:
- Ação – nome que aparecerá quando clicar com o botão direito do mouse sobre o arquivo (neste caso: Abrir)
- Aplicativo usado para executar a ação – endereço do nosso executável, seguido de espaço e %1 (neste caso: C:\Teste %1). A flag %1 diz ao Windows para enviar como argumento ao nosso programa o path do arquivo clicado no Explorer.
2.2 – Associando a Extensão com o “Inno Setup”
Logicamente, a associação manual mostrada acima serve apenas para testes na fase de desenvolvimento do programa. Quando formos distribuí-lo, como iremos associar a extensão no PC do nosso cliente? O jeito usual de fazer isso é utilizando o próprio setup de instalação que criaremos para nosso aplicativo. Existem vários programas para criação de setups, porém eu recomendo o “Inno Setup” (http://www.jrsoftware.org/isinfo.php), que é gratuito, fácil de manipular e contém vários recursos e add-ins, muito utilizado atualmente.
Como este é um artigo de VB6, omitirei muitas explicações sobre o Inno Setup (basta ver sua documentação, é bem simples de utilizar), e digitarei apenas seu código de script para gerar associações de extensão. Basta copiar e colar para dentro do seu arquivo de setup (.iss), fazendo as adaptações necessárias:
[Registry]
Root: HKCR; SubKey: .mex; ValueType: string; ValueData: Arquivo MEX; Flags: uninsdeletekey
Root: HKCR; SubKey: Arquivo MEX; ValueType: string; ValueData: Projeto Teste; Flags: uninsdeletekey
Root: HKCR; SubKey: Arquivo MEX \Shell\Open\Command; ValueType: string; ValueData: {app}\Teste.exe %1; Flags: uninsdeletevalue
Root: HKCR; Subkey: Arquivo MEX \DefaultIcon; ValueType: string; ValueData: {app}\MeuIcone.ico,0; Flags: uninsdeletevalue
De maneira análoga, substitua:
- .mex – sua extensão
- Arquivo MEX – palavra “Arquivo” seguida de sua extensão
- Projeto Teste – descrição da sua extensão
- Teste.exe – seu executável (note a presença do %1 como vemos acima)
- MeuIcone.ico,0 – o arquivo do ícone da sua extensão seguido de vírgula e o índice do ícone dentro do arquivo .ico (um arquivo de ícone pode conter vários índices).
2.3 – Utilizando o método Command
Agora que já sabemos como associar a extensão no sistema operacional, veremos como receber este comando dentro de nosso software.
Graças à flag %1 colocada nas configurações da associação, fazemos isso com apenas uma linha de comando, utilizando o método Command.
Basta que, no evento Form_Load, recuperemos o argumento passado pelo Windows, que será o endereço do arquivo clicado:
Private Sub Form_Load()
Dim Arq_Abrir As String
Arq_Abrir = Command
'Pronto, nossa variável Arq_Abrir já contém o endereço do arquivo 'clicado. Agora basta chamar nossas rotinas de abrir.
End Sub
Assim finalizo este artigo. No próximo artigo mostrarei como responder a um arraste de arquivo vindo do Explorer para a sua aplicação (OLEDragDrop), que poderíamos implementar para ampliar os recursos de acessibilidade de nosso programa, onde o usuário poderá abrir sua extensão arrastando o arquivo com o mouse para dentro do seu aplicativo. Até lá!