Page 1 of 1

mostrar imagen desde MARIAdb sin recordset...

Posted: Tue Dec 17, 2019 9:20 am
by goosfancito
Buen dia.
Tengo una tabla en mariadb y estoy usando tdolphin, necesito tomar el dato del campo que contiene la imagen y mostrarla en un control IMAGE

Code: Select all

   ::oImagen:LoadFromMemory(::oQry:FieldGet("c19"))
   ::oImagen:refresh()
 
El campo de la tabla tiene datos, ya lo verifique. Pero me tira error:

Code: Select all

 Error description: Error BASE/1004  Class: 'NIL' has no exported method: LOADFROMMEMORY
   Args:
     [   1] = U   
     [   2] = C   BM6’

que le erro?

gracias.

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Tue Dec 17, 2019 11:47 am
by Adolfo
Yo redefino el xImage asi

REDEFINE XIMAGE oImg SOURCE oRecordSet:FOTO ID 103 OF oFldPro:aDialogs[ 6 ] UPDATE

Pruebalo, funciona con tDolphin y FWMariaDb

Saludos...

EDIT : No me habia percatado que no querias tener un Recordset, sin embargo, solo traer un campo desde una tabla de Sql es en si un recordset.....

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Tue Dec 17, 2019 5:59 pm
by EBM
Hola

Yo lo hago de la siguiente manera y me funciona perfecto:

oFoto := TBitMap():Define()

oFoto:LoadFromString( oQFotos:FieldGet( "ENTRADA" ) )

Espero te funcione

Saludos!

Eduardo Borondón Muñiz

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Wed Dec 18, 2019 12:02 am
by goosfancito
Podrias explicarme como haces el REDEFIne? porque intento hacerlo y sigo con el mismo problema:

Code: Select all

   REDEFINE IMAGE ::oImagen ID 300 OF oDlg ADJUST update
   ::oImagen:LoadFromString( ::oQry:FieldGet("c19") )
   ::oImagen:refresh()

 
Tira este error:
Time from start: 0 hours 0 mins 28 secs
Error occurred at: 17/12/2019, 21:02:05
Error description: Error BASE/1004 Class: 'NIL' has no exported method: LOADFROMSTRING
Args:
[ 1] = U
[ 2] = C BM6’ 6 ( } l Ž ˆ ˆ
EBM wrote:Hola

Yo lo hago de la siguiente manera y me funciona perfecto:

oFoto := TBitMap():Define()

oFoto:LoadFromString( oQFotos:FieldGet( "ENTRADA" ) )

Espero te funcione

Saludos!

Eduardo Borondón Muñiz

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Wed Dec 18, 2019 5:23 pm
by EBM
Hola

Te mando mi codigo tal cual lo estoy utilizando para visualizar las imagenes guardadas en una tabla MySql con TDolphin

Code: Select all

////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNCTION ViewPict()
LOCAL oDlg, aGets[ 5 ], aBoton[ 2 ], oUser, oImage1, oImage2, oFontPass, cClave
LOCAL aFont[ 2 ], lValid := .f., dFecha, cEntrada, cSalida

DEFINE FONT aFont[ 1 ] NAME "Times New Roman" SIZE 0,-12

oUser     := Usuario():Init()
dFecha    := oPublic:oEmpresa:dFechaTrabajo
cEntrada  := cSalida := "00:00:00"
cClave    := Space( 8 )

DEFINE   DIALOG   oDlg                                                                                ;
         RESOURCE "VIEW_PICT"                                                                         ;
         TITLE    "Visualizador de fotos"                                                             ;
         OF       oPublic:oVentPrin                                                                   ;
         FONT     oPublic:oVentPrin:oFont

REDEFINE GET      aGets[ 3 ]                                                                          ;
         VAR      dFecha                                                                              ;
         ID       103                                                                                 ;
         FONT     oPublic:oFont                                                                       ;
         OF       oDlg                                                                                ;
         UPDATE                                                                                       

REDEFINE GET     aGets[ 1 ]                                                                           ;
         VAR     cClave                                                                               ;
         ID      101                                                                                  ;
         OF      oDlg                                                                                 ;
         PICTURE "@K!"                                                                                ;
         FONT    aFont[ 1 ]                                                                           ;
         VALID   ( cClave := ClaveUsu( cClave ), lValid := oUser:ClaveOK( cClave ),                   ;
                   LoadPict( @oUser, dFecha, @cEntrada, @cSalida, @oImage1, @oImage2 ),               ;
                   oDlg:Update(), aBoton[ 1 ]:SetFocus(), lValid )                                       ;
         UPDATE

REDEFINE GET     aGets[ 2 ]                                                                           ;
         VAR     oUser:cNombre                                                                        ;
         ID      102                                                                                  ;
         FONT    oPublic:oFont                                                                        ;
         WHEN    .F.                                                                                  ;
         OF      oDlg                                                                                 ;
         UPDATE

REDEFINE BITMAP   oImage1                                                                             ;
         ID       104                                                                                 ;
         OF       oDlg                                                                                ;
         ADJUST

REDEFINE BITMAP   oImage2                                                                             ;
         ID       105                                                                                 ;
         OF       oDlg                                                                                ;
         ADJUST

REDEFINE GET      aGets[ 4 ]                                                                          ;
         VAR      cEntrada                                                                            ;
         ID       106                                                                                 ;
         WHEN     .F.                                                                                 ;
         FONT     oPublic:oFont                                                                       ;
         OF       oDlg                                                                                ;
         UPDATE                                                                                       

REDEFINE GET      aGets[ 5 ]                                                                          ;
         VAR      cSalida                                                                             ;
         ID       107                                                                                 ;
         WHEN     .F.                                                                                 ;
         FONT     oPublic:oFont                                                                       ;
         OF       oDlg                                                                                ;
         UPDATE                                                                                       

REDEFINE BUTTON   aBoton[ 1 ]                                                                         ;
         ID       151                                                                                 ;
         OF       oDlg                                                                                ;
         WHEN     lValid                                                                              ;
         MESSAGE  "Nueva consulta"                                                                    ;
         ACTION   ( cEntrada := cSalida := "00:00:00", oImage1:Clear(), oImage2:Clear(), oUser:Init(),;
                    cClave   := Space( 8 ), oDlg:Update(), aGets[ 3 ]:SetFocus() )                    ;
         UPDATE

REDEFINE BUTTON   aBoton[ 2 ]                                                                         ;
         ID       152                                                                                 ;
         OF       oDlg                                                                                ;
         MESSAGE  "Salir"                                                                             ;
         CANCEL                                                                                       ;
         ACTION   ( oDlg:End() )                                                                      ;
         UPDATE

ACTIVATE DIALOG  oDlg CENTER                                                                          
         
AEval( aFont , { | Elem | Iif( Elem <> NIL, ( Elem:End(), DeleteObject( Elem ) ), .t. ) } )
         
aFont   := NIL         
oImage1 := NIL
oImage2 := NIL

Return NIL

/////////////////////////////////////////////////////////////////////////////////////////////////////
FUNCTION LoadPict( oUser, dFecha, cEntrada, cSalida, oImage1, oImage2 )
LOCAL oQuery, oQFotos, cConsulta , nRecno

// Checar si ya realizo algun movimiento en el dia el empleado
cConsulta := "SELECT RECNO, ENTRADA, SALIDA "                                                       + ;
             "FROM   asistencia   "                                                                 + ;
             "WHERE  EMPLEADO = '" + oUser:oEmpleado:cCodigo + "'  "                                + ;
             "AND    FECHA    = '" + DtoS( dFecha )          + "'  "                                + ;
             "AND    DELETED  = 'N' "                                                              
             
oQuery    := oPublic:oDoIt:oServer:Query( cConsulta )

If oQuery:nRecCount > 0
   nRecno   := oQuery:FieldGet( "RECNO" )
   cEntrada := oQuery:FieldGet( "ENTRADA" )
   cSalida  := oQuery:FieldGet( "SALIDA" )

  // Traigo las imagenes desde la tabla de imagenes 
   cConsulta := "SELECT ENTRADA, SALIDA FROM fasistencia "                                           + ;
                "WHERE REGISTRO='" + Str( nRecno, 11 ) + "' "
                   
   oQFotos   := oPublic:oDoIt:oServer:Query( cConsulta )

   If oQFotos:nRecCount > 0
      oImage1:LoadFromString( HB_Base64Decode( oQFotos:FieldGet( "ENTRADA" ) ) )
      oImage2:LoadFromString( HB_Base64Decode( oQFotos:FieldGet( "SALIDA" ) ) )
    else
      oImage1:Clear()
      oImage2:Clear()
   EndIf   
EndIf
   
oImage1:Refresh()
oImage2:Refresh()

Return NIL
 
Espero te sirva, cualquier duda estoy a tus ordenes

Saludos!!

Eduardo Borondón Muñiz

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Wed Dec 18, 2019 8:23 pm
by goosfancito
Gracias.

Voy a probar a ver como sale.

en el Resource lo declaraste como un control "PICTURE"?

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Thu Dec 19, 2019 5:39 pm
by carlos vargas
umm, en mi caso particular yo cuando guardo la imagen en tabla lo que hago es lo siguiente:
  • define el campo en la tabla de mysql/mariadb es de tipo MEDIUMTEXT.
  • para guardar el archivo en la tabla, lo hago de la siguiente forma: oQry:ARCHIVO:= hb_StrToHex( FileStr( "c:\test\test.jpg" ) )
  • y para recuperarlo lo hago de la siguiente forma: MsgRun( "Guardando documento a archivo...", "Espere por favor", {|| nSize := StrFile( HB_HexToStr( oQryTmp:ARCHIVO ), cFileExtract ) } )
    en tu caso podrias usarlo ::oImagen:LoadFromString( HB_HexToStr( oQryTmp:ARCHIVO ) )
En mi caso convierto la cadena regresada por StrFile y lo paso a hexadecimal lo cual duplica en tabla en tamaño del archivo a guardar, si el archivo es de 10k, ya en tabla son 20k,
en algunas ocasiones experimente en en convertir a base64 y ahi el incremento es del 50% por lo que 10k pasa a ser como 15k, pero note como que tomaba mas tiempo. (en este caso uso las funciones HB_Base64Encode y HB_Base64DecodeE en lugar de hb_StrToHex yHB_HexToStr)
En tu caso el mensaje de errror es que el objeto ::oImagen no esta creado, esa variable tiene un valor de NIL y por lo tanto no tiene definido ningún método, ten en cuenta que ese comando de definición se debe crear tal como esta definido en el ch, tambien se da la particularidad que ese comando en fivewin esta definido en dos lugares.... ???? Antonio hay que ver si esto es necesario o eliminar uno de ellos.

image.ch

Code: Select all

#xcommand REDEFINE Image [ <oBmp> ] ;
             [ ID <nId> ] ;
             [ <of: OF, WINDOW, DIALOG> <oWnd> ] ;
             [ <resource: NAME, RESNAME, RESOURCE> <cResName> ] ;
             [ <file: FILE, FILENAME, DISK> <cBmpFile> ] ;
             [ <lClick: ON ClICK, ON LEFT CLICK> <uLClick> ] ;
             [ <rClick: ON RIGHT CLICK> <uRClick> ] ;
             [ <scroll: SCROLL> ] ;
             [ <adjust: ADJUST> ] ;
             [ CURSOR <oCursor> ] ;
             [ MESSAGE <cMsg>   ] ;
             [ <update: UPDATE> ] ;
             [ WHEN <uWhen> ] ;
             [ VALID <uValid> ] ;
       => ;
          [ <oBmp> := ] TImage():ReDefine( <nId>, <cResName>, <cBmpFile>,;
             <oWnd>, [\{ |nRow,nCol,nKeyFlags| <uLClick> \}],;
                     [\{ |nRow,nCol,nKeyFlags| <uRClick> \}],;
             <.scroll.>, <.adjust.>, <oCursor>, <cMsg>, <.update.>,;
             <{uWhen}>, <{uValid}> )
 
fivewin.ch

Code: Select all

#xcommand REDEFINE IMAGE [ <oBmp> ] ;
             [ ID <nId> ] ;
             [ <of: OF, WINDOW, DIALOG> <oWnd> ] ;
             [ <resource: NAME, RESNAME, RESOURCE> <cResName> ] ;
             [ <file: FILE, FILENAME, DISK> <cBmpFile> ] ;
             [ <lClick: ON ClICK, ON LEFT CLICK> <uLClick> ] ;
             [ <rClick: ON RIGHT CLICK> <uRClick> ] ;
             [ <scroll: SCROLL> ] ;
             [ <adjust: ADJUST> ] ;
             [ CURSOR <oCursor> ] ;
             [ MESSAGE <cMsg>   ] ;
             [ <update: UPDATE> ] ;
             [ WHEN <uWhen> ] ;
             [ VALID <uValid> ] ;
             [ <transparent: TRANSPARENT> ] ;
       => ;
          [ <oBmp> := ] TImage():ReDefine( <nId>, <cResName>, <cBmpFile>,;
             <oWnd>, [\{ |nRow,nCol,nKeyFlags| <uLClick> \}],;
                     [\{ |nRow,nCol,nKeyFlags| <uRClick> \}],;
             <.scroll.>, <.adjust.>, <oCursor>, <cMsg>, <.update.>,;
             <{uWhen}>, <{uValid}>, <.transparent.> )
 

Re: mostrar imagen desde MARIAdb sin recordset...

Posted: Sat Dec 21, 2019 3:43 pm
by acuellar
goosfancito

La imágen se puede grabar en un campo BLOB o MEDIUMTEXT depende del tamaño

Con BLOB se guarda asi:

Code: Select all

cFOTO:= cGetFile( "JPG (*.jpg)| *.jpg|" +"PNG (*.png)| *.png|","Por Favor Seleccione la foto" , "C:\SISTEMAS\RRHH\FOTOS" ) 
oSQL:FOTO:=HB_MemoRead(cFoto)
 
Con MEDIUMTEXT

Code: Select all

   BLOBImport( FieldPos( "FOTO" ),cFoto )
 
Para recuperar:
oFoto:SetBmp(FOTO)
Para mostrar:

Code: Select all

 
 REDEFINE XIMAGE oFoto ID 118 OF oDlg SOURCE oEMPL:FOTO UPDATE

o

  REDEFINE BITMAP oFoto ID 118 OF oDlg NOBORDER ADJUST