Sección 2: Uso de DBImage para extraer JPEG: de forma incorrecta
DBImage - toma uno (El DBImage - toma uno)
Cuando intento hacer algo nuevo con Delphi, lo primero que hago es pedir un método a la ayuda integrada de Delphi. Esto es lo que responderá la documentación de ayuda: Una TDBImage (en la página Controles de datos de la Paleta de componentes) representa una imagen gráfica de un campo BLOB en el registro actual de la base de datos. Utilice TDBImage para representar valores de campos gráficos. TDBImage permite que los formularios muestren datos gráficos de una base de datos. TDBImage solo tiene algunas propiedades de visibilidad de datos más que el componente TImage. Las dos propiedades más importantes son: DataSource (fuente de datos) y Field (campo). La propiedad DataSource conecta el componente gráfico a la base de datos. En nuestro formulario hay un componente DataSource llamado DataSource1, que representa un conjunto de datos. La propiedad Campo indica el campo (en la tabla) que contiene la imagen.
Todo está claro, ahora coloque un componente DBImage en el formulario y asígnele el nombre DBImage1 de forma predeterminada. Para conectar verdaderamente DBImage al campo BLOB de la tabla, solo necesitamos realizar la siguiente configuración (usando el Inspector de objetos):
DBImage1.DataSource = Fuente de datos1
DBImage1.Field = Imagen
Este es un truco necesario para mostrar una imagen JPEG que existe en el campo Imagen de la tabla de aplicaciones.
Para comprobar que esta configuración funciona lo único que debemos hacer es establecer la propiedad Active del componente ADOTable1 en True. Podemos hacerlo en el Inspector de objetos durante el diseño. Una vez hecho esto, aparecerá el siguiente cuadro de diálogo:
¿Qué? ¿Por qué muestra "La imagen de mapa de bits no es válida"? Tenemos imágenes JPEG en lugar de imágenes BMP. ¿Es ese el problema? Volvamos a ayudar.
Después de un rato de hacer clic en la ayuda, llegué a la conclusión: para obtener la imagen JPG en la base de datos, tenemos que usar el objeto TJpegImage. Para mostrar imágenes, necesitamos una versión simple e invisible del componente Imagen. Al mismo tiempo, necesitamos usar una secuencia para cargar la imagen desde el objeto BLOB. Descripción del documento de ayuda: Deberíamos usar TADOBlobStream para acceder o cambiar el valor del campo BLOB o memo (nota) en el conjunto de datos ADO.
Sección 3: Uso de secuencias para extraer JPEG: método incorrecto
Tirando del JPEG: ¡toma dos!
Como no podemos hacer nada con DBImage, elimínelo del formulario y coloque un componente TImage normal (página adicional) llamado ADOImage. Desafortunadamente, el componente Imagen no tiene ninguna propiedad que reconozca los datos, por lo que se requiere un programa independiente para mostrar la imagen de la tabla de base de datos que representa. La forma más sencilla de lograr esto es colocar un botón en el formulario, colocar todo el código del programa en su evento OnClick y nombrar el botón: "btnShowImage".
Para utilizar ADOBLOBStream, la documentación de ayuda recomienda crear una instancia de TADOBlobStream, utilizar el método "stream" para leer los campos gráficos del conjunto de datos y luego liberar el flujo BLOB. En algún punto intermedio, necesitaremos cargar una imagen JPEG desde un objeto TADOBlobStream usando el método LoadFromStream. Las propiedades Imagen y Gráfico del componente Imagen se utilizarán para almacenar y mostrar imágenes.
Objeto de campo, ¿qué es?
En este punto, asumo que un poco de conocimiento de los objetos de campo es más que suficiente para dominar este capítulo. En el desarrollo de la base de datos Delphi, uno de los objetos principales es el objeto TField. Los componentes de campo son objetos no visuales que representan los campos de un conjunto de datos en tiempo de ejecución (o diseño). TADOTable (y otras subclases de TDataSet) brindan acceso en tiempo de diseño al Editor de campos. El Editor de campos le permite seleccionar los campos que desea incluir en el conjunto de datos. Más importante aún, crea una lista sólida de componentes de campo utilizados en el conjunto de datos de la aplicación. Para llamar al Editor de campos, haga doble clic en el componente TADOTable. De forma predeterminada, la lista de campos está vacía. Haga clic en el botón Agregar para abrir un cuadro de diálogo que enumera los campos de la tabla Aplicaciones. De forma predeterminada, todos los campos están seleccionados, luego seleccione Aceptar.
Delphi le dará el nombre predeterminado del campo de la siguiente manera: Nombre de la tabla (tabla) + Nombre del campo (campo). Esto significa que nuestro campo de imagen se llama: ADOTable1Picture.
El método Create de TADOBlobStream crea una instancia para leer o escribir un objeto de campo BLOB específico, en este caso el campo ADOTable1Picture.
Escribimos el código del programa en el evento OnClick del botón btnShowImage. Este código leerá la imagen del campo Imagen de la fila actualmente seleccionada. El código fuente es el siguiente:
utiliza jpeg;
...
Procedimiento TForm1.btnShowImageClick(Remitente: TObject);
var bS: TADOBlobStream;
Imagen: TJpegImage;
comenzar
bS := TADOBlobStream.Crear
(AdoTable1Picture, bmRead);
intentar
Imagen:=TJpegImage.Create;
intentar
Pic.LoadFromStream(bS);
ADOImage.Picture.Graphic:=Imagen;
finalmente
Imagen.Gratis;
fin ;
finalmente
bS.Gratis
fin ;
fin ;
Bien, ejecutemos este proyecto. Por supuesto, establezca la propiedad ADOTable1.Active en Verdadero. Después de que se muestre el formulario, haga clic en el botón y aparecerá la siguiente pantalla:
¿Qué está pasando? El código es 100% correcto pero ¿por qué no se muestra la imagen? ¡Recuerda "nunca te rindas, nunca te rindas"! ¡Profundicemos hasta el nivel de bytes y veamos qué está pasando!