.NET – Transforme strings em Resources com o Resource Refactoring Tool

Não é de hoje que deixar valores de domínio em strings dentro do código é uma má prática. Qualquer mudança nestas, por exemplo, uma mensagem, obrigará a recompilação do aplicativo.

A ferramenta Eclipse tem um recurso interessante chamado Externalize Strings. Nele, a ferramenta analisa todo o código fonte e coleta todas as strings nele e as coloca em um arquivo de configuração, substituindo-as no código fonte por tokens que serão aplicados em tempo de compilação.

Pois bem. Tive essa necessidade no Visual Studio 2005/2008 recentemente e procurei algo que fizesse a mesma proeza da ferramenta da IBM. Entre as opções, além das pagas, há uma bem interessante e free no codeplex que é a Resource Refactoring Tool. Ele faz um trabalho parecido com o Externalize Strings do Eclipse, porém, colocas as strings em um arquivos do tipo Resources (resx) e faz a substituição da string pelo token respectivo.

Após instalado, a opção é adicionada ao menu Refactor do Visual Studio conforme a figura abaixo:

RefactoringTool-Menu

O arquivo de Resource pode ser selecionado e o Preview do código após a alteração pode ser visto, da mesma forma que as ferramentas do Refactor trabalham:

A janela Extrat to Resoruce
A janela Extrat to Resoruce
Preview Dialog padrão do Refactor
Preview Dialog padrão do Refactor

O Resource Refactoring Tool faz um bom trabalho, apesar de não ser tão completo como o Externalize Strings do Eclipse, já que para “externalizar” as strings de um arquivo de código, é preciso clicar em cada uma e executar a ação de Extract to Resource, enquanto o concorrente é capaz de analisar todo o arquivo de código fonte. Provavelmente está será uma funcionalidade futura da ferramenta.

Mas por ser free, faz um belo trabalho. O link oficial da ferramenta é:

http://www.codeplex.com/ResourceRefactoring

Como é mencionado na página, os desenvolvedores estão em busca de contribuidores para melhoria de ferramenta.

Bom proveito!

VBA – Ocultando Funções e Macros para o Usuário

Quanto construímos funções e macros personalizadas em nossos programas feitos no VBA em Excel e Word, precisamos expô-las para que sejam acessadas por outros módulos ou mesmo Forms. Para isso, declaramo-as como Public ou simplesmente ocultamos o modificador de acesso que é Public por padrão.

Um inconveniente do VBA é que nossas Functions e Subs ficam disponíveis para o usuário quando este abre a janela de execução de macros (Alt+F8). Isso pode gerar uma série de situações inesperadas, além de erros.

Para que as funções desenvolvidas como Public no VBA não apareçam na caixa de diálogo de execução de macros, basta que na janela de código, seja um Módulo ou UserForm seja colocada a seguinte diretiva no cabeçalho:

Option Private Module

Experimente agora abrir a caixa de diálogo de execução de Macros ou no Excel, acessar a caixa de diálogo Inserir Função selecionar a  opção “Definida pelo usuário” e veja que as Functions e Subs dentro do módulo com a declaração acima.

Note também que a declaração só oculta o código VBA neste escopo. As Functions e Subs continuarão disponíveis para todo o aplicativo VBA, não afetando o aplicativo.

Bom proveito!

Referências:

http://www.allexperts.com/

Tomás

VBA – Agendando a execução de macros com a função OnTime

Introdução

Uma necessidade muito comum em aplicativos é utilizar critérios de tempo para execução de algumas rotinas. Esta é uma tarefa trivial em várias linguagens, mas poucos pensam em utilizá-la no VBA por achar muito complexo, tendo que envolver chamadas de API e outros recursos mais avançados da linguagem

Porém, o VBA do Microsoft Excel disponibiliza um método que facilita esse tipo de trabalho, o método OnTime().

O que é

O método OnTime programa um procedimento para ser executado em um momento especificado no futuro (seja em uma determinada hora do dia ou após uma quantidade específica de tempo decorrido).

A estrutura de chamada à função OnTime se faz da seguinte forma:

Application.OnTime([EarliestTime], [Procedure], [LatestTime], [Schedule])

Argumentos da função:

EarliestTime

Variant necessário. Especifica quando você deseja que esse procedimento seja executado.

Procedure

String necessário. O nome do procedimento a ser executado.

LatestTime

Variant opcional. Especifica até quando o procedimento pode ser executado. Por exemplo, se LatestTime estiver definido como EarliestTime + 30 e o Microsoft Excel não estiver em modo Pronto, Copiar, Recortar ou Localizar em EarliestTime devido a um outro procedimento estar sendo executado, o Microsoft Excel esperará 30 segundos para que o primeiro procedimento termine. Se o Microsoft Excel não estiver em modo Pronto dentro de 30 segundos, o procedimento não será executado. Se esse argumento for omitido, o Microsoft Excel esperará até que o procedimento possa ser executado.

Schedule

Variant opcional. True para programar um novo procedimento OnTime. False para limpar um procedimento definido anteriormente. O valor padrão é True.

Exemplo

Para informar ao VBA um valor de data válido para execução do método OnTime, usa-se a propriedade Now do VBA juntamente com a função TimeValue( . Somando as duas, é possível programar o procedimento para ser executado quando uma quantidade de tempo específica (contando a partir de agora) tiver decorrido.

Caso seja necessário informar uma hora específica, por exemplo, 3 da tarde (ou 15:00), usa-se TimeValue(time) onde time é um valor de hora informado através de uma String.

Veja os exemplos de código abaixo:

Public Sub ExecutaOnTime()
MsgBox "Opa! Executou."
End Sub
Public Sub TesteOnTime()
Call Application.OnTime(Now +
TimeValue("00:00:10"), "ExecutaOnTime")
End Sub

Execute a função TesteOnTime, deixando o cursor do mouse sobre ele (linha 5 a 6) e clicando em F5. Se tudo der certo, em 10 segundos você deverá ver esta mensagem:

Pronto! Conforme configuramos o OnTime para executar 10 segundos após a hora atual (linha 6) pois, Now retorna a data e hora atual e TimeValue(“00:00:10”) representa para o VBA 10 segundos, após executar a função TesteOnTime, ela programa a função ExecutaOnTime (linha 1) para ser executada neste tempo.

Para efeitos de teste, configure outros valores de tempo, mas tome o cuidado que sejam pequenos pois, se configurar para executar daqui a 24 horas (“24:00:00”), vai ter que esperar um bom tempo.

Para fazer outro teste interessante do OnTime, mude o código para ficar desta forma:

Public Sub ExecutaOnTime()
MsgBox "Opa!
Executou."
End Sub
Public Sub TesteOnTime()
Call Application.OnTime(TimeValue("13:00:00"),
"ExecutaOnTime")
End Sub

Da forma que está, o código irá configurar a função ExecutaOnTime (linha 1) para ser executada às na próxima 13:00 do computador em que está sendo executada. Como este é apenas um exemplo, configure uma hora que estiver mais próxima para não esperar muito.

É possível também cancelar a execução de uma macro agendada com o OnTime. O exemplo de código abaixo cancela a definição de OnTime do exemplo anterior, ou seja, caso a execução da função ExecutaOnTime estiver agendada, executar a função CancelaOnTime fará com que esta programação seja cancelada. isso é feito passando o valor False para o parâmetro Schedule (linha 10):

Public Sub</span> ExecutaOnTime()
MsgBox "Opa! Executou."
End Sub
Public Sub TesteOnTime()
Call Application.OnTime(TimeValue("13:00:00"),
"ExecutaOnTime")
End Sub
Public Sub</span> CancelaOnTime()
Call Application.OnTime(EarliestTime:=TimeValue("13:00:00"),
Procedure:="ExecutaOnTime", Schedule:=False)
End Sub

Conclusão

Com este recurso em mãos, é possível atender a algumas necessidades que no contexto do Excel pareciam inviáveis. Um exemplo típico é uma tela de apresentação ou SplashScreen como é conhecida que apresenta o programa e fecha em alguns segundos. Este é um bom teste para experimentar o uso do OnTime. Fica aí um desafio.