Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

TDBImage con formato JPEG sin instalar componentes
Ir a página Anterior  1, 2, 3
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Responder citando

Vale,

Muchas gracias,

Carlos
_________________
Carlos J. Fernandez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Carlos J. Fernandez escribió:
compila sin problemas, pero va mal.

¿Te compila en XE3 sin hacer cambios o has hecho algún cambio? Si es así, ¿cuales?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo,

Lo unico que ademas leí por aquí por que tenia un problema al compilar por otras razones, creo recordar que era que borraramos en "Project Options" lo que ponía en "_TCHAR maps to", creo que era eso.

Por el resto nada, abrí el programa compile y todo perfecto salvo al llegar a esa parte.

Es más, he probado a quitarlo y poner BMP y todo va bien, es solo cuando uso intento usar ese código para poner los JPG cuando hace cosas raras.

Voy a seguir mirando por si fuera otra cosa y no tiene nada que ver con esto, lo mismo te estoy haciendo mirarlo sin que tenga nada que ver.

Pero la verdad es que es muy raro.

Un abrazo.

Carlos
_________________
Carlos J. Fernandez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Leo,

Ahora lo que he probado es quitar todo lo que tuviera que ver con ese componente TDBCtrlGrid, en los eventos OnResize, también al hacer click, vamos que he quitado todo y seguía con el mismo problema.

He puesto un nuevo TDBCtrlGrid accediendo a la tabla y poniendo un TDBImage al que he asociado al campo de la imagen, no tiene eventos ni nada, el efecto que hace es que repite en todos los registros la imagen del registro actual, en vez de mostrar la imagen de cada registro.

Si cambias al registro 2 todas las imágenes de la rejilla aparecen como el de la 2 y así según te vas moviendo entre registros.

Un poco extraño la verdad, es que le he dado mil vueltas y tengo la sensación de que solo puede ser eso, si lo quito logicamente me da error al intentar poner un JPG, y si solo pongo BMP va perfecto

Ahora lo que voy a probar es a crear un Formulario nuevo, solo con un TDBCtrlGrid, un TDBImage y accediendo a la tabla a ver que pasa.

Te estoy volviendo loco seguro.

Un abrazo.

Carlos
_________________
Carlos J. Fernandez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Te lo preguntaba porque a mí no me compila directamente en algunas versiones nuevas sin hacer cambios.

En vez de crear nuevo el proyecto de prueba, lo he actualizado abriendo uno creado con el BCB6, y después de hacer algunos cambios para que compilase funciona sin problemas, por lo menos en la prueba rápida que he hecho, al moverme por los registros que estaban creados, borrando algunos y creando nuevos, modificando las imágenes de los que estaban creados, etc.

Lo he probado usando ADO+MSAccess (aunque este detalle no debería ser importante) y normalmente uso esta combinación para las pruebas porque es más rápido de crear y a la vez es más sencillo cuando tengo que pasarle un ejemplo a alguien. Aunque cuando tengo tiempo generalmente hago las pruebas con más de un motor de base de datos por si acaso.

Un detalle importante, a mí al menos al actualizar el proyecto no ha actualizado bien las propiedades "DataField" y "DataSource" de alguno de los TDBImage, revísalo por si acaso. Y en caso de que despues de probar este código te siga haciendo lo mismo, si quieres puedes pasarme un pequeño ejemplo con el que se reproduzca el problema y la base de datos de pruebas para poder revisarlo..

El código completo ha quedado así, las pruebas las he hecho en la versión 2010 y la XE4 (la XE3 la desinstale ya que apenas hay diferencias más allá de correcciones de errores básicamente):

- Cabeceras: #include<memory> #include<jpeg.hpp>

Código:
/////CARGA IMAGEN DE LA BASE DE DATOS////////////////////////////////////////
void __fastcall TDBImage::LoadPicture(void)
{
    if (!FPictureLoaded && (!FDataLink->Field
        || (FDataLink->Field->DataType == ftGraphic)
        || (FDataLink->Field->DataType == ftBlob) ))
    {
        std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
            ->CreateBlobStream(FDataLink->Field, bmRead));
        WORD tipo;
        stream->Read(&tipo, sizeof(tipo));
        stream->Position = 0;
        if (tipo == 0xD8FF)
        {
            std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
            jpeg->LoadFromStream(stream.get());
            Picture->Assign(jpeg.get());
        }
        else
        {
            stream.reset();
            Picture->Assign(FDataLink->Field);
        }
    }
}

/////GUARDA LA IMAGEN EN LA BASE DE DATOS////////////////////////////////////
void __fastcall TDBImage::UpdateData(TObject* Sender)
{
    if (dynamic_cast<Graphics::TBitmap*>(Picture->Graphic))
    {
        FDataLink->Field->Assign(Picture->Graphic);
        std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
            ->CreateBlobStream(FDataLink->Field, bmWrite));
        std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
        jpeg->CompressionQuality = 90;
        jpeg->Assign(Picture->Graphic);
        jpeg->SaveToStream(stream.get());
    }
    else if (dynamic_cast<TJPEGImage*>(Picture->Graphic))
    {
        std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
            ->CreateBlobStream(FDataLink->Field, bmWrite));
        TJPEGImage* jpeg = static_cast<TJPEGImage*>(Picture->Graphic);
        jpeg->SaveToStream(stream.get());
    }
    else
        FDataLink->Field->Clear();
}

Código:
// Esta función solo es necesaria si usamos TDBCtrlGrid
void __fastcall TDBImage::Paint()
{
    TRect R;
    Canvas->Brush->Style = bsSolid;
    Canvas->Brush->Color = Color;
    if (FPictureLoaded || ControlState.Contains(csPaintCopy))
    {
        TPicture* DrawPict = new TPicture;
        HPALETTE Pal = 0;
        try
        {
            if (ControlState.Contains(csPaintCopy) && FDataLink->Field
                && ((FDataLink->Field->DataType == ftGraphic)
                || (FDataLink->Field->DataType == ftBlob)))
            {
                //////////////////////////////////
                std::auto_ptr<TStream> stream(FDataLink->Field->DataSet
                    ->CreateBlobStream(FDataLink->Field, bmRead));
                WORD tipo;
                stream->Read(&tipo, sizeof(tipo));
                stream->Position = 0;
                if (tipo == 0xD8FF)
                {
                    std::auto_ptr<TJPEGImage> jpeg(new TJPEGImage);
                    jpeg->LoadFromStream(stream.get());
                    DrawPict->Assign(jpeg.get());
                }
                else
                {
                    stream.reset();
                    DrawPict->Assign(FDataLink->Field);
                    if (DrawPict->Graphic->ClassNameIs("TBitmap"))
                        DrawPict->Bitmap->IgnorePalette = QuickDraw;
                }
                //////////////////////////////////
            }
            else
            {
                DrawPict->Assign(Picture);
                if (Focused() && DrawPict->Graphic && DrawPict->Graphic->Palette)
                {
                    Pal = SelectPalette(Canvas->Handle, DrawPict->Graphic->Palette, false);
                    RealizePalette(Canvas->Handle);
                }
            }
            if (Stretch)
            {
                if (!DrawPict->Graphic || DrawPict->Graphic->Empty)
                    Canvas->FillRect(ClientRect);
                else
                    Canvas->StretchDraw(ClientRect, DrawPict->Graphic);
            }
            else
            {
                SetRect(&R, 0, 0, DrawPict->Width, DrawPict->Height);
                if (Center)
                {
                    OffsetRect(&R, (ClientWidth - DrawPict->Width) / 2,
                               (ClientHeight - DrawPict->Height) / 2);
                }
                Canvas->StretchDraw(R, DrawPict->Graphic);
                ExcludeClipRect(Canvas->Handle, R.Left, R.Top, R.Right, R.Bottom);
                Canvas->FillRect(ClientRect);
                SelectClipRgn(Canvas->Handle, 0);
            }
        }
        __finally
        {
            if (Pal)
                SelectPalette(Canvas->Handle, Pal, true);
            delete DrawPict;
        }
    }
    else
    {
        Canvas->Font = Font;
        String S;
        if (FDataLink->Field)
            S = FDataLink->Field->DisplayLabel;
        else
            S = Name;
        S = "(" + S + ")";
        TSize Size = Canvas->TextExtent(S);
        R = ClientRect;
        Canvas->TextRect(R, (R.Right - Size.cx) / 2, (R.Bottom - Size.cy) / 2, S);
    }
    TCustomForm* Form = GetParentForm(this);
    if (Form && (Form->ActiveControl == this)
        && !ComponentState.Contains(csDesigning)
        && !ControlState.Contains(csPaintCopy))
    {
        Canvas->Brush->Color = clWindowFrame;
        Canvas->FrameRect(ClientRect);
    }
}

Como este mensaje viene a sustituir al primero de este hilo, recordar que:

Solo tenemos que añadir las funciones tal y como estan, sin modificar nada, en cualquier parte de nuestro programa:
(No tenemos que llamar a estas funciones desde nuestro programa en ningún momento, solo copiarlas y seguir trabajando de manera normal con el TDBImage)

* Evidentemente en tiempo de _diseño_ el TDBImage no podrá leer un JPEG, por lo que si activamos la tabla en tiempo de diseño recibiremos el mensaje “Bitmap image is not valid.”, pero en tiempo de ejecución funcionara correctamente. Así que cada vez que veamos este aviso mi consejo es que lo cerréis usando la tecla 'Escape' en lugar del ratón para evitar problemas con la captura del mismo.

¡ATENCION!: Esto solo funciona si tenemos enlazados estáticamente los packages con el ejecutable. O sea:
Ir al menú: Project -> Options... Dentro de ese dialogo ir a la pestaña: "Packages". Y dentro de esa pestaña desmarcar el Checkbox: "Build with runtime packages".
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Leo,

Funcionaaaaaaaaaaaaaaaa aunque no se por que jajaja

He realizado lo siguiente.

.- He creado una nueva aplicación.

.- Le he añadido el código de las tres funciones.

.- He añadido los formulario que tenia en la app vieja.

Y funciona todo correctamente con los formularios antiguos pero con una aplicación nueva.

Después me he puesto a comparar las funciones linea por linea que tenia con las que tengo ahora por si algo a cambiado y son iguales, pero si he cambiado la posición en el código, ahora están abajo del todo y antes por en medio.

Bueno aunque no se la razón todo ya va perfecto, aunque la conclusión que saco es que el programa estaba raro, en cuando hago una app nueva y añado todo ha cambiado en general, no solo eso sino que va mejor que antes, vamos que no se si tiene algo que ver, pero parece ser que eso ayuda a que se ajuste mejor al cambio de Builder.

Muchas gracias Leo, el mejor como siempre.

Un abrazo.

Carlos
_________________
Carlos J. Fernandez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

todo lo de Leo me compila correcto en RAD Studio 10.2.2 pero e incluso cuando con el OpenPictureDialog cargo la imagen en el DBImage la carga y la visualiza pero como se hace para que la guarde en el BLOB de la base de datos??? tengo puesto el FIELD y el datasource y todo correcto pero el BLOB parece estar en blanco...... no recuerdo como era para grabar el Picture del DBImage a la Base de datos (es MySQL 5)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.