• Viernes 1 de Noviembre de 2024, 15:29

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - kolroff o_O)

Páginas: [1]
1
C# / Re: imageList y bd access
« en: Jueves 10 de Marzo de 2011, 11:50 »
Buenos días, voy a intentar guiarte un poco en lo que deberías hacer, escribirte el código completo sería una locura, pero creo que esto podrá ayudarte

Lo primero definirte el acceso a la BD, para ello dentro de la capa de persistencia podrías crearte una clase "AccesoBD" por ejemplo:
Código: C#
  1.     
  2.  
  3. class AccesoBD
  4.     {
  5.         //Métod que abre la conexión y devuelve un objeto OleDbConnection
  6.         private static OleDbConnection conectar()
  7.         {
  8.             OleDbConnection cnn = new System.Data.OleDb.OleDbConnection();
  9.             //Si usas Access inferior a 2007
  10.             //string cadenaConexion = @"PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" + "/*---AQUI LA RUTA+EL NOMBRE DE TU BD---*/.mdb";
  11.  
  12.             //Si usas Access 2007 o superior
  13.             string cadenaConexion = @"PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=" + "/*---AQUI LA RUTA+EL NOMBRE DE TU BD---*/.accdb";
  14.             cnn.ConnectionString = cadenaConexion;
  15.             cnn.Open();
  16.             return cnn;
  17.         }
  18.       
  19.       //Método que recupera las imágenes de la BD y las almacena en un imageList
  20.         public imageList rellenaImageList()
  21.         {  
  22.             //Definimos el imageList que vamos a llenar de imágenes
  23.             ImageList listaImágenes = new imageList();
  24.             //Aqui debes escribir tu sentencia SQL según tengas la BD creada
  25.             String strSQL = "SELECT campoImagen FROM TablaImagenes";
  26.  
  27.             OleDbConnection cnn = conectar();
  28.             OleDbCommand sentencia = new OleDbCommand(strSQL, cnn);
  29.             OleDbDataReader objReader = sentencia.ExecuteReader();
  30.  
  31.             while (objReader.Read())
  32.             {  
  33.                 MemoryStream ms=new MemoryStream();
  34.                 //recupero el array de bytes que forman la imagen
  35.                 byte[] imgByte=(byte[])(objReader[0]);
  36.                 ms.Write(imgByte, 0, imgByte.GetUpperBound(0)+1);
  37.  
  38.                 //Añado al imageList la imagen recuperada y convertida
  39.                 listaImagenes.Images.Add(System.Drawing.Image.FromStream(ms)
  40.                 ms.Close();                                                
  41.  
  42.             }
  43.             objReader.Close();
  44.             cnn.Close();
  45.  
  46.             //Devuelvo el imageList con las imágenes almacenadas
  47.             return listaImagenes;
  48.         }
  49.  
  50.  
  51.  
  52.  

Espero que te sirva de ayuda, es posible que tenga errores ya que no lo he probado.
busca información sobre las clases ImageList y MemoryStream para modificar los valores de las imágenes almacenadas en el imageList (tamaño, color...)

Un saludo,
Víctor.

2
C# / Re: Hilos e Imagelist
« en: Lunes 6 de Diciembre de 2010, 12:32 »
Al final lo resolví sustituyendo el ImageList por una lista de imágenes (List<Image>), reduciendo el tamañano de las imágenes almacenadas en la lista.

3
C# / Hilos e Imagelist
« en: Jueves 28 de Octubre de 2010, 09:44 »
Hola a tod@s!!!

estoy haciendo una aplicación en C# la cual es un muestrario de productos (imagen y descripción), debo mostrar gran cantidad de productos (unos 500) en el menor tiempo posible. Para ello decidí cargar todas las imágenes de los productos en un ImageList para manejarlos más rápidamente ( a lo mejor es una locura lo que estoy diciendo, porque puede que consuma demasiados recursos).

Para no tener que esperar a que carguen todas las imágenes en el ImageList, decidí lanzar esa tarea en un hilo a parte, así la ejecución del programa principal no se vería bloqueda.

Pues bien, mi problema es el siguente:

 - CASO 1: si comienzo a visualizar los productos desde el programa principal (hilo pricipal) antes de que el hilo secundario haya terminado de cargarlos todos en el ImageList, empiezo a observar que no ha cargado los productos en el orden correcto (según los va recuperando de la BD), hay algunos productos intercalados alterando el orden natural de la secuencia. Además compruebo que en cada ejecucíon el orden varía, no es siemrpe el mismo.

 - CASO 2: si espero a que el hilo secundario termine de cargar todos los productos en el ImageList antes de empezar a mostrarlos en el hilo principal, una vez finalizada la carga, el hilo principal se bloquea (de hecho casi todo el ordenador se bloquea), si lo dejo un rato vuelve a responder toscamente, puede ser debido que son muchas imágenes las que manipula. Sin embargo en el CASO 1 el programa NO SE BLOQUEA y está gestionando el mismo volumen de datos.

Dejo el código a continuación


Código: C#
  1. //Clase secundaria que recupera las imágenes de la BD
  2. //y las almacena en un ImageList
  3. class RellenarImagenes
  4.     {
  5.         private ImageList im;
  6.         //Constructor
  7.         public RellenarImagenes()
  8.         {
  9.             im = new ImageList();
  10.             this.im.ColorDepth = System.Windows.Forms.ColorDepth.Depth32Bit;
  11.             this.im.ImageSize = new System.Drawing.Size(256, 150);
  12.             this.im.TransparentColor = System.Drawing.Color.Transparent;
  13.         }
  14.          //Devuelve el ImageList
  15.          public ImageList devuelveImageList()
  16.         {
  17.             return this.im;
  18.         }
  19.        
  20.         //Rellena el ImageList con las fotos de los productos de la BD
  21.         public void rellenaImageList()
  22.         {
  23.            
  24.             String strSQL = "SELECT * FROM xxxImagenes";
  25.             OleDbConnection cnn = new OleDbConnection();
  26.             cnn.ConnectionString = cadenaConexion;
  27.             cnn.Open();
  28.             OleDbCommand sentencia = new OleDbCommand(strSQL, cnn);
  29.             OleDbDataReader objReader = sentencia.ExecuteReader();
  30.  
  31.             while (objReader.Read())
  32.             {
  33.                 Image imagen = new Bitmap(objReader[1].ToString());
  34.                 im.Images.Add(imagen);
  35.             }
  36.            
  37.         }
  38.     }//Fin Clase RellenarImagenes
  39.  
  40.  
  41. //Este metodo se encuentra dentro de la clase principal, es el que crea el
  42. //hilo secundario para llamar al metodo de rescatar las imagenes de la BD y
  43. //meterlas en el el ImageList
  44.         private void cargaImageList()
  45.         {
  46.             //Instanciamos la clase
  47.             RellenarImagenes ri = new RellenarImagenes();
  48.             //Asignamos el ImageList devuelto a el atributo ImageList de la
  49.             //clase principal.
  50.             this.imageList1 = ri.devuelveImageList();
  51.             //Lanzamos el nuevo hilo.
  52.             Thread th = new Thread(new ThreadStart(ri.rellenaImageList));
  53.             th.Start();
  54.         }
  55.  


No se que hacer para que me muestre las imagenes en el orden correcto, a lo mejor eso de cargar todas las imagenes de golpe en un ImageList es una mala soloción.

Muchas Gracias por anticipado, a lo mejor es un poco lioso, si algo no entienden, no duden en preguntar.

Páginas: [1]