Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Providers
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 18-08-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Variante comparado con evaluación completa

¡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! 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.

Última edición por Al González fecha: 18-08-2005 a las 00:12:51.
Responder Con Cita
  #2  
Antiguo 18-08-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Esto puede interesarte:

Cita:
> 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
Responder Con Cita
  #3  
Antiguo 18-08-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡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.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 13:34:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi