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
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 08:02:25.


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