PDA

Ver la Versión Completa : Variante comparado con evaluación completa


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. :)

roman
18-08-2005, 01:44:14
Esto puede interesarte:


> Apparently, Boolean short-circuit evaluation is not used when either or
> both of the operands is a Variant.

Correct. I suspect Borland would say this behavior is "as designed." I can
see arguments that say if the left-hand operand is a Boolean whose value is
False, the right-hand operand should not be evaluated even if its type is
Variant. On the other hand, operations on Variants are converted into
function calls that forcibly cast the two operands into Variants of
compatible types, and then perform the operation. This means the Boolean
value is converted to a Variant whose type is varBoolean. Both operands
must be evaluated.

The former preserves Boolean short-circuit logic, and is the least
surprising result for someone who uses Boolean short-circuit a lot and
Variants a little.

The latter preserves uniform Variant logic, and is the least surprising
result for someone who regularly uses Variants and intuitively understands
the automatic casting that takes place.

I see no way to preserve both points of view. Borland chose the latter. I
wouldn't expect them to change any time soon (or ever), but you are of
course, free to submit a bug report.
--
Ray Lischner (http://www.tempest-sw.com)


// Saludos

Al González
18-08-2005, 04:19:32
¡Gracias Román!

Si que me interesa.

Pues yo fui uno más de los «sorprendidos». Ya me temía que se tratase de una cuestión de enfoque, como lo da a entender Ray Lischner.

Entonces, mientras la política de Borland no cambie, aconsejo emplear moldes Boolean en casos especiales como el que planteé.

Un abrazo lógico.

Al González. :)