21 de febrero de 2007

Mejoras importantes para los ejemplos que emplean degradados

Artículo original: IMPORTANT FIX FOR SAMPLES USING GRADIENTS
http://weblogs.foxite.com/vfpimaging/archive/2007/01/24/3178.aspx
Autor: Cesar Ch.
Traducido por: Ana María Bisbé York


Desafortunadamente, le ha ocurrido un error extraño, a alguna gente, mientras utilizaban algunos ejemplos para la creación de degradados que yo había colocado en mi blog.

Algunos reportaron que el código original creaba una imagen negra en lugar de un degradado. En otros casos, ocurría el error "No puede cargar 32-bit DLL GDIPLUS"

Esto ocurría porque VFP estaba utilizando las diferentes versiones de GDIPLUS.DLL instaladas en el PC. Una versión para dibujar el degradado y otra versión para apenas dibujar el degradado. Si el PC solamente tiene una versión de GDIPLUS.DLL instalada, incluso más de una copia, todo irá bien. Pero algunas aplicaciones necesitan una versión específica de esta biblioteca, y MS ha liberado más de 5 versiones hasta el momento. Después de un largo tiempo de pruebas he detectado esto utilizando el comando "DISPLAY DLLS"

Muchas gracias a todos los que han reportado este error, han probado y ayudado a encontrar el origen, especialmente a Andrew McNeill, Emerson Reed, Sergey Berezniker, Rui Nogueira, Randy Pearson, Sacchi. No puedo olvidar las más de 70 personas de mi hogar, la comunidad brasileña FoxBrasil, que muy amablemente probaron mucho código en entornos diferentes.

La reparación:

Cuando estamos utilizando
DECLARE Gdip..... IN GDIPLUS etc etc
Lo correcto es cambiar de "IN GDIPLUS"  por "IN GDIPLUS.DLL" En ciertas PC, esto está causando alguna confusión, y hace que VFP utilice más de una versión, especialmente si el usuario ya está utilizando _gdiplus.vcx o el ReportListener.

Vea que VFP declara Gdiplus utilizando ".DLL" para sus comandos internos, y también en _Gdiplus.vcx

En la Ayuda de VFP9 podemos encontrar:

"Para asegurar que está utilizando la copia correcta de GDIPLUS.DLL, utilice la sintaxis IN GDIPLUS.DLL sin ruta específica en sus sentencias DECLARE DLL."
http://msdn.microsoft.com/library/en-us/dv_foxhelp9/html/e11b3ffe-ee6b-4af3-94f8-7a5ed30ea83d.asp

Clase GRADOBJECTS

He publicado la nueva versión de la clase, que puede ser descargada desde este enlace:
http://www.geocities.com/macmarbr/gradobjects.zip

Además, espero publicar un nuevo escrito explicando todas las nuevas posibilidades, correcciones y ejemplos; pero, por el momento, esta versión va a ayudar a eliminar este error.

Escritos anteriores

He actualizado además todos los escritos anteriores
Gradient Objects with GDI+ Revisited
Gradient Backgrounds in your forms with GDI+ Part2
Gradient Backgrounds in your forms with GDI+

OUTLOOK BAR 2003:

El mismo problema ocurre utilizando esta gran clase. Para repararlo, abra por favor el archivo outlook2003bar.vcx, seleccione la clase "Outlook2003Bar". ¡ Lo siento Emerson !

En el método "CreateGradientImage", agregue, por favor, un ".DLL" en la declaración de la función GDI+ del degradado, así:
* Declarar API
Declare Long GdipCreateLineBrushI In GDIPlus.DLL ;
String point1, String point2, ;
Long color1, Long color2, ;
Long wrapMode, Long @lineGradient

BIBLIOTECA GDIPLUSX
Toda la biblioteca va a ser actualizada también.

Con suerte, para la próxima liberación - 0.07 Alpha ya habremos agregado esta corrección y algunas otras posibilidades y ejemplos interesantes. http://www.codeplex.com/VFPX/WorkItem/View.aspx?WorkItemId=7358

TODAS LAS DECLARACIONES GDIPLUS

Craig Boyd tiene un escrito fantástico en el que ofrece todas las 603 declaraciones de GDI+ (http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,d06cf377-c9ba-4eeb-93aa-b98ac115e895.aspx)

DISCULPAS NUEVAMENTE

Siento mucho todos los inconvenientes causados, y agradezco nuevamente por todos los comentarios y el apoyo tan importante que esta gran comunidad me ha brindado.

20 de febrero de 2007

Descripción de un número en letras

Les doy el código de un programa que llamé WORD.PRG que hace la descripción de un valor númerico en letras al estilo de como lo usan los bancos a la hora de emitir cheques.

El programa usa el PARAMETER asi que funciona como una función UDF con lo cual pueden usarlo de varias formas.

Ejemplos:

* Verlo directamente en la ventana de comandos
? WORD(525.87)
? WORD(Fields_Name)

* Asignarlo a una variable de memoria
Z=WORD(525.87)
Z=WORD(Fields_Name)

* Reemplazar campos de tipo caracter por el valor de un campo númerico
Replace all (Fields_Name1) with WORD(Fields_Name2)

Y también por supuesto hacer listados simples o ponerlo dentro de un reporte.

Espero les sea útil, yo soy cubano y solo tengo el VFP 7.0, pues tenemos dificultades para actualizarnos, esto lo hice hace muchos años en FOXPRO pero funciona muy bien, no sé si existe algo similar, espero les sirva para algo. Muchas gracias me encanta PORTALFOX pero estoy bien atrás.

A continuación el código:

FUNCTION WORD()
 LPARAMETERS _NUM
 IF TYPE('_NUM')#'N'
  RETURN 'Solo traduce Cadenas Numericas'
 ENDIF
 STORE ' ' TO _LMILLON,_LMILES,_LET
 _L1='UN DOS TRES CUATRO CINCO SEIS SIETE OCHO NUEVE DIEZ ONCE DOCE TRECE CATORCE QUINCE'
 _G1=' 1  2  3 4  5  6  7  8  9  10 11 12 13 14 15'
 _X1=' 1  4  8 13 20 26 31 37 42 48 53 58 63 69 77'
 _Y1=' 2  3  4 6  5  4  5  4  5  4  4  4  5  7  6'
 _L2='VEINTE TREINTA CUARENTA CINCUENTA SESENTA SETENTA OCHENTA NOVENTA'
 _G2='20 30 40 50 60 70 80 90'
 _X2=' 1  8 16 25 35 43 51 59'
 _Y2=' 6  7 8  9  7  7  7  7'
 _L3='CIENTO DOSC TRESC CUATROC QUIN SEISC SETEC OCHOC NOVEC'
 _G3=' 1  2 3  4  5  6  7  8  9'
 _X3=' 1  8 13 19 27 32 38 44 50'
 _Y3=' 6  4 5  7  4  5  5  5  5'
 IF _NUM=0
  RETURN 'CERO'
 ENDIF
 IF _NUM>999999999
  RETURN 'Solo traduce Numeros inferiores a Mil Millones......'
 ENDIF
 _NOM=_NUM
 _NAM=INT(_NUM)
 _MILLON=VAL(SUBSTR(STR(_NAM,9),1,3))
 _MILES=VAL(SUBSTR(STR(_NAM,9),4,3))
 _CIENTOS=VAL(SUBSTR(STR(_NAM,9),7,3))
 IF _CIENTOS>0
  _X=1
 ENDIF
 IF _MILES>0
  _X=2
 ENDIF
 IF _MILLON>0
  _X=3
 ENDIF
 DO WHILE _X>0
  IF _X=3
   _NUM=_MILLON
  ELSE
   IF _X=2
    _NUM=_MILES
   ELSE
    IF _X=1
     _NUM=_CIENTOS
    ENDIF
   ENDIF
  ENDIF
  _NUM1=_NUM
  _CAD=STR(_NUM,3)
  _C1=SUBSTR(_CAD,2,2)
  IF _NUM>0
   IF _NUM>100
    _NUM2=VAL(_C1)
    _NUM=_NUM2
    _C3=SUBSTR(_CAD,1,1)
    _N3=AT(_C3,_G3)
    _INI3=VAL(SUBSTR(_X3,_N3,2))
    _LON3=VAL(SUBSTR(_Y3,_N3,2))
    _LET3=SUBSTR(_L3,_INI3,_LON3)+IIF(_C3='1',' ','IENTOS ')
   ENDIF
   IF _NUM<10
    _CAD=STR(_NUM,1)
    _C1=SUBSTR(_CAD,1,1)
   ELSE
    IF _NUM<100
     _CAD=STR(_NUM,2)
    ENDIF
   ENDIF
   IF _NUM<16
    _N1=AT(_C1,_G1)
    _INI=VAL(SUBSTR(_X1,_N1,2))
    _LON=VAL(SUBSTR(_Y1,_N1,2))
    _LET=SUBSTR(_L1,_INI,_LON)
   ELSE
    IF _NUM<20
     _C1=SUBSTR(_CAD,2,1)
     _N1=AT(_C1,_G1)
     _INI=VAL(SUBSTR(_X1,_N1,2))
     _LON=VAL(SUBSTR(_Y1,_N1,2))
     _LET='DIECI'+SUBSTR(_L1,_INI,_LON)
    ELSE
     _C2=VAL(SUBSTR(_CAD,2,1))
     _NUM=_NUM-_C2
     _C1=STR(_NUM,2)
     _N1=AT(_C1,_G2)
     _INI=VAL(SUBSTR(_X2,_N1,2))
     _LON=VAL(SUBSTR(_Y2,_N1,2))
     _LET=SUBSTR(_L2,_INI,_LON)
     IF SUBSTR(_CAD,2,1)#'0'
      _C2=SUBSTR(_CAD,2,1)
      _N2=AT(_C2,_G1)
      _INI2=VAL(SUBSTR(_X1,_N2,2))
      _LON2=VAL(SUBSTR(_Y1,_N2,2))
      _LET=_LET+' Y '+SUBSTR(_L1,_INI2,_LON2)
     ENDIF
    ENDIF
   ENDIF
   IF _NUM1>99
    IF _NUM1=100
     _LET='CIEN '
    ELSE
     _LET=_LET3+_LET
    ENDIF
   ENDIF
   IF _X=3
    _LMILLON=_LET+' MILLONES'
    IF SUBSTR(_LET,1,2)='UN'
     _LMILLON=_LET+' MILLON'
    ENDIF
   ENDIF
   IF _X=2
    _LMILES=_LET+' MIL'
    IF SUBSTR(_LET,1,2)='UN'
     _LMILES='MIL'
    ENDIF
   ENDIF
  ENDIF
  _X=_X-1
 ENDDO
 IF _MILLON>0
  IF _MILES=0
   IF _cientos=0
    _BB=_LMILLON
   ELSE
    _BB=_LMILLON+' '+_LET
   ENDIF
  ELSE
   IF _cientos=0
    _BB=_lmillon+' '+_lmiles
   ELSE
    _BB=_LMILLON+' '+_LMILES+' '+_LET
   ENDIF
  ENDIF
 ELSE
  IF _MILES>0
   IF _cientos=0
    _BB=_lmiles
   ELSE
    _BB=_LMILES+' '+_LET
   ENDIF
  ELSE
   _BB=_LET
  ENDIF
 ENDIF
 _BB=_BB+' CON '+SUBSTR(STR(_NOM,13,2),12,2)+'/100'
 RETURN _BB
ENDFUNC
Nelson Maranjes