FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Posible error
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Posible error
Posted: Sun Oct 17, 2010 11:20 AM
Amigos,

Le he dado vueltas durante varios dias y el siguiente error me tiene loco.

Cuando copio una imagen al portapapeles y ejecuto el siguiente codigo:
Code (fw): Select all Collapse
      cFoto    := ".\tempo\tmpmem.bmp"
      FErase( cFoto )
      hBitmap    := oClp:GetBitmap()
      hDib       := DibFromBitmap( hBitmap, 0 )
      DibWrite( cFoto, hDib )
      oFoto:LoadImage( ,cFoto )
      oFoto:refresh()


Me da como resultado una imagen distorsionada como est谩:



Uploaded with ImageShack.us

En versiones anteriores a la 10.8 todo funcionaba de maravillas con el mismo c贸digo

Quedo a la espera de su valiosa ayuda.
Gracias de antemano
William, Morales

Saludos



m茅xico.sureste
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Posible error
Posted: Sun Oct 17, 2010 07:28 PM
William

intenta de esta forma
Code (fw): Select all Collapse
#include "fivewin.ch"


function main

   local oWnd
   local cFoto   
   local oBar, oClp
   
   define window oWnd 
   define buttonbar oBar of oWnd
   
   define clipboard oClp of oWnd
   
   define button action LoadFromClip( oClp, oFoto ) of oBar
   
   @ 35,1 image oFoto size 480, 400 pixel
   
   
   activate window oWnd
   

return nil

function LoadFromClip( oClp, oFoto )

   local cBmp
   cFoto    := ".\tmpmem.bmp"
   FErase( cFoto )
   hBitmap    := oClp:GetBitmap()
   if hBitmap != 0
      cBmp := BmpToStr( hBitmap )
      memowrit( cFoto, cBmp )
      oFoto:LoadImage( ,cFoto )
      oFoto:refresh()
   else 
      Msginfo( "no image in clipboard")
   endif

return nil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Posible error
Posted: Sun Oct 17, 2010 10:10 PM
William

Para solucionarlo de la forma como lo usas he hecho estos cambios/subtituciones

cuando compiles ambos fuentes en C se generaran unos warning totalmete inofencivos, no les prestes atencion

dib.c

Agregar

Code (fw): Select all Collapse
char * DibToStr( HGLOBAL hDib, long * plSize )
{
聽 聽LPBITMAPINFO Info = ( LPBITMAPINFO ) GlobalLock( hDib );
聽 聽void * Bits 聽= ( void * ) ( ( char * ) Info + Info->bmiHeader.biSize +
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 wDIBColors( ( LPBITMAPINFOHEADER ) Info ) * sizeof( RGBQUAD ) ); 聽 
聽 聽BITMAPFILEHEADER bmf;
聽 聽char * pDib;
聽 聽long lSize;

聽 聽lSize = GlobalSize( ( HGLOBAL ) Info );
聽 聽
聽 聽pDib = hb_xgrab( sizeof( bmf ) + lSize );

聽 聽bmf.bfType 聽 聽 聽= 0x4D42;
聽 聽bmf.bfSize 聽 聽 聽= sizeof( bmf ) + lSize;
聽 聽bmf.bfReserved1 = 0;
聽 聽bmf.bfReserved2 = 0;
聽 聽bmf.bfOffBits 聽 = sizeof( bmf ) + ( LONG ) Bits - ( LONG ) Info; 聽 
聽 聽
聽 聽memcpy( pDib, &bmf, sizeof( bmf ) );
聽 聽memcpy( ( char * ) pDib + sizeof( bmf ), ( void * ) Info, lSize );
聽 聽lSize += sizeof( BITMAPFILEHEADER );
聽 聽*plSize = lSize;
聽 聽
聽 聽return pDib;
}


cambiar

Code (fw): Select all Collapse
BOOL DibWrite( LPSTR szFileName, HGLOBAL hDIB )
{

聽 聽long lSize;
聽 聽char * pDib;
聽 聽int hBmp;
聽 聽
聽 聽pDib = DibToStr( hDIB, &lSize );

聽 聽#ifndef UNICODE
聽 聽if( ( hBmp = _lcreat( szFileName, 0 ) ) != HFILE_ERROR )
聽 聽{
聽 聽 聽 _hwrite( hBmp, ( const char * ) pDib, lSize );
聽 聽 聽 _lclose( hBmp );
聽 聽 聽 GlobalUnlock( hDIB );
聽 聽 聽 return TRUE;
聽 聽}
聽 聽#else
聽 聽if( ( hBmp = hb_fsCreate( ( unsigned char * ) szFileName, 0 ) ) != ( int ) INVALID_HANDLE_VALUE )
聽 聽{
聽 聽 聽 hb_fsWriteLarge( hBmp, ( unsigned char * ) pDib, lSize );
聽 聽 聽 hb_fsClose( hBmp );
聽 聽 聽 GlobalUnlock( hDIB );
聽 聽 聽 return TRUE;
聽 聽}
聽 聽#endif
聽 聽else
聽 聽{
聽 聽 聽 GlobalUnlock( hDIB );
聽 聽 聽 return FALSE;
聽 聽}
}



dibbmp.c

agregar prototipo

Code (fw): Select all Collapse
char * DibToStr( HGLOBAL hDib, long * plSize );


cambiar
Code (fw): Select all Collapse
HB_FUNC( BMPTOSTR ) // hBmp --> cBitmapAsString
{
聽 聽HGLOBAL hDib = ( HGLOBAL ) DibFromBitmap( ( HBITMAP ) hb_parnl( 1 ), 0, 0, NULL );
聽 聽long lSize;
聽 聽char * pDib = DibToStr( hDib, &lSize );

聽 聽hb_retclen( pDib, lSize );
聽 聽
聽 聽GlobalUnlock( hDib );
聽 聽GlobalFree( hDib );
聽 聽hb_xfree( pDib );
}
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Posible error
Posted: Mon Oct 18, 2010 02:47 AM

Daniel,

Muchas gracias por tu ayuda como siempre.

La primera opci贸n funciona de perlas, sin problemas.

La opci贸n segunda mas compleja y he realizado las modificaciones que comentas y no funciona, el mismo problema y solo a veces sale bien la imagen. Cuando graba el archivo Windows detecta el archivo con problemas y no muestra la imagen en el preview que trae windows. Si abro el archivo con el Paint y lo grabo sobre el paint, ya se corrije el archivo de imagen.

Quedo pendiente. Saludos

William, Morales

Saludos



m茅xico.sureste
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Posible error
Posted: Mon Oct 18, 2010 02:55 AM

William

a mi me funcionan bien las modificaciones y no hice mas de lo que publique,
te pregunto, modificaste los fuentes o agregastes las funciones aparte?

Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Posible error
Posted: Mon Oct 18, 2010 07:52 AM
Daniel Garcia-Gil wrote:William

a mi me funcionan bien las modificaciones y no hice mas de lo que publique,
te pregunto, modificaste los fuentes o agregastes las funciones aparte?


Daniel,

Agregue las funciones con todo lo que mencionas. As铆 qued贸:
Code (FW): Select all Collapse
#pragma BEGINDUMP
/*
#include <windows.h>
#include <hbapi.h>

 /// ....  Aqu铆 adicion茅 las funciones que comentas y esto est谩 en el PRG principal de mi aplicaci贸n

#pragma ENDDUMP


Saludos y quedo pendiente de lo que comentes
William, Morales

Saludos



m茅xico.sureste
Posts: 1076
Joined: Fri Oct 07, 2005 10:41 PM
Re: Posible error (** SOLUCIONADO ** )
Posted: Wed Oct 20, 2010 12:01 AM

Daniel,

Efectivamente integrando las modificaciones directas a los fuentes de FWH y recompilando las LIB funciona de maravilla tal cual dejaste el c贸digo.

Gracias Mil

William, Morales

Saludos



m茅xico.sureste
Posts: 990
Joined: Thu Nov 17, 2005 05:49 PM
Re: Posible error
Posted: Wed Oct 27, 2010 06:53 PM
Daniel;

Hola. Has puesto en algun lugar como compilar los .c de fivec.lib?

Imagino que lleva algunos flags?

Trat茅 de compilar con bcc. Tengo esto:
Borland C++ 5.82 for Win32 Copyright (c) 1993, 2005 Borland
dib.c:
Warning W8060 dib.c 68: Possibly incorrect assignment in function DibRead
Warning W8060 dib.c 70: Possibly incorrect assignment in function DibRead
Warning W8065 dib.c 240: Call to function 'hb_parc' with no prototype in function HB_FUNC
Warning W8070 dib.c 241: Function should return a value in function HB_FUNC
Warning W8057 dib.c 241: Parameter 'DIBREAD' is never used in function HB_FUNC
Error E2238 dib.c 246: Multiple declaration for 'HB_FUNC'
Error E2344 dib.c 238: Earlier declaration of 'HB_FUNC'
...



Gracias,


Reinaldo.
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Posible error
Posted: Wed Oct 27, 2010 09:22 PM
Reinaldo

Puedes agregar esto en tu prg principal

Code (fw): Select all Collapse
#pragma BEGINDUMP
#include <windows.h>
#include <hbapi.h>

WORD far pascal wDIBColors( LPBITMAPINFOHEADER );

HANDLE DibFromBitmap( HBITMAP, DWORD, WORD, HPALETTE );


char * DibToStr( HGLOBAL hDib, long * plSize )
{
   LPBITMAPINFO Info = ( LPBITMAPINFO ) GlobalLock( hDib );
   void * Bits  = ( void * ) ( ( char * ) Info + Info->bmiHeader.biSize +
                    wDIBColors( ( LPBITMAPINFOHEADER ) Info ) * sizeof( RGBQUAD ) );   
   BITMAPFILEHEADER bmf;
   char * pDib;
   long lSize;

   lSize = GlobalSize( ( HGLOBAL ) Info );
   
   pDib = hb_xgrab( sizeof( bmf ) + lSize );

   bmf.bfType      = 0x4D42;
   bmf.bfSize      = sizeof( bmf ) + lSize;
   bmf.bfReserved1 = 0;
   bmf.bfReserved2 = 0;
   bmf.bfOffBits   = sizeof( bmf ) + ( LONG ) Bits - ( LONG ) Info;   
   
   memcpy( pDib, &bmf, sizeof( bmf ) );
   memcpy( ( char * ) pDib + sizeof( bmf ), ( void * ) Info, lSize );
   lSize += sizeof( BITMAPFILEHEADER );
   *plSize = lSize;
   
   return pDib;
}


BOOL DibWrite( LPSTR szFileName, HGLOBAL hDIB )
{

   long lSize;
   char * pDib;
   int hBmp;
   
   pDib = DibToStr( hDIB, &lSize );

   #ifndef UNICODE
   if( ( hBmp = _lcreat( szFileName, 0 ) ) != HFILE_ERROR )
   {
      _hwrite( hBmp, ( const char * ) pDib, lSize );
      _lclose( hBmp );
      GlobalUnlock( hDIB );
      return TRUE;
   }
   #else
   if( ( hBmp = hb_fsCreate( ( unsigned char * ) szFileName, 0 ) ) != ( int ) INVALID_HANDLE_VALUE )
   {
      hb_fsWriteLarge( hBmp, ( unsigned char * ) pDib, lSize );
      hb_fsClose( hBmp );
      GlobalUnlock( hDIB );
      return TRUE;
   }
   #endif
   else
   {
      GlobalUnlock( hDIB );
      return FALSE;
   }
}
 

HB_FUNC( BMPTOSTR ) // hBmp --> cBitmapAsString
{
   HGLOBAL hDib = ( HGLOBAL ) DibFromBitmap( ( HBITMAP ) hb_parnl( 1 ), 0, 0, NULL );
   long lSize;
   char * pDib = DibToStr( hDib, &lSize );

   hb_retclen( pDib, lSize );
   
   GlobalUnlock( hDib );
   GlobalFree( hDib );
   hb_xfree( pDib );
} 


HB_FUNC( DIBWRITE )  // ( cFileName, hDib ) --> lSuccess
{
   hb_retl( DibWrite( ( char * ) hb_parc( 1 ), ( HGLOBAL ) hb_parnl( 2 ) ) );
}
 
#pragma ENDDUM
P
Posts: 990
Joined: Thu Nov 17, 2005 05:49 PM
Re: Posible error
Posted: Wed Oct 27, 2010 09:44 PM

Daniel;

No. O sea, no quiero tener que cambiar todos mis proyectos. Eso no hace sentido.

D茅jame explicar; Ya adqir铆 Fwh de Oct 2010 que obviamente se public贸 con bugs al que tu aparentemente le estas haciendo las correcciones. Si una funci贸n tiene un bug y tu me publicas el arreglo, pues ch茅vere, le hago el arreglo, se recompila y se mete en su .lib. Listo. Yo acepto eso.

Tener que alterar todos mis proyectos porque una funci贸n en fivehc tiene un bug, no es buena idea.

Espero me entiendas.

Reinaldo.

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Posible error
Posted: Wed Oct 27, 2010 10:31 PM
Reinaldo

para reconstruir la libreria de C (lfivehc.lib) de FW debes usar harbour indistintamente si usas xharbour, de las conversiones se encarga internamente fivewin,
o en su defecto usar los include de harbour y agregar usar estos flags

-c -q -tWM -IHARBOUR_INCLUDE_PATH -IFWH_INCLUDE_PATH -D__HARBOUR__
Posts: 990
Joined: Thu Nov 17, 2005 05:49 PM
Re: Posible error
Posted: Wed Oct 27, 2010 11:04 PM

Daniel;

Gracias.

Us茅 el include path de una copia de harbour del 2003 que tengo. Parece que funcion贸 bien. Un par de Warnings, pero ya tu hab铆as anunciado que los debo ignorar.

Todos los a帽os en Junio me invitan a un evento en Isla Margarita. Este a帽o que viene voy y de una vez te busco para conocerte. Despues de todo la Isla no puede ser tan grande. o no?

Un saludo,

Reinaldo.

Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Posible error
Posted: Wed Oct 27, 2010 11:12 PM

Reinaldo

sera un inmenso placer...

es una isla muy peque帽a y soy facilmente localizable

Continue the discussion