Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Tengo un problema al descargar una imagen (https://www.clubdelphi.com/foros/showthread.php?t=97787)

Angel.Matilla 24-10-2025 18:02:42

Tengo un problema al descargar una imagen
 
La imagen está guardada en una tabla de una BB.DD. en Firebird. A ver si alguien me ayuda porque estoy más perdido que, como dice Alberto Chicote, un cerdo en una perfumería. Estoy compilando un proyecto y me da este error:
Cita:

[Linker Error] Unresolved external 'BLOBtoJPG(Db::TBlobField *)' referenced from C:\TPV\DATFIJ.OBJ
En el formulario en que da el error tengo este código:
Código:

extern TJPEGImage* BLOBtoJPG(TBlobField *CampoBLOB);
y llamo a la función así:
Código:

TImage *Imagen = static_cast<TImage *>(Source);
Imagen->Picture->Assign(BLOBtoJPG(static_cast<TBlobField*>(fMenu->Query->FieldByName("Imagen"))));

y en el formulario donde la llamo están estos includes:
Código:

#include <vcl.h>
#include <memory>
#include <olectl.h>
#include <jpeg.hpp>

En un módulo que tengo para todas estas funciones que se usan en varios sitios la función está declarada así:
Código:

TJPEGImage* BlobtoJPG(TBlobField *CampoBLOB)
{
    if (!CampoBLOB->Value.IsEmpty())
    {
          TJPEGImage *JPeg = new TJPEGImage;
          TMemoryStream *StreamTmp = new TMemoryStream;
          CampoBLOB->SaveToStream(StreamTmp); //sacamos el jpg y se convierte a stream
          StreamTmp->Seek(0, soFromBeginning);
          JPeg->LoadFromStream(StreamTmp);
          return(JPeg);
    }
    else
          return(NULL);
}

Esta función, y otras varias, estoy harto de usarlas con este mecanismo (definirlas en un fichero cpp y llamarlas con la declaración extern) desde hace mucho tiempo y no me ha dado error nunca, pero no sé cual es el problema, no soy capaz de verlo.

Casimiro Noteví 25-10-2025 10:38:21

¿Puede que no esté bien la imagen guardada?
También intenta cambiar la extensión, en lugar de .obj
Código PHP:

TJPEGImageBlobtoJPG(TBlobField *CampoBLOB)
{
    if (!
CampoBLOB)
    {
        
ShowMessage("CampoBLOB es NULL");
        return 
NULL;
    }
    
    if (
CampoBLOB->Value.IsEmpty())
    {
        
ShowMessage("CampoBLOB está vacío");
        return 
NULL;
    }
    
    try
    {
        
TJPEGImage *JPeg = new TJPEGImage;
        
TMemoryStream *StreamTmp = new TMemoryStream;
        
        
ShowMessage("Tamaño del BLOB: " IntToStr(CampoBLOB->BlobSize));
        
        
CampoBLOB->SaveToStream(StreamTmp);
        
ShowMessage("Tamaño del stream: " IntToStr(StreamTmp->Size));
        
        
StreamTmp->Position 0;
        
JPeg->LoadFromStream(StreamTmp);
        
        
ShowMessage("JPEG cargado correctamente");
        
delete StreamTmp;
        return 
JPeg;
    }
    catch(
Exception &e)
    {
        
ShowMessage("Error: " e.Message);
        return 
NULL;
    }


</div>

Angel.Matilla 25-10-2025 10:51:38

Cita:

Empezado por Casimiro Noteví (Mensaje 568954)
¿Puede que no esté bien la imagen guardada?
También intenta cambiar la extensión, en lugar de .obj

Gracias por la respuesta. Probaré ahora mismo. Lo del cambio de extensión no lo entiendo: esa extensión está en el mensaje de error que da al compilar, no la pongo yo.

Casimiro Noteví 25-10-2025 11:27:28

¿Puede ser que hayas escrito en minúsculas en lugar de mayúculas?


Código Delphi [-]
// Declaración (en el .h) - MAYÚSCULAS
TJPEGImage* BLOBtoJPG(TBlobField *CampoBLOB);

// Implementación (en el .cpp) - minúsculas  
TJPEGImage* BlobtoJPG(TBlobField *CampoBLOB)  // ← ¡DIFERENTE!
{
    // código...
}

Angel.Matilla 25-10-2025 11:51:35

Cita:

Empezado por Casimiro Noteví (Mensaje 568957)
¿Puede ser que hayas escrito en minúsculas en lugar de mayúculas?


// Declaración (en el .h) - MAYÚSCULAS
TJPEGImage* BLOBtoJPG(TBlobField *CampoBLOB);

// Implementación (en el .cpp) - minúsculas
TJPEGImage* BlobtoJPG(TBlobField *CampoBLOB) // ← ¡DIFERENTE!
{
// código...
}

¡Seré mendrugo! Justo ese era el problema. :(

Casimiro Noteví 25-10-2025 11:54:08

Cita:

Empezado por Angel.Matilla (Mensaje 568958)
¡Seré mendrugo! Justo ese era el problema. :(

:)


De todas formas edita tu functión porque no estás liberando la memoria.
Mira el ejemplo que te he puesto.


La franja horaria es GMT +2. Ahora son las 06:32:13.

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