Grabar imágenes desde Visual Basic a Access
Necesito saber como puedo cargar imágenes a una tabla access con un campo ole, desde visual basic. ¿Se puede usar un data para hacerlo?.
La imagen en visual la tengo en un contenedor ole.
La imagen en visual la tengo en un contenedor ole.
1 respuesta
Respuesta de ifuvaldes
1
1
En efecto, la tabla Access tiene que tener un campo de tipo OLE.
Respecto del control de Visual Basic, yo siempre he utilizado un Image. Supongo que con un Contenedor Ole puede funcionar, pero no lo he probado.
En efecto es tan fácil como poner un control Data con las propiedades DatabaseName y RecordSource apuntando respectivamente a la base de datos y a la tabla, y asignar las propiedades Data Source del Image al control Data y la propiedad DataField al campo de la tabla
El control inmage puede no ser visible, y puedes llenarlo durante la ejecución con instrucciones como por ejemplo
Image1.Picture = Picture3.Image
Ponde Picture3 es un Picxturebox donde se generado la imagen.
Suerte :-)
Respecto del control de Visual Basic, yo siempre he utilizado un Image. Supongo que con un Contenedor Ole puede funcionar, pero no lo he probado.
En efecto es tan fácil como poner un control Data con las propiedades DatabaseName y RecordSource apuntando respectivamente a la base de datos y a la tabla, y asignar las propiedades Data Source del Image al control Data y la propiedad DataField al campo de la tabla
El control inmage puede no ser visible, y puedes llenarlo durante la ejecución con instrucciones como por ejemplo
Image1.Picture = Picture3.Image
Ponde Picture3 es un Picxturebox donde se generado la imagen.
Suerte :-)
Mucha gracias por contestarme, pero ya había enganchado la tabla con el data y con el contenedor ole, o con un image, da lo mismo, es decir, si cargo desde el access las imágenes, luego las manipulo desde visual, pero yo quiero cargar imágenes asignadas a un image a la tabla, es decir:
Data1.Recordset("imagen1") = Image1.Picture
Data1.Recordset.Update
Y siempre me da error de conversión de tipo de datos.
La tabla access tiene un campo ole, por eso lo intente con un contenedor ole, pero nada, no se donde puede estar el error. Mil Gracias por tu ayuda
Data1.Recordset("imagen1") = Image1.Picture
Data1.Recordset.Update
Y siempre me da error de conversión de tipo de datos.
La tabla access tiene un campo ole, por eso lo intente con un contenedor ole, pero nada, no se donde puede estar el error. Mil Gracias por tu ayuda
Yo creo que te estás complicando la vida innecesariamente. Si tienes el control data conectado con la tabla y con el control image, no necesitas una instrucción como
data1.recordset("Imagen")=Image1.picture
Porque eso ya lo hace automáticamente el control Data, Es decir si modificas la imagen y luego cambias de registro o cierras el formulario, el control Data actualizará el dato "Imagen" de tu tabla de forma automática.
Desde luego que la instrucción
data1.recordset("Imagen")=Image1.picture
Te va a dar siempre un error. La razón es que el contenido de la imagen hay que convertirlo a lo que Access llama datos binarios largos. Para hacer esta conversión hay que utilizar el método AppendChunk. Si quieres darte un buen susto, mírate la ayuda de este método, Pero insisto, no lo necesitas, El control Data te lo da hecho.
Suerte :-)
data1.recordset("Imagen")=Image1.picture
Porque eso ya lo hace automáticamente el control Data, Es decir si modificas la imagen y luego cambias de registro o cierras el formulario, el control Data actualizará el dato "Imagen" de tu tabla de forma automática.
Desde luego que la instrucción
data1.recordset("Imagen")=Image1.picture
Te va a dar siempre un error. La razón es que el contenido de la imagen hay que convertirlo a lo que Access llama datos binarios largos. Para hacer esta conversión hay que utilizar el método AppendChunk. Si quieres darte un buen susto, mírate la ayuda de este método, Pero insisto, no lo necesitas, El control Data te lo da hecho.
Suerte :-)
Ante todo mil gracias por tu paciencia, voy a concretarte más a fondo lo que necesito. Tengo que poder imprimir desde Crystal Report imágenes de etiquetas de composición de prendas, por lo que necesito que los datos de imágenes estén en una tabla access, para que el crystal lo imprima necesito que sean de tipo mapa de bits, porque como binario largo no me aparece nada. Es decir, tengo una imágenes .bmp y las tengo que cargar en access de forma mapa de bits. ¿Hay otra forma? Muchas Gracias
Lo estás haciendo bien:
Simplemente es tener el control Data asinado a la tabla de Access y el control Image asociado al dato que contiene la imagen en la tabla.
Hecho esto, tienes que ver en el control Image, la imagen que tiene cada registro de la tabla, y que cambiará según recorres la tabla. ¿Te funciona esto? Te repito que es muy sencillo de modo que si no te funciona es porque pones demasiadas instrucciones, como las
Data1.Recordset("imagen1") = Image1.Picture
Data1.Recordset.Update
Que me decías.
Esto te tiene que funcionar antes de pasar intentar imprimir las imágenes
Otra cosa, es cómo conseguir que Crystal Reports imprima esa imágenes.
Lo primero: ¿De verdad necesitas Crystal Reports? No se que clase de impresión necesitas, pero si no es más que imprimir las imágenes, te sobra completamente el Crystal Reports, que como su nombre indica es para hacer "Reports" y el tema de las imágenes está un poco metido a la fuerza.
¿Has probado a imprimir con Printer?
A lo mejor una instrucción tan simple como
Printer. PaintPicture Image1.picture ...
Te resuelve toda la impresión de una forma mucho más sencilla que el Crystal.
Mirate la ayuda de este método. Estoy casi seguro que tienes todo lo que necesitas.
No te preocupes por preguntar. Al revés: lo que molesta es dedicar un tiempo a contestar una pregunta y que no te digan siquiera si han leído la respuesta.
Suerte :-)
Simplemente es tener el control Data asinado a la tabla de Access y el control Image asociado al dato que contiene la imagen en la tabla.
Hecho esto, tienes que ver en el control Image, la imagen que tiene cada registro de la tabla, y que cambiará según recorres la tabla. ¿Te funciona esto? Te repito que es muy sencillo de modo que si no te funciona es porque pones demasiadas instrucciones, como las
Data1.Recordset("imagen1") = Image1.Picture
Data1.Recordset.Update
Que me decías.
Esto te tiene que funcionar antes de pasar intentar imprimir las imágenes
Otra cosa, es cómo conseguir que Crystal Reports imprima esa imágenes.
Lo primero: ¿De verdad necesitas Crystal Reports? No se que clase de impresión necesitas, pero si no es más que imprimir las imágenes, te sobra completamente el Crystal Reports, que como su nombre indica es para hacer "Reports" y el tema de las imágenes está un poco metido a la fuerza.
¿Has probado a imprimir con Printer?
A lo mejor una instrucción tan simple como
Printer. PaintPicture Image1.picture ...
Te resuelve toda la impresión de una forma mucho más sencilla que el Crystal.
Mirate la ayuda de este método. Estoy casi seguro que tienes todo lo que necesitas.
No te preocupes por preguntar. Al revés: lo que molesta es dedicar un tiempo a contestar una pregunta y que no te digan siquiera si han leído la respuesta.
Suerte :-)
Es genial que alguien te escuche, muchas gracias.
En respuesta a tu pregunta, si tengo enlazado el data con la tabla y puedo ver las imágenes cargándolas en un image.
La necesidad de usar el Crsytal Report es porque necesito imprimir las imágenes en etiquetas con unas dimensiones determinadas y con una salida por página especificada (ej, 40x24 salida de 4).
Voy a echar un vistazo al print a ver si se puede especificar esto.
De todas formas...
Si desde access directamente puedo meter imágenes como mapa de bits y verlas desde visual a través de un data,
¿No crees que viceversa debería de poderse hacer? quizás definiendola, no se.
Muchas gracias anticipadas
En respuesta a tu pregunta, si tengo enlazado el data con la tabla y puedo ver las imágenes cargándolas en un image.
La necesidad de usar el Crsytal Report es porque necesito imprimir las imágenes en etiquetas con unas dimensiones determinadas y con una salida por página especificada (ej, 40x24 salida de 4).
Voy a echar un vistazo al print a ver si se puede especificar esto.
De todas formas...
Si desde access directamente puedo meter imágenes como mapa de bits y verlas desde visual a través de un data,
¿No crees que viceversa debería de poderse hacer? quizás definiendola, no se.
Muchas gracias anticipadas
Por supuesto que puedes guardar imágenes en la tabla de Access. Si estando en un registro determinado, y por lo tanto con el control Image visualizando la imagen guardada en ese registro (o nada, si el registro es nuevo o no tenía imagen), tu cambias la imagen de ese control Image desde tu programa, la nueva imagen pasa al campo de la tabla en cuanto se actualice el registro, esto es, en cuanto cambia el registro activo o se cierra el formulario sin que tengas nada que hacer nada para ello.
Otra cosa es cómo cambiar o rellenar el contenido de un Image durante la ejecución del programa. Depende de cual sea el origen de la imagen que quieres grabar. Podría ser un scanner, o leerla desde un archivo BMP, puede ser dibujada mediante instrucciones de dibujo... o generada por un programa "artista"
En el caso más sencillo, si la imagen está en un archivo "Bmp" la puedes meter en el Image con una instruccuón como
Set Image1.Picture = LoadPicture("FIESTA.BMP")
En otros casos la imagen se ha formado en otro control Image o en un control Picture. En ese caso se haría:
set Image1.Picture=Picture1.Image
A veces hay problemas con el formato de las imágenes, pero si tienes ese problema, un buen truco puede ser usar el portapapeles.
Haciendo Set Image.Picture = Clipboard.GetData()
Cargas una imagen desde el portapapeles al control Image. Como todos los controles de imagen que yo conozco permiten pasar imágenes al portapapeles este truco soluciona muchas veces las incompatibilidades de formato
Suerte :-)
Otra cosa es cómo cambiar o rellenar el contenido de un Image durante la ejecución del programa. Depende de cual sea el origen de la imagen que quieres grabar. Podría ser un scanner, o leerla desde un archivo BMP, puede ser dibujada mediante instrucciones de dibujo... o generada por un programa "artista"
En el caso más sencillo, si la imagen está en un archivo "Bmp" la puedes meter en el Image con una instruccuón como
Set Image1.Picture = LoadPicture("FIESTA.BMP")
En otros casos la imagen se ha formado en otro control Image o en un control Picture. En ese caso se haría:
set Image1.Picture=Picture1.Image
A veces hay problemas con el formato de las imágenes, pero si tienes ese problema, un buen truco puede ser usar el portapapeles.
Haciendo Set Image.Picture = Clipboard.GetData()
Cargas una imagen desde el portapapeles al control Image. Como todos los controles de imagen que yo conozco permiten pasar imágenes al portapapeles este truco soluciona muchas veces las incompatibilidades de formato
Suerte :-)
Esta mañana he contestado otra pregunta acerca del objeto Printer. Como creo que te vendrá también bien esta información te pego la respuesta a continuación
>>>>
Tienes que emplear el objeto "Printer" que representa la hoja de impresora.
En primer lugar ajusta las propiedades del objeto Printer a las de la hoja sobre las que vas a imprimir:
Por ejemplo:
Printer.PaperSize=9 te ´define el tamaño de hoja DIN A4
Printer.Orientation=2 te sitúa la hoja apaisada (el valor 1 es para hoja vertica)
... etc.
Luego yo suelo poner:
Printer.ScaleMode=6
Esto hace que se utilice un sistema de coordenadas en la hoja en milímetros con la por creciendo hacia la derecha y la y hacia abajo partiendo de la esquina superior izquierda
Ya ya estás list@ para imprimir.
Para imprimir un texto tienes un montón de propiedades que hacen referencia al estilo de escritura Por ejemplo
Printer. Fontname
Printer. Fontsize
Printer. FontBold
Printer. FontItalic
...
Puedes ir cambiando estas propiedades antes de imprimir cada texto, con lo cual cada texto puede tener un tipo de letra, tamaño, etc distinto.
También puedes variar el color de cada texto.
Cuando vayas a imprimir un texto, primero sitúas las coordenadas con:
Printer.Currentx=
Printer.Currenty=
Dando los valores que desees a estos datos y luego imprimes el texto con:
Printer.print <Texto>
Donde <Texto> puede ser una cadena de texto, una variable que contenga texto, o una referencia al texto de un control
En cuanto al tema de imágenes, la forma de imprimirlas es haciendo
Printer. PaintPicture imagen, x1, y1, ancho1, alto1, x2, y2, ancho2, alto2, código_op
Donde Imagen es la imagen a imprimir (normalmente la imagen se pone en un control Picture y este dato es la propiedad Image de ese control), y por e y las coordenadas donde se va a imprimir Tienes además un montón de parámetros para cambiar la escala, recortar la imagen etc.
Y aunque no lo mencionas, también puedes dibujar con
Printer. Line ...
Printer. Circle...
Cuando hayas terminado con una hoja ejecutas:
Printer. NewPage
Y empezará a imprimir otra hoja, y así sucesivamente hasta que hagas:
Printer. EndDoc
Solo en ese momento la impresora recibirá el documento y lo imprimirá.
Hay muchas instrucciones más. Mírate la ayuda del objeto Printer.
Yo lo he usado muchísimo, es potentísimo, y los resultados son perfectos, a nivel de calidad para imprenta, incluso con imágenes fotográficas. Si ves que no puedes hacer algo, pregúntamelo porque segurammente yo tengo resuelto el tema o tengo algún truco
Si tienes cualquier tipo de dudas no dudes en volver a preguntar, aunque ahora me voy unos días de vacaciones.
Suerte :-)
<<<<<
>>>>
Tienes que emplear el objeto "Printer" que representa la hoja de impresora.
En primer lugar ajusta las propiedades del objeto Printer a las de la hoja sobre las que vas a imprimir:
Por ejemplo:
Printer.PaperSize=9 te ´define el tamaño de hoja DIN A4
Printer.Orientation=2 te sitúa la hoja apaisada (el valor 1 es para hoja vertica)
... etc.
Luego yo suelo poner:
Printer.ScaleMode=6
Esto hace que se utilice un sistema de coordenadas en la hoja en milímetros con la por creciendo hacia la derecha y la y hacia abajo partiendo de la esquina superior izquierda
Ya ya estás list@ para imprimir.
Para imprimir un texto tienes un montón de propiedades que hacen referencia al estilo de escritura Por ejemplo
Printer. Fontname
Printer. Fontsize
Printer. FontBold
Printer. FontItalic
...
Puedes ir cambiando estas propiedades antes de imprimir cada texto, con lo cual cada texto puede tener un tipo de letra, tamaño, etc distinto.
También puedes variar el color de cada texto.
Cuando vayas a imprimir un texto, primero sitúas las coordenadas con:
Printer.Currentx=
Printer.Currenty=
Dando los valores que desees a estos datos y luego imprimes el texto con:
Printer.print <Texto>
Donde <Texto> puede ser una cadena de texto, una variable que contenga texto, o una referencia al texto de un control
En cuanto al tema de imágenes, la forma de imprimirlas es haciendo
Printer. PaintPicture imagen, x1, y1, ancho1, alto1, x2, y2, ancho2, alto2, código_op
Donde Imagen es la imagen a imprimir (normalmente la imagen se pone en un control Picture y este dato es la propiedad Image de ese control), y por e y las coordenadas donde se va a imprimir Tienes además un montón de parámetros para cambiar la escala, recortar la imagen etc.
Y aunque no lo mencionas, también puedes dibujar con
Printer. Line ...
Printer. Circle...
Cuando hayas terminado con una hoja ejecutas:
Printer. NewPage
Y empezará a imprimir otra hoja, y así sucesivamente hasta que hagas:
Printer. EndDoc
Solo en ese momento la impresora recibirá el documento y lo imprimirá.
Hay muchas instrucciones más. Mírate la ayuda del objeto Printer.
Yo lo he usado muchísimo, es potentísimo, y los resultados son perfectos, a nivel de calidad para imprenta, incluso con imágenes fotográficas. Si ves que no puedes hacer algo, pregúntamelo porque segurammente yo tengo resuelto el tema o tengo algún truco
Si tienes cualquier tipo de dudas no dudes en volver a preguntar, aunque ahora me voy unos días de vacaciones.
Suerte :-)
<<<<<
- Compartir respuesta
- Anónimo
ahora mismo