Al González
18-08-2005, 00:08:44
¡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.
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: 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:
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. :)
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.
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: 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:
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. :)