Página 1 de 1
Imagen Valida
Publicado: Mar Jul 26, 2011 9:05 pm
por zeasoftware
Como puedo saber si una imagen esta cargada para usarla con
TPicture():LoadFromFile( cFile ).
Explico:
Tengo un programa en el cual me mandan la imagen y la depositan en una
carpeta "imagenes" (por ejemplo), , pero en algunas impresiones esta imagen
sale, y en otras no, por lo que veo que requiero saber si ya la imagen ha
sido copiada pro completo en dicha carpeta, pero aun asi sigo teniendo ese
detalle.
puse igual:
Repeat
ProcessMessages()
Until ( file(AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg")) .And. ;
filesize(AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg")) >
20000 )
Esto por que las imagenes son de 24, 25 o 26 kb, pero..., siguen sin salir
en algunos casos.
Alguien puede dar alguna idea? todas son aceptadas, para probarlas.
Gracias de antemano.
Ramón Zea
Móvil.: 993-231.62.29
zeasoftware@hotmail.com
Imagen Valida
Publicado: Mar Jul 26, 2011 10:09 pm
por jlalin
Ramón,
si no recuerdo mal, las imágenes JPEG empiezan con "FFD8" y terminan con
"FFD9", así que para saber si el archivo está completo sólo necesitas
comprobar los dos últimos bytes.
REPEAT
ProcessMessages()
UNTIL IsValidJPEG( AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg" ) )
FUNCTION IsValidJPEG( cFilename )
LOCAL lOk := .F.
LOCAL cFile := Memoread( cFilename )
IF Asc( Right( cFile, 2 ) ) == 0xFF .AND. Asc( Right( cFile, 1 ) ) == 0xD9
lOk := .T.
ENDIF
RETURN lOk
Un apunte: yo no usaría ese bucle REPEAT...UNTIL, mejor pondría un TTimer
cada x segundos y desde ahí haría la comprobación.
Saludos,
José Lalín
Imagen Valida
Publicado: Mié Jul 27, 2011 12:37 am
por macgyber
El 26/07/2011 17:09, José Lalín escribió:
> Ramón,
>
> si no recuerdo mal, las imágenes JPEG empiezan con "FFD8" y terminan con
> "FFD9", así que para saber si el archivo está completo sólo necesitas
> comprobar los dos últimos bytes.
>
> REPEAT
> ProcessMessages()
> UNTIL IsValidJPEG( AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg" ) )
>
> FUNCTION IsValidJPEG( cFilename )
>
> LOCAL lOk := .F.
> LOCAL cFile := Memoread( cFilename )
>
> IF Asc( Right( cFile, 2 ) ) == 0xFF .AND. Asc( Right( cFile, 1 ) ) == 0xD9
> lOk := .T.
> ENDIF
>
> RETURN lOk
>
> Un apunte: yo no usaría ese bucle REPEAT...UNTIL, mejor pondría un
> TTimer cada x segundos y desde ahí haría la comprobación.
>
> Saludos,
> José Lalín
>
una idea seria, suponiendo que quien pone la imagen es otro programa,
que grabara 2 archivos: foto.jpg y foto
la existencia del segundo indica que el primero ya se grabo por completo
Imagen Valida
Publicado: Mié Jul 27, 2011 2:00 am
por zeasoftware
Gracias, sigue igual, el problema es que esos archivos los pone el PAC, por
lo de las fact. elect., si re-imprimo el comprobante si sale, pero ya pasado
unos minutos.
Sigo buscando...
Saludos.
Ramón Zea
Móvil.: 993-231.62.29
zeasoftware@hotmail.com
"José Lalín" escribió en el mensaje de
noticias:4e2f1eec$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Ramón,
si no recuerdo mal, las imágenes JPEG empiezan con "FFD8" y terminan con
"FFD9", así que para saber si el archivo está completo sólo necesitas
comprobar los dos últimos bytes.
REPEAT
ProcessMessages()
UNTIL IsValidJPEG( AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg" ) )
FUNCTION IsValidJPEG( cFilename )
LOCAL lOk := .F.
LOCAL cFile := Memoread( cFilename )
IF Asc( Right( cFile, 2 ) ) == 0xFF .AND. Asc( Right( cFile, 1 ) ) ==
0xD9
lOk := .T.
ENDIF
RETURN lOk
Un apunte: yo no usaría ese bucle REPEAT...UNTIL, mejor pondría un TTimer
cada x segundos y desde ahí haría la comprobación.
Saludos,
José Lalín
Imagen Valida
Publicado: Mié Jul 27, 2011 9:44 am
por jlalin
Ramón,
prueba así:
REPEAT
ProcessMessages()
Sleep( 500 )
UNTIL IsFileLocked( AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg" ) )
IF IsValidJPeg( AppData:DIR_CBB + Trim(::cFolioFiscal + ".jpg" ) )
...
ENDIF
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC( ISFILELOCKED )
{
HANDLE hFile = CreateFile( hb_parc( 1 ), GENERIC_WRITE, FILE_SHARE_READ
| FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 );
hb_retl( hFile == INVALID_HANDLE_VALUE );
}
#pragma ENDDUMP
Saludos,
José Lalín
Imagen Valida
Publicado: Mié Jul 27, 2011 9:57 am
por jlalin
Ramón,
hay un bug en la función. Usa esta:
#pragma BEGINDUMP
#include <windows.h>
#include <xailer.h>
HB_FUNC( ISFILELOCKED )
{
HANDLE hFile = CreateFile( hb_parc( 1 ), GENERIC_WRITE, FILE_SHARE_READ
| FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0 );
if( hFile != INVALID_HANDLE_VALUE )
CloseHandle( hFile );
hb_retl( hFile == INVALID_HANDLE_VALUE );
}
#pragma ENDDUMP
Saludos,
José Lalín
Imagen Valida
Publicado: Mié Jul 27, 2011 10:01 am
por jlalin
Ramón,
acabo de recordar que tenemos la vieja FOpen():
#include "fileio.ch"
FUNCTION IsFileLocked( cFilename )
LOCAL hFile := FOpen( cFilename, FO_EXCLUSIVE )
LOCAL lLocked := ( FError() == 0 )
IF hFile > 0
FClose( hFile )
ENDIF
RETURN lLocked
Saludos,
José Lalín
Imagen Valida
Publicado: Mié Jul 27, 2011 7:48 pm
por xhermita
De donde sale la REPEAT / UNTIL, la he buscado en xharbour y clipper y
no he dado con ella, y la verdad es que la había echado de menos un par
de veces, por que con el DO WHILE no siempre puedes estructurar bien el
código.
Es solo por curiosidad, por si debería leer algo mas sobre xbase para
que no se me queden cosas como esta atrás.
Un Saludo
Pedro Amaro
Imagen Valida
Publicado: Mié Jul 27, 2011 8:22 pm
por zeasoftware
Es un comando hecho a mano, te paso los comandos:
#command Repeat => While ( .T. )
#command Until <expr> => If ( <expr> ) ;
; Exit ;
; End ;
; End
Saludos. estamos para apoyarnos....
Ramón Zea
Móvil.: 993-231.62.29
zeasoftware@hotmail.com
"Pedro Amaro" escribió en el mensaje de
noticias:4e30500a$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
De donde sale la REPEAT / UNTIL, la he buscado en xharbour y clipper y
no he dado con ella, y la verdad es que la había echado de menos un par
de veces, por que con el DO WHILE no siempre puedes estructurar bien el
código.
Es solo por curiosidad, por si debería leer algo mas sobre xbase para
que no se me queden cosas como esta atrás.
Un Saludo
Pedro Amaro
Imagen Valida
Publicado: Sab Jul 30, 2011 4:54 pm
por zeasoftware
Gracias, funciono perfecto!!!!
ya estan saliendo mis fact. elect. completas....
Ramón Zea
Móvil.: 993-231.62.29
zeasoftware@hotmail.com
"José Lalín" escribió en el mensaje de
noticias:4e2fc5e5$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Ramón,
acabo de recordar que tenemos la vieja FOpen():
#include "fileio.ch"
FUNCTION IsFileLocked( cFilename )
LOCAL hFile := FOpen( cFilename, FO_EXCLUSIVE )
LOCAL lLocked := ( FError() == 0 )
IF hFile > 0
FClose( hFile )
ENDIF
RETURN lLocked
Saludos,
José Lalín
Imagen Valida
Publicado: Lun Ago 01, 2011 8:55 am
por jlalin
Ramón,
> Gracias, funciono perfecto!!!!
> ya estan saliendo mis fact. elect. completas....
Ya pagarás unas cervezas

Saludos,
José Lalín
Imagen Valida
Publicado: Lun Ago 01, 2011 2:46 pm
por zeasoftware
jajjaja
Salud!!
Ramón Zea
Móvil.: 993-231.62.29
zeasoftware@hotmail.com
"José Lalín" escribió en el mensaje de
noticias:4e364dc9$[email=1@svctag-j7w3v3j....]1@svctag-j7w3v3j....[/email]
Ramón,
> Gracias, funciono perfecto!!!!
> ya estan saliendo mis fact. elect. completas....
Ya pagarás unas cervezas

Saludos,
José Lalín