TPanelMiniaturas (primera versión v1.1110)

Para los programadores que trabajamos habitualmente solos, y ese ha sido mi caso durante algunos años, resulta verdaderamente agradable iniciar cualquiera de las actividades o colaboraciones que te permiten salirte del rutinario aislamiento o soledad. Es complicado no poder compartir con otras personas algunas inquietudes del día a día, por decir algo, o que las cosas haya que hacerlas de determinada forma y no de otra, porque realmente muchos de los que te rodean ignoran lo que haces, y ni siquiera lo comprenden, y te ven como el individuo que está encerrado en una habitación con varios servidores, como si uno fuera un domador y se encerrara en la función diaria con sus fieras. 🙂

Así que si ha sido también vuestro caso, podréis entender que sin ningún motivo realmente importante le comentara a Neftalí la idea de crear un componente. La idea… ¡divertirse!… ¡claro!… divertirse y aprender. El artículo que planteaba la creación de las miniaturas en tiempo de ejecución era una buena excusa :-D. Y con el blog pasa algo parecido, que acaban siendo ventanas hacia el exterior, buscando aire fresco e ideas que nos hagan salir de la rutina y nos motiven. Si hay algo que he aprendido durante estos años, es que el trabajo en equipo es la primera piedra del aprendizaje y que siempre se nos pega algo, bueno o malo, de la persona con la que has compartido algo.

Ha sido muy enriquecedor colaborar con Germán, por diversos motivos, entre los cuales quisiera resaltar su profesionalidad, ya que cuando uno es capaz de tomarse con seriedad y respeto las cosas pequeñas, como puedan ser las cuatro lineas que hemos implementado para el componente, también lo hará con los proyectos de envergadura. Y eso siempre ha sido algo que valoré desde que me conozco. No hay clientes pequeños o grandes, ni proyectos grandes ni pequeños. Quien no es capaz de tratar con respeto a un cliente pequeño tampoco lo hará a uno grande y quién no sabe abordar de forma profesional un proyecto pequeño tampoco lo hará en uno grande. Esas milongas de quien dice: ¡tranquilo que cuando esto sea grande lo haré mejor son solo eso… milongas!  🙂

En fin… He disfrutado mucho estas ultimas semanas colaborando con Neftalí.

No voy a extenderme mucho mas, ya que la idea es que sirva de excusa para generar nuevas entradas, muchas de ellas a través de facebook, medio al que estoy ahora mismo dando prioridad sobre el blog, de forma que podamos tener a través de facebook y twitter el día a día y reservar las entradas propiamente dichas al blog de Delphi Básico.

Estas son las rutas al componente y a la demo que hemos preparado para que veais en acción a nuestra fiera.

;-D

Germán estaba preocupado de que la demo fuera lo mas completa y ha puesto mucho interés en que además tuviera una apariencia lo mas agradable posible.

Sources TPanelMiniaturas

imagen_componente

Demo EXE TPanelMiniaturas

demo_tpanelminiaturas

Faltan muchas cosas todavía que revisar y otras funcionalidades que implementar. Y para que veais un poco como lo hemos vivido, os he añadido una tabla que representa la evolución de cambios en el componente. Estás anotaciones existen en el código fuente pero de forma adicional le propuse a Germán mantener un registro de cambios accesible desde cualquier lugar por lo que los ubicamos en una de las base de datos de mi servidor, de forma que pudiera ser consultada por ambos.

Esta es la tabla:

! Tarea Fecha
Solicitud
Tipo Solicitado por Notas Hecho
TPanelMiniaturas
Recuperación resumen bugs y mejoras pendientes proxima versión Resumen bugs pendientes y mejoras. X
11/11/2010 Gestiones Admon VERSION 2011.11.10
Mascara protección anticopia Añadir mascara tipo imagen y propiedad activación a nivel de panel y contenedor
11/11/2010 Nueva PROX. VERSION
Funcionalidad Rotar Imagen Display 11/11/2010 Nueva
Activacion multiples filas y/o columnas de miniaturas
11/11/2010 Nueva PROX. VERSION
Funcionalidad Invertir Imagen Display 11/11/2010 Nueva Funcionalidad invertir la imagen.
Separacion de las constantes en un modulo independiente Seria conveniente separar las constantes en una unidad independiente
10/11/2010 Mejora
Funcionalidad Mover paneles Se desea poder en tiempo de ejcucion la posicion de los paneles. Nota: Ya existe en miniaturas.
10/11/2010 Nueva PROX. VERSION
Detectado problema persistencia Evaluar problema persistencia diseño con extensiones jpeg, gif
10/11/2010 Arreglar fallo PROX. VERSION
Evaluar diseño correcto ascendencia TPanelMiniaturas ¿Se ha elegido correctamente el ascendiente de TPanelMiniaturas?
10/11/2010 Mejora PROX. VERSION
Copiar y pegar imagenes desde Portapapeles Añadir una imagen desde el portapapeles.
10/11/2010 Nueva PROX. VERSION
Evaluar cambios en diseño componente por imagenes de gran tamaño
10/11/2010 Mejora
Evaluar el uso de hilos de ejecucion 10/11/2010 Mejora
Funcionalidad seleccion multiple Uso de la propiedad MultipleSelection para acciones en bloque
10/11/2010 Nueva
Funcionalidad Miniatura con ancho y alto variable Ampliar la limitacion de ancho fijo en la miniatura
10/11/2010 Mejora
Añadido evento ONCHANGE Añadido evento OnChange para cambio panel activo X
10/11/2010 Mejora VERSION 2011.11.10
Integración timer en componente Integrado timer para rotaciones automáticas. Añade propiedades Animate y AnimateInterval. X
10/11/2010 Mejora VERSION 2011.11.10
Funcionalidad eliminar panel 10/11/2010 Nueva VERSION 2011.11.10 procedimiento DELETEPANEL X
Cambio parámetros procedimiento ADDIMAGESFROMFOLDER Los parámetros no era definitivos y se revisan X
10/11/2010 Mejora VERSION 2011.11.10
Correccion bug procedimiento SETTEXT. Detectado loop en tiempo de ejecución X
10/11/2010 Arreglar fallo VERSION 2011.11.10
Propiedades ASSOCIATEDIMAGE Y ASSOCIATEDTEXT Permitiran asociar un componente externo para el display y el texto. X
10/11/2010 Nueva VERSION 2011.11.10
Funcionalidad arrastrar ficheros desde EXPLORADOR WINDOWS Permitir arrastrar ficheros desde explorador. Mas funcionalidad y utilidad para el componente X
09/11/2010 Nueva VERSION 2011.11.9
Correccion Metodo NEXT Si Itemindex = -1 decidir que hará next. Se ha tenido en cuenta estetica y se han hecho pruebas. X
09/11/2010 Arreglar fallo VERSION 2011.11.9
Ampliada funcionalidad arrastre ficheros a directorios Se amplia el arrastre de carpetas dentro del arrastre de ficheros X
09/11/2010 Mejora VERSION 2011.11.9
Propiedad SELECTIONCOLOR Y SELECTIONTYPE Reorganizacion propiedades que afectan al foco X
09/11/2010 Nueva VERSION 2011.11.9
Corrección situacion panel con respecto al scroll Añadido calculo para reubicación X
09/11/2010 Arreglar fallo VERSION 2011.11.8
Propiedad AUTOSLIDE Permite que el componente miniaturas se mueva de forma dinamica con el scroll X
08/11/2010 Nueva VERSION 2011.11.8
Liberar memoria an la seleccion visual de miniaturas Reparado bug por prevención de memoria no liberada X
08/11/2010 Arreglar fallo VERSION 2011.11.8
Correccion Procedures SELECCIONAITEM y DOCLICKPANEL Añadido codigo para no ejecutar si no ha cambiado indice. X
08/11/2010 Arreglar fallo VERSION 2011.11.8
Doble buffer Mejora en la eliminación del parpadeo X
08/11/2010 Nueva VERSION 2011.11.8
Funcionalidad resaltar foco Rutinas graficas para resaltar foco. Añadida propiedad TIPOSELECCION para gestionar tipo resalte. X
05/11/2010 Nueva VERSION 2011.11.5
Correccion Funcionalidad Metodo Click panel Se redefine el procedimiento DoClickPanel para no anular el evento. X
05/11/2010 Mejora VERSION 2011.11.5
Correccion Propiedad SETINDEXSELECTION No saltaba método. Se cambia asignacion. Ver comentarios en unidad componente. X
05/11/2010 Arreglar fallo VERSION 2011.11.5
Propiedad ITEMINDEX (gestiona foco y navegación) Esta propiedad es requerida en multiples areas. X
03/11/2010 Nueva VERSION 2011.11.3
Funcionalidad navegacion (FIRST, PRIOR, NEXT Y LAST) Procedimientos de navegacion sobre miniaturas. X
03/11/2010 Nueva VERSION 2011.11.3
Correccion lineas ADDPANEL Son eliminadas lineas redundantes que ya eran invocadas en UpdatePanels X
03/11/2010 Arreglar fallo VERSION 2011.11.3
Metodo GETCLIENTHEIGHTPANEL para calculo del Height del Panel Calculo correcto del ancho del panel. Adicion constantes margenes. X
03/11/2010 Mejora VERSION 2011.11.3
Metodos ADDIMAGESFROMFOLDER, ADDIMAGESFROMFILE Y CLEARIMAGES Nuevas funcionalidades para version release componente. X
03/11/2010 Nueva VERSION 2011.11.3
Primer borrador estructura componente Primer borrador componente para discusión X
29/10/2010 Nueva VERSION 2011.11.1
Funcionalidad Grafica Componente Ampliacion funcionalidad base metodo PAINT X
29/10/2010 Nueva VERSION 2010.11.1
Discusion diseño COMPONENTE Discusion preliminar sobre diseño proyecto y componente. Objetivos. Requerimientos, etc… X
29/10/2010 Gestiones Admon VERSION 2010.11.1
Demo Visor Imagenes
Finalizar depuracion previo al release primera version Ultimas revisiones demo previas a la primera release X
10/11/2010 Arreglar fallo VERSION 2011.11.10
Documentacion TPanelMiniaturas
Tarea elaboracion primera documentación 10/11/2010 Nueva VERSION 2011.11.10 X
Añadida primera documentación al componente X
05/11/2010 Nueva VERSION 2011.11.5
TPanelImagen
Propiedades INDEXSELECTION y MULTIPLESELECTION Funcionalidad base selección foco en componente. Creacion del índice de referencia.Ver documentación X
03/11/2010 Nueva VERSION 2011.11.3
TPanelMiniaturas Diseño
Menu contextual para edición colecciones Integración edición colección con IDE X
06/11/2010 Nueva VERSION 2011.11.10

Cualquier comentario, propuesta de mejora, será siempre bienvenida. Así como si quisierais participar y compartir la experiencia con nosotros. 🙂

Bueno. Nada mas. Seguid las entradas que vaya publicando Neftalí desde su blog porque son verdaderamente interesantes. Tanto el como yo, iremos complementando la información sucesivamente.

Ahhh… un comentario que olvidaba. En la tabla que os he incluido, figuran las versiones numeradas por la fecha. Finalmente, con la que es la release, decidimos que siguiera otra pauta y cambiamos el año por el numero de versión, por lo que aparece como versión v1.1110, que tomaremos así, de ahora en adelante con motivo de seguir añadiendo y complementando el componente. No tiene mayor importancia el que sea de una forma o de otra.

Enlaces relacionados:

7 comentarios sobre “TPanelMiniaturas (primera versión v1.1110)

Agrega el tuyo

  1. Hola Salvador,

    Siempre me es grato ver colaboraciones de la comunidad y sobre todo que se desprendan de su código para beneficio de los demás, muchas gracias y felicidades a ti y a Neftalí.

    Mi comentario acerca del TPanelMiniaturas es que tuviera la facilidad de almacenar las últimas visualizaciones de imagenes. Por lo demás me parece muy buen trabajo.

    Saludos

  2. tengo que hacer un proyecto sobre esto en el salvador que me recomiendas

    Sistemas de Bases de Datos Open Source (El ejemplo de la herramienta de
    software solicitada en el documento será Firebird SQL)

  3. Hola!
    Primero que nada quería mostrar mi agradecimiento y además enviarte un saludo, ya que estoy leyendo por aquí desde hace mucho tiempo pero creo que nunca he dejado constancia.
    He aprendido muchas cosas aquí y valoro enormemente estas publicaciones desinteresadas.

    Me gustaría proponeros (tanto a ti como a Neftalí) ¿por qué no subir los fuentes y la demo a algún servidor con SVN? y que fuese más accesible.

    Sé todo lo que cuesta cada una de las líneas de código y por eso, espero que no os molestéis. Porque al probar la demo (ejecutada directamente desde el rar) he visto que el botón “Cargar imagen de disco” va a la carpeta actual del programa, mientras que “Cargar imágenes desde carpeta” se queda en Mi PC y con C: abierto. Esto quizás con SVN se podría “solucionar” rápidamente y son esas “cosas pequeñas”. De nuevo, espero que no os moleste mi comentario.

    Un saludo y muchas gracias por el esfuerzo!

  4. Hola a todos.

    He aprovechado el rato tras la comida para ver los comentarios. Antes que nada daros las gracias porque siempre son bien acogidos.

    Veamos…

    >tuviera la facilidad de almacenar las últimas visualizaciones de imágenes

    Lo dejaré anotado, Eliseo, a ver como podemos implementarlo. Imagino que te refieres a las direcciones de almacenamiento, desde las que se puedan haber cargado cualquier imagen.
    Hay un tema que nos planteamos, respecto a la ruta de la imagen cargada. Habían dos posturas planteadas: almacenar la ruta de la imagen o no almacenarla. Al final, tras discutirlo se acordó no guardar la ruta de almacenamiento para desligar la imagen cargada en memoria, del fichero y que fuera independiente el tiempo de carga del lugar de almacenamiento, ya que podían existir origenes que fueran lentos y condicionarían al resto de imágenes. Entonces, la idea era que la ruta sirviera para proponer un lugar donde guardar la imagen, que por lógica debía de coincidir con el lugar desde el que se había cargado.

    Sería bastante razonable guardar en una lista de cadenas ese histórico de rutas y mostrarlo en alguno de los diálogos. La cuestión es donde guardarlo 🙂 Hay un tema que no está reflejado en el registro de cambios y que no hemos llegado tampoco a comentar pero que ya le estaba yo dando vueltas, y era que quizás sería conveniente usar alguna directiva de compilación para aislar las llamadas propias de windows y no condicionarlo a que solo pueda ser usado desde allí. Así que en ese caso, el registro quedaría descartado siguiendo esa hipótesis…

    En fin… será motivo de varias discusiones jejejeje 🙂 lo cual da mas aliciente al tema.

    >¿por qué no subir los fuentes y la demo a algún servidor con SVN? y que fuese más accesible.

    El tema, Juan es que mientras solamente estemos implicados Germán y yo, tenemos que buscar la forma que nos resulte mas cómoda y sencilla. Es una posibilidad valida y razonable pero creo que dependerá un poco de como evolucione el tema. Ahora bien, si hay interés porque hay compañeros que desean participar no veo porque no se podría hacer. La mayoría de proyectos funcionan así y además, Germán ya lo ha utilizado con alguno de sus componentes, si no me falla la memoria.

    Seguro que Germán comenta algo al respecto si lee estas lineas.

    >tengo que hacer un proyecto sobre esto en el salvador que me recomiendas

    Juan, no entiendo bien la pregunta y creo que faltan algunos datos para poder dar una opinión. No se exactamente cual es la pregunta. Cada uno tiene sus preferencias. Yo he trabajado siempre en un ambiente cliente -servidor, tanto con sqlserver, firebir y mysql y cada cual tiene sus ventajas y sus inconvenientes. En los últimos años he tenido que utilizar intensivamente datasnap, principalmente desde el entorno de Delphi 2007 y no he tenido grandes problemas y me he encontrado muy a gusto con esta tecnología. Plantea la pregunta en el foro de DelphiAccess, que con seguridad va a encontrar no ya la respuesta de una persona concreta sino de un montón de compañeros, lo cual te da un abanico mayor de posibilidades.

    Un abrazo a los tres.

  5. Hay que decir que inicialmente el desarrollo del componente estaba enfocado a probar y experimentar, más que a otra cosa. Decidimos que podíamos realizarlo como práctica y como puro divertimento (tal y como ha comentado Salvador). A medida que ha pasado el tiempo, y hemos ido avanzando en su desarrollo, para mi ha significado también una “bocanada de aire fresco”, y creo que eso se ha reflejado en el interés que ambos hemos puesto en el desarrollo. Seguramente no por el desarrollo del componente en sí, sino por el cambio en el “espacio de trabajo” que eso ha supuesto, al menos para mi.
    Saltame un poco la rutina, cambiar mis compañeros de trabajo habituales por otro, modificar mis objetivos,… todo eso convierte esta experiencia en algo muy positivo e ilusionante.

    @Eliseo
    Hola Eliseo; No se si te refieres a los nuevos formatos de imagen cuando hablas de “últimas visualizaciones de imagen” (eso entiendo yo). Creo que sí es una cosa a mejorar. En esta primera versión nos hemos centrado más en el funcionamiento y estructura básica del componente.

    @JuanF
    Al igual que Salvador, pienso que puede ser una buena opción, pero tal vez más adelante. Subir los fuentes a Sourceforge o similar aporta muchas ventajas, pero también más trabajo y complicación sin al fin y al cabo vamos a estar Salvador y yo trabajando en el componente. ;-D
    De todas formas es una opción que no hay que descartar; Veremos cómo se desarrollan las cosas.

    Un saludo.

  6. @Salvador, @Neftalí, A lo que me referia era a que si yo selecciono algunas imagenes, al cerrar el programa y abrirlo de nuevo, se muestra vacía la tira. Tal vez no sea el concepto inicial del programa, pero como usuario final :), esperaba ver las imagenes que agregué en la tira de miniaturas, en todo caso, no lo veo prioritario y tal vez me estoy adelantando a su mapa de ruta 🙂

    Saludos

  7. Hola Eliseo:

    Ok. Ya te entiendo.

    La respuesta fácil sería decir que esa funcionalidad le pertenece a la demo (por decirlo de alguna manera) y no al componente en si, en cuyo caso, nos haría falta tener en el componente un evento que se pudiera disparar justo después de la creación del panel de la miniaturas, de forma que le pudiera permitir al “cliente” de ese componente usarlo para cargar las imágenes. De la misma forma, necesitaríamos un evento que se disparase justo antes de eliminar los paneles y destruir las imágenes cargadas en memoria. Algo parecido a los onCreate y OnDestroy de nuestros formularios. Y como contrapartida a los métodos existentes de carga de un directorio o de una imagen, nos haría falta algún método del tipo SaveAll( ) o SaveToFile( ) o similar (SaveToStream( )). Ahora mismo esos dos eventos y el método de guardar todavía no han sido implementados, ya que preferimos dejarlo para un poco mas adelante.

    De esa forma, cualquier instancia que manipulase el panel podría tener los elementos necesarios para operar y sería responsabilidad no ya del panel de miniaturas sino de la instancia que lo usa, decidir que imágenes cargaría, que coincidirían posiblemente con las que existían en la ultima ejecución del programa porque al finalizar las habría guardado. El panel de miniatura deberia por decirlo de alguna forma proveer los métodos necesarios para que pueda ser satisfecha esa necesidad (encontrar las ultimas imagenes que estaban cargadas en memoria la ultima vez que fue ejecutado el programa)

    Decía que el tema no era tan sencillo por que muchas decisiones obedecen a razonamientos de diseño y condicionan para ser coherentes con ese diseño. Si decidimos que el panel tenga cargadas en memoria X imágenes, y permitimos que se pueda hacer un copia/pega desde el portapapeles, o arrastrar desde el escritorio de windows, no tiene por qué existir un vínculo real con una ruta de los ficheros. Ni siquiera creo yo que tendría por qué existir el fichero que generó la imagen, ya que puede haber sido borrado tras la operación de arrastre, o haber expulsado el usb que contenía la imagen y que al cesar la ejecución del programa ya no exista el volumen de datos, o que la unidad conectada si es una red haya sido desconectada a petición del usuario, etc… y entonces, en ese punto, ¿qué se debería hacer?

    Ese punto es el que no lo tengo demasiado claro porque si existiera un vinculo de la ruta del fichero con la imagen cargada en memoria podríamos automáticamente verificar si han existido cambios y tomar decisiones pero es que puede no existir, en cuyo caso alguien tendría que decidirlo. Podría ser factible que la misma imagen estuviera cargada varias veces con manipulaciones distintas, que haríamos??? Y si supuestamente tuvieras la ruta, para que podrías querer cargarlo en memoria ya que harías una carga dinámica cuando te hiciera falta, por ejemplo en el mismo momento en el que va a ser mostrado en el display. Así que esa decisión condiciona otras (ya no tendría tanto sentido que pudiera ser usado en tiempo de diseño, por ejemplo y quizás el uso de una colección ya hubiera sido menos necesario, por lo que el diseño posiblemente hubiera sido distinto).

    Yo si tuviera que mojarme, quizás aplicaría el razonamiento de que cada palo aguante su vela y que el panel ofrezca las herramientas (métodos, eventos, propiedades etc..) para que pueda ser satisfecha tal o cual necesidad (como explicaba en las primeras lineas) pero dejando que sea quien lo usa el que decida la respuesta a esos interrogantes.

    No se si me he explicado bien. Son razonamientos que me hago sobre la marcha y que pueden ser objeto de revisión. En realidad todo lo escrito puede ser objeto de revisión 🙂

    Un saludo,

    Salvador

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

Subir ↑

Recetas y consejos nutricionales

Indicadas para personas con diabetes, recomendadas para todos.

¡Buen camino!

ANÉCDOTAS Y REFLEXIONES SOBRE UN VIAJE A SANTIAGO…

http://lfgonzalez.visiblogs.com/

Algunas reflexiones y comentarios sobre Delphi

It's All About Code!

A blog about Delphi and related technologies

The Podcast at Delphi.org

The Podcast about the Delphi programming language, tools, news and community.

Blog de Carlos G

Algunas reflexiones y comentarios sobre Delphi

The Road to Delphi

Delphi - Free Pascal - Oxygene

La web de Seoane

Algunas reflexiones y comentarios sobre Delphi

El blog de cadetill

Cosas de programación....... y de la vida

Delphi-losophy

A Lover of Delphi Wisdom

Delphi en Movimiento

Algunas reflexiones y comentarios sobre Delphi

marcocantu.blog

Algunas reflexiones y comentarios sobre Delphi

/*Prog*/ Delphi-Neftalí /*finProg*/

Blog sobre programación de Neftalí -Germán Estévez-

Press F9

Algunas reflexiones y comentarios sobre Delphi

El blog de jachguate

Un blog sobre tecnología y la vida en general

A %d blogueros les gusta esto: