Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-06-2005
Avatar de Koder
Koder Koder is offline
Miembro
 
Registrado: may 2005
Posts: 14
Poder: 0
Koder Va por buen camino
Question Problema creando un nuevo componente y un editor de propiedades

Hola Foro:

Ante todo Saludos y Felicitaciones por la Calidad.

Hace rato que esta idea me está dando vueltas por la cabeza, pero por

más que me esmero la cosa no me ha salido.

La idea es crear un componente que tenga como una de sus propiedades un

grupo de controles para que me permita realizar acciones con todos

ellos de una sola vez, deshabilitarlos a todos y cambiarles el color

por ejemplo.

El problema que tengo es:

- No se como puedo asignarle la lista de controles sobre los cuales se

van a realizar las acciones en tiempo de diseño.

- Si lograra asignar la lista no sé si la cargaría otra vez cuando

vuelva a abrir el proyecto ni como lograrlo.

- Como hacer para si se elimina uno de los componentes sea quitado

automáticamente de la lista.

He estado leyendo el curso de creación de componentes de Luis Roche,

pero se me queda cortito porque los editores de propiedades que utiliza

son para propiedades con un solo valor (o al menos es lo que entiendo )

y no un arreglo dinámico que es lo que pretendo.

La idea del editor de propiedades que tengo es algo así como el diálogo

donde se añaden o se quitan las formas que van a ser creadas

automáticamente al inicio de la aplicación.

Project/Options/Forms

Espero que alguien tenga una mejor idea de cómo resolver este problema,

porque ya yo llegué a mi límite. Gracias por adelantado.

Koder
__________________
"First they ignore you. Then they laugh at you. Then they fight you. Then you win."
Mohandas Gandhi
Responder Con Cita
  #2  
Antiguo 04-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Viendo la ayuda de Delphi hay un objeto que parece adecuado: TComponentList. Una de las funcionalidades que indica la ayuda es la de eliminar automáticamente de la lista las componentes que se destruyen:

Cita:
Empezado por ayuda de Delphi
In addition, TComponentList tracks its components. When a component is freed, TComponentList automatically updates itself by deleting the reference to the freed component and packing the list.
Puedes escoger entre instruir a la lista para que se encargue de la destrucción de sus integrantes o no. En tu caso lo segundo parece lo adecuado.

Así, como pienso que podría funcionarte es declarando en tu componente una propiedad de tipo TComponentList.

Es muy poco lo que he hecho con editores de propiedades pero posiblemente tengas que derivar tu editor de TClassProperty para que aparezca en el inspector de objetos como, por ejemplo, la propiedad Lines de un Memo, en donde sólo aparece el nombre de la clase y un botoncito para abrir el editor.

Siguiendo con la ayuda de Delphi:

Cita:
Empezado por ayuda de Delphi
When the user clicks the '...' button next to the property or double-clicks the value column, the Object Inspector calls the property editor's Edit method.

Within your implementation of the Edit method, follow these steps:
  1. Construct the editor you are using for the property.
  2. Read the current value and assign it to the property using a Get method.
  3. When the user selects a new value, assign that value to the property using a Set method.
  4. Destroy the editor.
Es decir, según la misma ayuda de Delphi, que tienes que redefinir el método Edit del editor y seguir ahí los pasos indicados.

La dificultad aquí será el cómo agregar un elemento a la lista. La lista en sí deberá mostrar los nombres de las componentes pero cuando quieras agregar una tendrás que determinar qué componentes hay en el formulario para escoger una. Posiblemente examinando la propiedad Components del formulario pero no sé cómo se determina cuál es el formulario que contiene a tu componente.

Es muy ambiguo lo que te digo pero espero que te de alguna idea de por dónde entrarle.

// Saludos
Responder Con Cita
  #3  
Antiguo 05-06-2005
Avatar de Koder
Koder Koder is offline
Miembro
 
Registrado: may 2005
Posts: 14
Poder: 0
Koder Va por buen camino
Hola

Gracias Roman

Bueno, parece que al menos la cosa va cogiendo una mejor estampa, el problema es que originalmente mi idea es para Delphi 3 y en este no existe TComponentList, pero bueno eso tiene solución ya vi que en Delphi 5 si existe así que para Delphi 3 habrá que plagiar un poco (las cosas que uno se atreve a confezar )

En cuanto a saber cual es la forma, bueno, recuerdo que alguna vez logré hacer algo de eso, de lo que no me acuerdo es como aunque si TComponentList vigila a los componentes de su lista, esa es la parte que más me preocupa, y ya la cosa se facilita, aunque trabajar con editores de propiedades se las trae.

Un Saludo. Koder
__________________
"First they ignore you. Then they laugh at you. Then they fight you. Then you win."
Mohandas Gandhi
Responder Con Cita
  #4  
Antiguo 05-06-2005
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cuando una componente tiene una referencia a otra (sin ser su dueña) lo que se usa es una combinación de los métodos FreeNotification de la componente referenciada y Notification de la componente que tiene la refrencia.

Para fijar ideas considera el caso de un DBEdit y su propiedad DataSource.

Cuando asignas una componente TDataSource a la propiedad DataSource del DBEdit, éste usa DataSource.FreeNotification(Self) lo cual instruye a DataSource a notificar al DBEdit cuando se destruya.

El DBEdit recibe la notificación en el método Notification (deberás redefinirlo):


Código Delphi [-]
if (AComponent = Self.DataSource) and (Operation = opRemove) then
  Self.DataSource := nil;

Como ves, es en este método entonces donde aprovechas para quitar la componente referenciada de tu lista y fijar cualquier referencia a ella a nil para así saber que ya no es una referencia válida.

Imagino que esto es lo que hace TComponentList.

// Saludos
Responder Con Cita
  #5  
Antiguo 21-06-2005
Avatar de Koder
Koder Koder is offline
Miembro
 
Registrado: may 2005
Posts: 14
Poder: 0
Koder Va por buen camino
Post Se complica otra vez

Hola:

Lamento la demora pero aunque tengo un fuerte interes en lograr lo que me propongo con este componente por motivos de mi trabajo no puedo darle la prioridad que quisiera.

Bueno, después de darle unas cuantas vueltas al asunto ahora el problemilla es que TComponentList no hereda de TPersistent y hasta donde tengo idea haría falta que sea descendiente de TPersistent para poder "almacenar" los valores de la lista y que en Delphi cuando hablamos de una clase estamos hablando de un tipo "puntero a objeto" creo que lo que voy a hacer es utilizar un TStringList para la lista, entonces debería

1- Monitorear los cambios en los Controles (destrucción y cambios de nombre)
2- Localizar los Controles a partir de la lista de Strings asociados cuando se cree el componente y llenar las referencias

Creo que esa va siendo la mejor solución. No se que creerán ustedes
__________________
"First they ignore you. Then they laugh at you. Then they fight you. Then you win."
Mohandas Gandhi
Responder Con Cita
  #6  
Antiguo 21-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Ya no recuerdo, pero si en Delphi 3 existen las colecciones, podes hacer una cuyo elemento contenga un puntero a un control.

Asi, publicarías una propiedad como TControlCollection, o algo similar.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 23-06-2005
Avatar de Koder
Koder Koder is offline
Miembro
 
Registrado: may 2005
Posts: 14
Poder: 0
Koder Va por buen camino
Question TCollection?

Hola

Ok jachguate, en D3 existe TCollection y si mal no recuerdo fue una de las posibles soluciones que me pasó por mi pobre cabeza pero por más que leí la ayuda nada de nada "creo que tengo que aprender más ingles "

Tal vez me puedes dar una buena explicación porque juro que TCollection es una de las cosas que menos comprendo y aunque va y quizás al final no es la solución adecuada por lo menos aprendo algo

Un Saludo, Koder
__________________
"First they ignore you. Then they laugh at you. Then they fight you. Then you win."
Mohandas Gandhi
Responder Con Cita
  #8  
Antiguo 23-06-2005
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cool

Cita:
Empezado por Koder
Tal vez me puedes dar una buena explicación
Es algo largo de explicar. Busqué una sola vez en google y llegué a este artículo que tiene una parte dedicada a TCollection y TCollectionItem que a simple vista puede serte util. Leelo, y si no te aclara, pues lo comentas y vemos en que mas se te puede ayudar.

Cita:
Empezado por Koder
quizás al final no es la solución adecuada por lo menos aprendo algo
No se todas las particularidades de tu caso, pero a simple vista si me parece una de las soluciones adecuadas.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 21-08-2005
Avatar de Koder
Koder Koder is offline
Miembro
 
Registrado: may 2005
Posts: 14
Poder: 0
Koder Va por buen camino
Talking Eureka!!!

Bueno, un saludo especial para Roman y Jachguate que sin su ayuda mis modestos esfuerzos hubieran quedado en nada Gracias de todo corazón amigos.

Pues luego de mucho batallar y leer, leer y leer llegue a una solución que no es precisamente tan presentable como me hubiera gustado pero que es mucho mejor que lo que yo estaba haciendo el resultado son un grupo de descendientes de TCollection que son lo que le pienso poner en las propiedades al dichoso componente (que creo se convertirá en varios componentes) que desde hace tanto estoy por escribir pero siempre me tropezaba con alguna dificultad ( incluyendo la incompetencia propia ). Ya lo que queda es coser y cantar porque es cojer el bulto de componentes asignadas y realizar las acciones que quiero con ellas, la parte bien difícil era esta del arreglo de componentes en las propiedades.

24/08/2005

JaJa yo mismo encontre uno y bastante pesado, solamente me permitía hacer una unica referencia a un componente desde una sola colección (sino daba error al cerrar la forma o al eliminar un componente) y en realidad puedo necesitar al mismo componente en varias colecciones.

En realidad ahora el problema que tengo es que que me dí cuenta de que puedo tener el componente referenciado varias veces en la misma colección o puedo tener un item que no referencie a ningun componente (nil) pero eso lo dejo para otro momento

Cambié a la Version 1.0.2

Una vez más gracias y un saludo cuando tenga la parte del trabajo que se deriva de esta la pondré por acá enseguida.
Archivos Adjuntos
Tipo de Archivo: zip Collections102.zip (13,3 KB, 47 visitas)
__________________
"First they ignore you. Then they laugh at you. Then they fight you. Then you win."
Mohandas Gandhi

Última edición por Koder fecha: 24-08-2005 a las 18:45:07. Razón: Bugs en la Version 1.0.1
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 10:32:59.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi