Associando extensão de arquivo à uma aplicação Delphi

Escrito em 06 de Agosto de 2007 em Delphi, Programação por Jeferson Oliveira

Introdução

É comum uma aplicação precisar abrir arquivos externos, sejam eles arquivos proprietários ou arquivos de tipo conhecido, e exibir seu conteúdo para o usuário. Para isso, normalmente, haverá na aplicação um formulário para seleção e abertura do arquivo desejado. Mas se o usuário sempre quiser, ou precisar, abrir esse tipo de arquivo com sua aplicação, seria mais prático que ao abrí-lo pelo Windows Explorer sua aplicação seja acionada imediatamente para exibição do conteúdo. Para que a abertura ocorra automaticamente, é necessário que a extensão do arquivo seja associada à sua aplicação.

Nesse artigo será demonstrado como preparar uma aplicação para ser associada com tipos de arquivos, como utilizar parâmetros de execução em uma aplicação, como associar uma extensão de arquivo à uma aplicação manualmente, e como realizar essa associação automaticamente pela própria aplicação ou utilizando um instalador.

A extensão de exemplo

Para exemplificar a associação de arquivos à uma aplicação Delphi, vamos criar um projeto no Delphi 7 capaz de exibir o conteúdo de arquivos de visualização do gerador de relatórios QuickReport (.QRP), mas os passos indicados aqui, à exceção é claro do método para abertura dos arquivos .QRP, poderão ser utilizados para associação de arquivos de qualquer extensão e em qualquer versão do Delphi.

Para criar um arquivo .QRP basta visualizar um relatório gerado com o QuickReport e salvar o conteúdo da visualização. Por não ser o objetivo desse artigo, detalhes sobre a utilização do gerador de relatórios QuickReport não serão abordados aqui.

Criando o projeto de exemplo

No Delphi 7 crie uma nova aplicação(File/New/Application), adicione ao formulário um TButton e um TOpenDialog. Renomeie o TButton para btnVisualizar, o TOpenDialog para odArquivoVisualizar e o formulário para frmPrincipal, e salve o projeto como AbrirQRP.dpr.

Para que o OpenDialog só exiba os arquivos da extensão que interessa à aplicação, defina a propriedade Filter com o valor Arquivos QRP|*.QRP.

Vamos agora definir um método para visualização de arquivos QRP e invocá-lo no evento OnClick do botão, ficando o código como exemplificado abaixo:

implementation

uses
  QuickRpt, QRPrntr, Registry, ShlObj;

{$R *.dfm}

procedure VisualizarQRP(const NomeArquivoQRP: string);
var
  QuickRep: TQuickRep;
begin
  QuickRep := TQuickRep.Create(nil);
  QuickRep.QRPrinter := TQRPrinter.Create(QuickRep);
  try
    QuickRep.QRPrinter.Load(NomeArquivoQRP);
    QuickRep.QRPrinter.Preview;
  finally
    QuickRep.Free;
  end;
end;

procedure TfrmPrincipal.btnVisualizarClick(Sender: TObject);
begin
  if odArquivoVisualizar.Execute then
    VisualizarQRP(odArquivoVisualizar.FileName);
end;

Nesse ponto nossa aplicação já está apta à exibir o conteúdo de arquivos .QRP ao clicar no botão btnVisualizar.

Utilizando parâmetros de execução

Quando um arquivo associado à uma aplicação é aberto pelo
Windows, o sistema operacional aciona a aplicação associada passando como parâmetro o nome do arquivo a ser aberto. Para que a aplicação consiga responder adequadamente à essa solicitação, ela deve estar preparada para ler e interpretar os parâmetros enviados pelo sistema operacional. No Delphi, para identificar se algum parâmetro foi passado para a aplicação é disponibilizada a variável global ParamCount que indica a quantidade de parâmetros que foram passados; e para acessar o valor de um parâmetro é disponibilizada a função ParamStr, que recebe como argumento o índice do parâmetro a ser lido, e retorna seu valor.

  • Nota: ParamStr(0) retorna o caminho do executável corrente, portanto, o índice do primeiro parâmetro é 1, do segundo 2, e assim sucessivamente.

Preparando a aplicação para a associação de extensões

No evento OnShow do formulário, adicione o código abaixo que, caso algum parâmetro tenha sido passado para a aplicação, acionará o método de abertura de arquivos .QRP informando o valor do primeiro parâmetro como o nome do arquivo a ser aberto:

procedure TfrmPrincipal.FormShow(Sender: TObject);
begin
  if ParamCount > 0 then
    VisualizarQRP(ParamStr(1));
end;

Para testar o comportamento da aplicação quando algum parâmetro for informado, acesse o menu Run/Parameters e informe no campo Parameters um valor para o parâmetro.

RunParameters

Outra forma de passar parâmetros para a aplicação é executando-a por linha de comando:

D:\\Prj\\AbrirQRP>AbrirQRP.exe C:\\Temp\\Arquivo.QRP

Associando manualmente uma extensão à aplicação

Há várias maneiras de associar manualmente um arquivo à uma aplicação. É possível criar uma chave para a extensão no registro do Windows, ou criar uma nova entrada em Painel de controle/Opções de Pasta/Tipos de arquivo, mas a forma mais simples de criar essa associação é clicar duas vezes sobre o arquivo pelo Windows Explorer, e no diálogo para seleção da aplicação a ser utilizada para a abertura do arquivo clicar no botão Procurar, e selecionar a aplicação desejada. Certifique-se que a opção “Sempre usar o programa selecionado para abrir este tipoe de arquivo” esteja selecionada.

AbrirCom

Registrando o tipo de arquivo pelo instalador da aplicação

Uma maneira de associar uma extensão é criar as chaves necessárias no registro do Windows durante a instalação da aplicação. Abaixo um exemplo de como realizar essa tarefa utilizando o gerador de instaladores InnoSetp, ferramenta muito utilizada por desenvolvedores de software em todo o planeta:

[Registry]
Root: HKCR; Subkey: .QRP; ValueType: string; ValueData: ArquivoQRP; Flags: uninsdeletekey
Root: HKCR; Subkey: ArquivoQRP; ValueType: string; ValueData: Arquivo de visualização de relatório; Flags: uninsdeletekey
Root: HKCR; Subkey: ArquivoQRP\\shell\\open; ValueType: string; ValueData: &Abrir com AbrirQRP; Flags: uninsdeletevalue
Root: HKCR; Subkey: ArquivoQRP\\shell\\open\\command; ValueType: string; ValueData: {app}\\AbrirQRP.exe %1; Flags: uninsdeletevalue
Root: HKCR; Subkey: ArquivoQRP\\DefaultIcon; ValueType: none; Flags: uninsdeletevalue

Automatizando a tarefa com o Delphi

Se nossa aplicação deve ser associada a um tipo de arquivo, pode ser interessante que ela consiga ter independência para registrar uma extensão. O código abaixo define os métodos para registro automático de um tipo de arquivo: 

procedure RegistrarExtensao(const Extensao, TipoArquivo, NomeAplicacao, Executavel: string);
var
  ChaveArquivo: string;
  Registro: TRegistry;

  procedure EditarChave(const Chave, Valor: string);
  begin
    Registro.OpenKey(Chave, True);
    Registro.WriteString('', Valor);
    Registro.CloseKey;
  end;

begin
  Registro := TRegistry.Create;
  try
    Registro.RootKey := HKEY_CLASSES_ROOT;
    Registro.LazyWrite := False;
    ChaveArquivo := 'Arquivo' + Extensao;

    //Registra a extensão
    EditarChave('.' + Extensao, ChaveArquivo);

    //Define a descrição para o tipo de arquivo
    EditarChave(Format('%s', [ChaveArquivo]), TipoArquivo);

    //Adiciona uma entrada no menu de contexto
    EditarChave(Format('%s\\shell\\open', [ChaveArquivo]), Format('&Abrir com %s', [NomeAplicacao]));

    //Associa a extensão à aplicação
    EditarChave(Format('%s\\shell\\open\\command', [ChaveArquivo]), Format('"%s" "%s"', [Executavel, '%1']));

    //Define o ícone associado ao tipo de arquivo
    EditarChave(Format('%s\\DefaultIcon', [ChaveArquivo]), Format('%s, 0', [Executavel]));
  finally
    Registro.Free;
  end;
  //Notifica o SO da alteração na associação do tipo de arquivo
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);
end;

procedure RegistrarExtensaoQRP;
begin
  RegistrarExtensao('QRP', 'Arquivo de visualização de relatório', 'AbrirQRP', ParamStr(0));
end;

procedure TfrmPrincipal.FormCreate(Sender: TObject);
begin
  RegistrarExtensaoQRP;
end;
  • Nota: Como pôde ser observado o método RegistrarExtensaoQRP foi acionado no evento OnCreate do formulário, garantindo a cada execução que o tipo de arquivo esteja associado à aplicação, o que nem sempre é um comportamento desejado, pois poderá sobrepor alterações realizadas pelo usuário diretamente nas configurações do sistema operacional.

Considerações finais

Espero com esse artigo ter contribuído de alguma forma para a melhor compreensão do processo de associação de extensões de arquivos à aplicações, e que esse conhecimento possa ser útil para a melhoria do seu processo de desenvolvimento.

Comentários, críticas e sugestões serão muito bem-vindos para que os próximos artigos possam ser aprimorados.

Se você é novo por aqui, não deixe de assinar o feed RSS ou notificações por email. Não perca novos artigos!