¡Hola a todos!
Estoy desarrollando un componente para automatización OLE de Word, basado en TWordApplication, en Delphi 7 Enterprise sin actualizaciones. Durante una prueba de funcionalidad descubrí un incómodo y a la vez interesante problema.
En mi aplicación tengo inactiva la opción de compilación
Complete boolean eval (como normalmente se utiliza) y el siguiente bloque de código.
Código Delphi
[-]
With Aplicacion.Selection Do
If Information [wdWithInTable] And (TablaLista <> Nil) And
TablaLista.InRange (Tables.Item (1).Range) Then
Si la expresión Variant
Information [wdWithInTable] devuelve False, el programa ya no debería evaluar las otras dos expresiones del If. No obstante, si lo hace. ¡Evalúa las tres expresiones!
![Confused](http://www.clubdelphi.com/foros/images/smilies/confused.gif)
Como es de esperarse, esto genera una excepción con mensaje «El elemento del conjunto solicitado no existe.» porque el programa intenta acceder a una tabla de Word (
Aplicacion.Selection.Tables.Item (1)) en un lugar donde no hay ninguna tabla (
Aplicacion.Selection.Information [wdWithInTable] devolvió False).
Information [wdWithInTable] realmente devuelve False, eso ya lo corroboré. Y, usando la ventana CPU —Ctrl+Alt+C— del depurador (ya quisieran otros fabricantes lograr un depurador tan magnífico), observé que el programa internamente llama a la función
_VarAnd de la unidad Variants. Es evidente que está haciendo una evaluación "And" de variantes, ignorando el estado de la directiva de compilación $BOOLEVAL, la cual está en
Off.
La primera solución que encontré fue moldear (hacer
type cast) como Boolean la expresión
Information [wdWithInTable], quedando el código anterior de esta forma:
Código Delphi
[-]
With Aplicacion.Selection Do
If Boolean (Information [wdWithInTable]) And (TablaLista <> Nil) And
TablaLista.InRange (Tables.Item (1).Range) Then
Les agradecería cualquier información que puedan aportar para el mejor manejo de este
defecto (¿?) de Delphi.
Atentamente,
Al González.
![Smilie](http://www.clubdelphi.com/foros/images/smilies/smile.gif)