quinta-feira, 16 de agosto de 2007

A classe OpenDialog: selecionando arquivos


A classe OpenDialog permite ao desenvolvedor utilizar a janela padrão do Windows para selecionar arquivos.
O exemplo a seguir demonstra como utilizar os métodos da classe OpenDialog:

Defina as classes utilizadas, na class-control:

class-control.
....Window is class "window"
....OpenDialog is class "opendlg"
....CharacterArray is class "chararry"
.



Defina o tipo de chamada na special-names:

special-names.
....call-convention 66 is WAPI.


Defina as seguintes variáveis na working-storage section:

working-storage section.
77 wsHandle pic 9(09) comp-5 value zeros.
77 umaJanela object reference value null.
77 umaOpenDialog object reference value null.
77 umFiltro object reference value null.
77 umaExtensao object reference value null.
77 wsArquivo pic x(255) value spaces.


Na procedure division, siga os seguintes passos:

MontarOpenDialog section.
....call wapi "GetActiveWindow" returning wsHandle
....invoke Window "fromHandleWithClass"
...........using wsHandle Window
...........returning umaJanela
....invoke OpenDialog "new" using umaJanela
...........returning umaOpenDialog


A API "GetActiveWindow" retorna o handle da janela que está ativa. O método "fromHandleWithClass" da classe Window, cria um objeto a partir de um handle informado. Daí em diante, vários métodos podem ser utilizados para manipular a aparência e o comportamento da janela de seleção de arquivos. Veja alguns deles:

Para mudar o título da janela:

invoke umaOpenDialog "setTitleZ" using z"Selecionar a imagem de fundo..."


Para criar filtros de arquivos:

invoke CharacterArray "withValue" using z"Arquivo JPG (*.jpg)"
.......returning umFiltro
invoke CharacterArray "withValue" using z"*.jpg"
.......returning umaExtensao
invoke umaOpenDialog "AddFilter" using umFiltro umaExtensao
invoke umFiltro "finalize" returning umFiltro
invoke umaExtensao "finalize" returning umaExtensao

invoke CharacterArray "withValue" using z"Arquivo BMP (*.bmp)"
.......returning umFiltro
invoke CharacterArray "withValue" using z"*.bmp"
.......returning umaExtensao
invoke umaOpenDialog "AddFilter" using umFiltro umaExtensao
invoke umFiltro "finalize" returning umFiltro
invoke umaExtensao "finalize" returning umaExtensao

invoke CharacterArray "withValue" using z"Arquivo GIF (*.gif)"
.......returning umFiltro
invoke CharacterArray "withValue" using z"*.gif"
.......returning umaExtensao
invoke umaOpenDialog "AddFilter" using umFiltro umaExtensao
invoke umFiltro "finalize" returning umFiltro
invoke umaExtensao "finalize" returning umaExtensao

Não está documentada de forma clara em nenhum dos manuais de ajuda do NetExpress que após criar filtros para uma janela de seleção de arquivos, um último filtro deve ser adicionado. Esse último filtro contém carateres nulos, finalizando assim a lista de filtros. Veja como adicionaro último filtro:

invoke CharacterArray "withValue" using x"0000"
.......returning umFiltro
invoke CharacterArray "withValue" using x"0000"
.......returning umaExtensao
invoke umaOpenDialog "AddFilter" using umFiltro umaExtensao
invoke umFiltro "finalize" returning umFiltro
invoke umaExtensao "finalize" returning umaExtensao


Quando esse último filtro não é adicionado, a janela de seleção de arquivos mostra caracteres estranhos no SelectionBox de tipos de arquivos, como mostra a imagem a seguir:



Para mostrar a janela de seleção de arquivos:

invoke umaOpenDialog "show"


Para pegar o nome completo do arquivo selecionado:

invoke umaOpenDialog "getFile" returning umNomeDeArquivo


Para pegar o nome base do arquivo selecionado (sem o caminho):

invoke umaOpenDialog "getFileTitle" returning umNomeDeArquivo


Se um arquivo é selecionado, um objeto contendo o nome do arquivo é retornado pelo método. Se o usuário sai da janela através do botão "Cancelar" ou pelo botao de "Fechar", o objeto retornado será setado com nulo:

if umNomeDeArquivo not = null
...move spaces to wsArquivo
...invoke umNomeDeArquivo "getValue" returning wsArquivo
end-if


Outros métodos podem ser utilizados com a classe OpenDialog. A relação completa você encontra no manual de ajuda MFNXCL30.CHM ou MFNXCL31.CHM na pasta de instalação do NetExpress.

Um comentário:

Anônimo disse...

Excelente Alex, parabéns. Usei no meu programa e ficou ótimo, só não conseguí setar o Diretorio Inicial e Posição da janela do OpenDialog, voce sabe como fazer isto ?