Dicas do OsmarJr

Referenciando Objetos


Referenciando objetos em Access (as notações ! e . e (" ")

 

Que operador é esse (!)?

Quando comecei a mexer com o Access (usando a versão 2), eu via expressões como Me.Texto0. Elas pareciam misteriosas e, confesso, não quis “perder tempo” tentando descobrir o que o ! significava realmente. Usava a notação mas descobrir, por tentativa e erro, que Me.Texto0 também funcionava direitinho. Na verdade, descobri que havia situações em que precisava usar o operador ! juntamente com o operador ., como em Forms!SubForm.Form!Texto0. Não que eu tenha realmente procurado, mas nunca encontrei uma explicação adequada do que era o operador ! (quanto mais por que ele podia ser substituído, as vezes, pelo ponto) até que li o excelente Access 2000 Desktop Developer's Handbook.

A Resposta
O ! separa um objeto da coleção de objetos que o contém. Por exemplo, na expressão Forms!FormPrincipal, o ! separa a coleção Forms do objeto FormPrincipal contido naquela coleção. É como dizer “Quero me referir ao objeto FormPrincipal na coleção de formulários Forms”. Além disso, o ! é usado apenas antes de objetos definidos pelo usuário (como formulários e controles criados por nós mesmos).

Podemos ver o (!) como uma outra forma de expressar a notação (“ “). Assim sendo, Forms!FormPrincipal é equivalente a Forms(“FormPrincipal”). Escrito na notação (“ “), o relacionamento entre o objeto e sua coleção faz mais sentido. Afinal, se você já usou o VBA do Excel, duvido que já tenha visto a expressão Workbooks!MeuWorkbook (que também funciona). A referência a um workbook específico é sempre feita por Workbooks(“MeuWorkbook”).


Tá legal. Então para que serve o operador (.)?

O . pode ser usado quase que como o !. mas onde o ! separa o nome de uma coleção de um membro de tal coleção, o . pode ser usado, também, para separar um nome de coleção de uma propriedade ou método contido na coleção. Podemos usar Forms!FormPrincipal ou Forms.FormPrincipal sem problemas. Entretanto, enquanto podemos usar CaixaDeTexto.AfterUpdate, não podemos ter CaixaDeTexto!AfterUpdate.


Qual formato devo usar?

Digamos que você tenha um formulário chamado FormPrincipal e que deseja referenciar um controle deste formulário chamado CaixaDeTexto. Digamos, também, que você está fazendo esta referência a partir de outro formulário (o Me não pode ser usado, certo?). Temos diversas formas para fazer isso, incluindo:

   Forms!FormPrincipal!CaixaDeTexto
   Forms!FormPrincipal.CaixaDeTexto
   Forms.FormPrincipal.CaixaDeTexto
   Forms("FormPrincipal")("CaixaDeTexto")
   Forms("FormPrincipal").CaixaDeTexto
   Forms("FormPrincipal").Controls("CaixaDeTexto")


Todas as expressões acima são válidas e funcionam. Não importando qual a notação usada, qualquer desenvolvedor que leia seu código deve ser capaz de saber o que está acontecendo. Então, qual usar? Particularmente, prefiro uma das três últimas por algumas razões:

De acordo com o Access 2000 Developer’s Handbook, a notação ! é traduzida, nos bastidores, para a notação (“ “). A única coisa que a notação ! economiza é um pouco de digitação, mas essa economia pode se virar contra você com perda de desempenho cada vez que o código é executado. Eu não gosto nem um pouco de perda de desempenho.

Em segundo lugar, ao digitar código em um módulo, a utilização da notação ! não permite a utilização das vantagens do Intellisense (aquelas dicas...) do Editor do Visual Basic. Os três últimos exemplos, que não usam a notação !, podem usar o Intellisense até certo ponto. O Intellisense economiza um bocado de digitação e funciona, também, como um verificador de erros quando entramos com uma expressão como Me.CaixadeTexto.AfterUpdate. A terceira expressão é, provavelmente, a mas confusa para ser usada na digitação em um módulo já que usa o Intellisense mas não para dar vantagem. Teste e veja o que acontece.

Por último, suponhamos que estamos trabalhando com o FormPrincipal e temos nele um monte de controles com nomes semelhantes. Gostaríamos de fazer com que o valor contido em txt1, txt2,..., txt6 fique como “Não informado”. Como fazer isso? Como é um número pequeno de campos, poderíamos fazer:

   Forms("FormPrincipal").txt1 = "Não informado"
   Forms("FormPrincipal").txt2 = "Não informado"
   ...
   Forms("FormPrincipal").txt6 = "Não informado"



Aí notamos que estamos fazendo algo similar nas seis instâncias e que isso pode ser feito usando um laço:

Dim intX As Integer

   For intX = 1 To 6
        Forms("frmMainForm")("txt" & intX) = "Não informado"
   Next intX


Tempos atrás ajudei um colega que tinha quatro situações dessas, cada uma com 48 campos... Este tipo de laço não pode ser utilizado numa notação !.


Existe alguma razão para usar a notação !?

Existem dois casos relacionados em que a notação (“ “) não funciona e precisamos usar a notação !: quando usamos parâmetros em uma consulta, como em Forms!FormPrincipal!CaixaDeTexto e quando nos referimos a objetos em declarações SQL. Os dois casos são, na verdade um só, já que todas as consultas são traduzidas em declarações SQL antes de serem executadas. Note-se que, como dito acima, Forms.FormPrincipal.CaixaDeTexto também funciona e é preferível pois é mais fácil tecla . que !.


OBS: O melhor artigo que encontrei na Microsoft sobre este tópico foi Syntax for Using Object Variables in Expressions. O tópico quase não é mencionado na ajuda online do Access.
Home

Contato | Copyright©Osmar José Correia Júnior | 24-Nov-2005 18:23