![]() |
Guardar Imagen con DataSet
Estimados:
Necesito guardar una imagen por cada "Alumno" registrado, he visto unos post, pero nada realizado con el DataSet. En Mi base de datos tengo el Campo "Foto_Al" definido como "Blob", malguién me puede ayudar? Saludos Cordiales |
¿Pero estás utilizando la clase TDataset o alguno de sus derivados?
¿Qué componentes usas para conectarte? |
Cita:
|
Para conectarme ocupo TibDataBase con su TibTransaction que estan agrupados en el Datamodule
|
Cita:
|
¨Para acceder a la tabla alumnos, solo ocupo el TibDataSet (Firebird 2.5)
|
Hola.
Aquí te incluyo 2 ejemplos de código para guardar desde un TIBDataset (campo blob) a un TImage y viceversa. Son sacados de un programa que hice hace mucho tiempo para practicar y aprender a usarlo y espero que te sean útiles. El primer ejemplo es para guardar la imagen desde un campo Blob a un TImage y se pone en marcha cuando se cambia de una ficha a otra, por ejemplo, en un DBGrid:
Este es para guardar la imágen desde el TImage al campo blob:
El código original lo obtuve buscando mucho en este foro e internet y lo adapté un poco. Quizás se ajuste a lo que buscas, aunque creo que lo normal es usar los componentes TDBImage que ahorran mucho código porque enlazan directamente con el IBDataset. Salu2. |
Cita:
¿Puedes sugerirme algo? |
Cita:
Si quieres ayuda acerca de como hacerlo, seguramente sería bueno que indicaras la versión de Delphi y los componentes que usas. A propósito, ¿Por qué no usas directamente un componente TDBImage en lugar de un TImage?, creo que sería todo más fácil ¿no?. Saludos. |
Cita:
El código se puedes ver en: http://delphi.about.com/library/weekly/aa030601a.htm (De Zarko Gajic) Desarrola una idea muy buena y busca el byte que define el formato del gráfico. Ya echaba las campanas a vuelo... pero nada. Vuelta a empezar. Le doy vueltas al coco y supongo que al final veré la luz del túnel. ¿No? |
Uso una tabla con los campos: Acorde (Text), Chord (Text), Digits (Text), Grafic1 (Blob), Grafic2 (Blob), Grafic3(Blob). Diseñada en Access. *.mdb.
Componentes: TADOConnection, TADOTable, DBGrid, TImage, TDataSource, TButton, TADOBlobStream. |
Hola Bulc.
Mira, uso Delphi 7 y he probado los componentes AdoConnection y AdoTable con una BD que viene de ejemplo (dbdemos.mdb). He hecho la conexión, pero he podido comprobar que los campos de la tabla no incluyen las opciones "loadfromstream", ni "savetostream". Por ello, la forma que utilizo seguramente no podrás usarla con los componentes ADO. Bueno, desconozco para qué sirve el componente "TADOBlobStream" que viene con Delphi 2007 (no existe en Delphi 7) y quizás esa pueda ser la vía para resolver el problema que tienes. Desconozco cuales son tus necesidades y si es algo para tí o para una empresa, pero me atrevería a sugerirte que pienses en usar otra BD (como Firebird, que es gratuita y muy buena). Además, me parece que hay muchísima más documentación y componentes para acceder a Firebird desde Delphi que a Access. También creo que hay en este foro muchísimos más usuarios de Firebird que de Access; y eso suele influir en la ayuda que se recibe cuando hay una consulta al foro. Por ponerte un ejemplo sencillo y que tiene que ver con lo que comentas: casi todo le problema que tienes estaría resuelto si usaras un TDBImage (cosa que se puede hacer con Firebird, pero no con Access). Cita:
Saludos. |
Gracias por ser tan amable.
Verás, yo soy profe rural y toco la guitarra. Me hice una base de datos con los gráficos de los acordes. Así los cojo y los meto en la partitura (o Tab). en un plisplás. La base en DBE va como un tiro. Un día me dije:-¿Por qué no hacerla en Ado y emanciparse del BDE? Esa es la razón de usar ADO. En ello estoy. De Firebird oigo cosas. La verdad es que me gustaría usarlo. Pero no tengo ningún concepto claro. ¿Se puede usar en un sistema Cliente? ¿O sólo para redes Server? Si es un sistema dual y se pueden trabajar con gráficos, me pongo a ello enseguida. Gracias. A ver si me puedes aconsejar por dónde empezar con Firebird... Todo son alabanzas para ese sistema de gestión de bases de datos. |
Un TBlobStream, digamos, es un espacio de memoria en el que puedes guardar un campo de tabla Blob y manipularlo. Puedes recorrerlo y averiguar el formato por los bytes que contiene... Lo puedes meter en un TImage con su propiedad Grafic...
|
Firebird funciona como gestor de BD relacional de forma local o en red (tienes que instalarlo, lo que es muy fácil).
También funciona (sin instalarlo) como BD de escritorio (en el mismo ordenador) usando la opción 'Embedded'. Aunque creo que, para empezar, lo mejor es que lo instales y lo uses así hasta que tengas un poco de experiencia. He accedido a Firebird con los componentes IBX (Interbase Express) (Delphi 5 y 7) y me ha ido bastante bien. También están los componentes Zeos, aunque creo que hay menos documentación para iniciarse en su uso. Si te quieres iniciar con los componentes IBX, EN ESTA PÁGINA HAY MUCHOS MANUALES, aunque uno que te recomiendo por claro y sencillo es "Conexión a Firebird desde Delphi con componentes IBX" (en la página 9 las imágenes tienen un pequeño error: en el listbox de la derecha 'Update fields:' todos los campos deben estar seleccionados). También visita LA PÁGINA DE WIKIPEDIA SOBRE FIREBIRD, en ella hay enlaces a mucha información, algunos de estos enlaces incluyen artículos para iniciarse. Para gestionar las BD que vayas creando hay muchos programas. Uno de ellos es FLAMEROBIN. Para descargar Firebird lo puedes hacer DESDE ESTA PÁGINA. Espero que te sirva. Saludos. |
FireBird
Hola rrf. Me pongo a bajar el Firebird. La conexión falla, pero no importa. Ya me pongo en marcha. Te agradezco mucho tu información. No sabía que Firebird funcionara en uso local. Me imaginaba una cosa más compleja. Sigo sin poder pasar un campo Blob a un TImage. Por supuesto probé con TDBImage, pero sin éxito.
He probado con tu código. Se atasca en la línea: DSetBlobImag.SaveToStream(MS1); el DSetBlobImag no está predefinido. Un abrazo, JP |
Almacenar Ruta de Imagen y Luego Mostrar
Estimados:
El tema de guardar imagen en campo blob no es mi idea, lo que quiero es poder almacenar sólo la ruta... Es decir configurar para que en mi carpeta de proyecto exista una ruta ej: c:\Proyecto_Delphi\Ruta-Imagenes\ Cosa de que al momento de guardar la imagen, lo almacene en esa ruta y ver la posibilidad de que Firebird me guarde la URL... \Ruta-Imagenes\imagen01.jpg \Ruta-Imagenes\imagen02.jpg \Ruta-Imagenes\imagen03.jpg Se puede realizar todo ello ? Alguien nos ayuda? |
Se puede hacer.
Y, amigo, cuando te decidas definitivamente con lo que quieres hacer, si tienes algún problema entonces nos cuentas con detalle para que podamos ayudar. Cita:
No sé si has leído nuestra guía de estilo, no estaría mal que le echaras un vistazo ;) |
Cita:
Mira, en esa parte del código (DSetBlobImag.SaveToStream(MS1) ), "Dset" es el nombre del componente IBDataset, "BlobImag" es el nombre del campo blob que guardará la imagen. ¿Por qué están juntos y de donde salen?. Bueno, creo que se les llama campos virtuales o algo así. Pero lo importante es saber como se crean, pues son muy útiles. Me voy a apoyar en el manual que te mencioné en un mensaje anterior. Acabo de darme cuenta de que ese manual lo explica casi todo, pero creo que se olvida de este detalle tonto, que raramente aparece en algún manual para novatos. 0- Tienes que tener la BD creada. También la tabla en la que se encontrará el campo blob que guardará la imagen. 1- Firebird debe estar funcionando. 2- Tienes que tener el componente TIBDataBase que debe estar conectado con la BD. 3- También un componente TIBTransaction, que estará conectado con el TIBDataBase. 3- Insertas un componente TIBDataSet, lo conectas con el TIBDataBase y con el TIBTransaction. Luego, en la propiedad "SelectSQL" le escribes "Select * from Nombre_de_tu_tabla". 4- Haces doble clic sobre el componente TIBDataSet o haces clic sobre él con el botón derecho del ratón y selecciones "Fields editor...". Aparece una ventana pequeña. Sobre ella, haces clic con el botón derecho del ratón y clic sobre "Add all Fields". Aparecerán los nombres de todos los campos que definiste en la tabla. Puedes cerrar la ventana. La lista con los nombres de todos los campos creados aparecen, en el Unit, en la sección "Type" y (para el campo blob) será algo parecido a esto:
A partir de ese momento, en el código de tu programa podrás comprobar que si escribes el nombre "IBDataSet1Campo_IMAG". le pones un punto al final y esperas 1 segundo, el CodeInsight se podrá en marcha y te ofrecerá las opciones disponibles, como por ejemplo: "IBDataSet1Campo_IMAG.loadfromstream" Por supuesto, los nombres cambiarán en función de los que tú hayas definido. Esto es un complemento del manual que ya te recomendé en otro mensaje Cita:
Ten en cuenta que ese manual no incluye lo necesario para campos blob; pero explica muy bien otros muchos detalles que te serán imprescindibles (con o sin campos blob). Si me permites, te hago una sugerencia: sigue el manual paso a paso y, cuando lo hayas hecho todo y sepas hacerlo, empieza el proceso otra vez, pero añadiendo el campo blob. Luego podrás añadir el código que me decías que no te funcionaba, aunque posiblemente no te será necesario porque podrás usar los componentes TDBImage. Creo que el manual utiliza una BD llamada "Employee.fdb" que está en una de las campetas que parten de la carpeta "examples", que a su vez parte de la carpeta en la que hayas instalado Firebird. Espero que te sirva. ;) Saludos. |
Inicio con FireBird
Hola,
Ahora veo que tú usabas Firebird. Yo usaba componentes ADO. Justo lo que necesitaba. Me paso al Firebird rápidamente. Me has hecho un gran favor. Estaba realmente pegadol. Gracias. Voy guardando manuales para ir leyendo. Tengo una pregunta. ¿Siempre que se crea una tabla (con Firebird) se hace con Query? ¿Existen otras posibilidades? Muchísimas gracias. |
La franja horaria es GMT +2. Ahora son las 13:13:37. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi