none
Guardar un panel en la base de datos RRS feed

  • Pregunta

  • Hola a todos, bueno tengo lo siguiente, un panel, y dentro de este panel tengo muchos (digo muchos pq con mas de 200) controles, ademas q en tiempo de ejecucion el usuario pinta de diferentes colores los controles, ahora necesito guardar ese panel como lo ha dejado el usuario en la base de datos, he pensado y no se pueda en serializar ese control y guardarlo en binario...

    ahora lo otro, es q tengo un reporte en crystal reports el cual debe leer esos datos binarios y armar la imagen, lo q hago en el momento es q hago un copyfromscreen de ese panel, lo convientyo en image, lo guardo en el disco, luego desde sql hago una instrauccion y lo guardo en binario en la base de datos, el problema es q a veces falla... y creo q seria mas facil hacer todo eso desde mi aplicacion...

    agradezco la ayuda

    martes, 18 de mayo de 2010 20:57

Todas las respuestas

  • Un panel con 200 controles no es programación es más bien 'artesanía abstracta'... realmente habrá alguien que  sea capaz de manejar 200 controles en un único panel sin perderse ?. Si la respuesta es sí, dale un premio se lo merece y el programador (¿tú?) despídelo.

    Un panel a lo sumo debería tener 30-50 controles como mucho y esto suponiendo que hay varias instancias del mismo perfectamente ordenadas (alineadas, en tabla...) de lo contrario es un caos, un puxzzle, no una interfaz.

    Puesto que efectivamente serializar será difícil y costoso, lo mejor es que establezcas alertas para observar cambios de propiedades, así al final cuanto tengas que guardar podrás:

    Función guardarDatos del panel
      dim ruta as string 
      Ruta = ... 
      Crear y abrir un fichero temporal
      llamar a recorrido(elPanelCornucopia, ruta)
      si fichero temporal no está vacío
       leer el fichero
       guardarlo en la base de datos
      fin comprobar fichero  
    fin función
    
    Funcion Recorrido(control, ruta)
     Recorrer la colección de controles en el panel
      Este control si es un contenedor luego
        llamar a Recorrido(estecontrol,ruta)
      fin comprobar si es un contenedor
      llamar a buscarPropiedades(Estecontrol,ruta)
     fin bucle 
    fin función recorrido contenedor
     
    función RecorrerPropiedadesControl(control, ruta)
     dim dg as DatosAGuardar ' más abajo se describe la estructura 
     seleccionar tipo control
        si control = textbox luego
         si propiedad text cambió luego
          asignar datos a dg
          dg.GuardarDatos(ruta)
         si propiedad .... luego
          ...........
         .........
       si control = ..... luego
        .....................
          ................
       ...........
     fin seleccion
    fin función
    
    'las propiedades pueden guardarse en formato xml o por lo menos en una estructura con 4 campos, como la siguiente.
    
    Structura DatosAGuardar
     Nombrecontrol      tipo string
     NombrepropiedadCambiada  Tipo String
     número de Bytes del valor  Tipo integer
     Valor de la propiedad    Tipo byte o matriz de bytes
      
     funcion GuardarDatos(ruta)
       serializar estos datos y guardarlos al final del fichero.
     fin funcion 
    fin estructura

    El reporte en forma de imagen falla seguamente porque parte del contenido queda fuera de la pantalla, si tu copias desde la pantalla, obviamente lo que no esté visible no se guarda, esto incluye tanto lo que queda fuera de los márgenes de la ventana como los controles que pudieran estar debajo de otros así como las partes no mostradas como por ejemplo listas (de las que sólo aparecen una cantidad concreta de datos), tabuladores (sólo se ve laficha en primer plano), etc...

    Una posible solución sería, con los datos que has obtenido para ese fichero crear el reporte, pero ahora ordenado de forma útil (antes el orden de recorrido era en árbol según el contenedor, para guardar datos puede no tener mucha importancia, pero para un reporte deben guardar un orden que guarde coherencia.

    No se que tal programador seas, pero si te despiden es muy probable que te admitan en una picchería que es lo que parece ese panel que tienes... una pizza con trocitos de de todos los ingredientes conocidos...

    En fin bastante trabajo... yo que tu antes de nada reordenaría todo buscando puntos de semejanza y reagrupando contenido.

    miércoles, 26 de mayo de 2010 17:23
  • Hola, si claro q se q tener tantos controles no es bueno, pero el caso es el siguiente, tengo el el visualbasicpowerpack, para poder lineas mas facil, y dentro de mi panel tengo un odontograma, por si no sabes q es te comento, es uan representracion de la dentadura, en total debo dubijar maso o menos 52 dinetes, donde cada diente se compone de 7 superficies, y dentro de cada superficie debo poder marcar algo, ademas debo pdoer marcar tambien en todas las 7, es decri, un procedimiento puede estar asociado solo a una superficie, en este cado de pintar por ejemplo de rojo esa superficie, y ademas puedo tener otro procedimiento q me afecte a todo el diente, por lo cual pinto un simbolo q representa ese pro0cedimiento (esos son simbolos estandar para odontologia), es por eso q tengo tantos controles, q con las lineas dibujo todos mi dinetes y hago la division en superficies... luego con clases de draning pinto por ejemplos triangulos, circulos, relleno cierta parte, etc...

    y debo guardar esa imagen (con los dibujos creados) y mostrarlos en u reporte, yo guardo el mi base el diente, la supoerficie y el proceimdineto, pero como puedo dibujar eso en crystal?¡?

    Creo q asi me entiendes un poco mas

    miércoles, 26 de mayo de 2010 20:43
  • Lo que tendrías que hacer es un control  de usuario. Ese control debe definir un diente, tanto el dibujo como los efectos gráficos que apliques, luego sólo es cuestión de crear instancias de ese control, para cada diente o muela. Con lo que el trabajo se simplifica porque de una forma más o menos elemental es hacer lo mismo a cada pieza dental pero donde cada tiene valores específicos para las propiedades.

    Del mismo modo para ese control defines guardar a base de datos y por tanto sería mucho más sencillo y ordenado.

    Luego si ya sabes como capturar la imagen y tu duda es ahora como regenerarla en el reporte desde la BD, dame tiempo y mañana te lo pongo (lleva bastante rato y aquí ya es medianoche).

     

    miércoles, 26 de mayo de 2010 21:59
  • ok gracias, eres muy amable, voy a comenzar a hacer el control de usuario, pq los q  he trabajado han sido relativamente basisos, y este me parece mucho mas complejo... cualquier ayuda extra es bien recibida
    miércoles, 26 de mayo de 2010 22:22
  • Otra cosa que puedes hacer es grabar cada una de las imágenes como archivos en alguna ubicación de tu conveniencia y en el servidor simplemente un enlace a la imagen mediante el nombre para que después la puedas recuperar, la verdad, no soy muy amigo de grabar "Blobs" en el servidor ya que puede volver muy grande la base de datos.

     

    Cordial saludo,


    Mauricio Atanache G.
    jueves, 27 de mayo de 2010 5:12
  • Hola, en el momento lo guardo en mi base de datos en formato binario, el problema es q si lo guardo la iagen en el servidro, serian muchas imagenes, pq por dia puedo estar guardando un promedio de 20 - 40 imagenes o mas, y no puedo llegar a borrar ninguna con el paso del tiempo (cuestiones legales), es por eso q loas guardo en formato binario en mi base de datos
    viernes, 28 de mayo de 2010 13:52