Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 24-07-2004
soul6301 soul6301 is offline
Miembro
 
Registrado: may 2004
Posts: 77
Poder: 20
soul6301 Va por buen camino
Question Componentes con colección

Hola:

¿Cómo puedo crear un componente que use una colección de objetos? Por ejemplo, quiero crear un componente que guarde imágenes y referirme a ellas según el índice: "MiComponente.Imagen[1].Picture".

Gracias.
Responder Con Cita
  #2  
Antiguo 24-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Eso no es una colección... es un vector.

Podes hacer un componente que tenga una propiedad "vectorial", asi:

Código Delphi [-]
type
  TMiClase = class(TComponent)
  private
    Procedure SetPropiedadVector(index : Integer; value : String);
    Functin GetPropiedadVector(index : Integer) : String;
  published:
    Property PropiedadVector[index : Integer] : String read GetPropiedadVector write SetPropiedadVector;
  end;

Que se haga dentro de GetPropiedadVector/SetPropiedadVector ya es responsabilidad tuya.

Si queres ampliar el tema, recuerdo que el libro La Cara Oculta de Delphi 4, de Ian Marteens (que podes descargar gratuitamente desde la web del autor: http://www.marteens.com) pasa por el tema.

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
  #3  
Antiguo 26-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Cita:
Empezado por jachguate
..Podes hacer un componente que tenga una propiedad "vectorial"..
Si quieres en mi página tienes un ejemplo llamado arrprop.zip que nació en este hilo: Guardar en un archivo el vector de componentes de una form. Es un componente con una "propiedad vectorial" como dice el amigo jachguate, totalmente implementado (Te faltó el detalle de como guardar esta propiedad en el DFM ... si es que es queremos).

Crear un componente que tenga una propiedad del tipo TCollection, es mas sencillo en algunos aspectos porque por ejemplo: no necesitamos desarrollar un editor de propiedades en particular, el IDE utilizará el de todas las colecciones, y no necesitamos algunos artilugios extra para que esta información quede almacenada y sea persistente. Como desventaja, siempre es "mas económico" hablando de recursos, hablar de vectores que de colecciones. Simplemente para crear un componente de este tipo tenemos que definir una propiedad del tipo TCollection y crear y destruir esta colección en el creador y constructor del componente. Pero eso no es todo, para que esto sea útil tendríamos que definir una colección propietaria.
Si es lo necesitas, puedo escribirte algún ejemplo de esto.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #4  
Antiguo 26-07-2004
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola ...
Cita:
Empezado por jachguate
Eso no es una colección... es un vector.
alguien me podria decir cuando se considera una colección y cuando un vector???

saludos
Responder Con Cita
  #5  
Antiguo 26-07-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 22
marto Va por buen camino
Wop!

Una colección, en el argot de Delphi, es una instancia de TCollection o una clase que derive de ella. Un vector .... es un vector!
__________________
E pur si muove
Responder Con Cita
  #6  
Antiguo 26-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
Una colección simplemente es una clase heredada de TCollection. Esta clase tiene métodos como para eliminae items, agregar items en posiciones aleatorias y otras cuantas utilidades que te recomiendo leer de la ayuda de TCollection. Ademas tenemos la posibilidad de sobreescribir los métodos de la colección como para cambiar la funcionalidad de la misma.

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #7  
Antiguo 26-07-2004
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
hola nuevamente...
Cita:
Empezado por marto
Una colección, en el argot de Delphi, es una instancia de TCollection o una clase que derive de ella. Un vector .... es un vector!
aunque no esperaba la ironia, ..... agradezco el tiempo para responder....
Cita:
Empezado por delphi.com.ar
Una colección simplemente es una clase heredada de TCollection. Esta clase tiene métodos como para eliminae items, agregar items en posiciones aleatorias y otras cuantas utilidades que te recomiendo leer de la ayuda de TCollection. Ademas tenemos la posibilidad de sobreescribir los métodos de la colección como para cambiar la funcionalidad de la misma.
y agradeciendo la explicación...

creo que formule mal mi cuestion.... considerando lo que solicitaban y la respuesta que dio jachguate; buscaba me orientaran cuando considerar utilizar una coleccion y cuando un vector; (queda entendido que utilizar TCollection lleva a implementar/sobreescribir -en su caso- los metodos para adecuar la funcionalidad de la misma)...

saludos... y nuevamente las gracias por la explicación y el tiempo para contestar
Responder Con Cita
  #8  
Antiguo 26-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Creo que la principal ventaja de usar una colección, es su capacidad de persistencia. Claro que es un poco mas dificil de montar... asi que si no necesitas de esta persistencia, quizas sea conveniente el uso de un vector.

No se si se me escapa alguna otra...

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 26-07-2004
Avatar de marto
marto marto is offline
Miembro
 
Registrado: may 2003
Ubicación: Barcelona, Catalunya
Posts: 882
Poder: 22
marto Va por buen camino
Wop!

Cita:
Empezado por vic_ia
aunque no esperaba la ironia, ..... agradezco el tiempo para responder....

No pretendía ser irónico, tal y como proponías tu duda pensé que eso la resolvía.

Cita:
Empezado por vic_ia
buscaba me orientaran cuando considerar utilizar una coleccion y cuando un vector;
Pues creo que, además de la persistencia (aunque bastante relacionado), está el tema que comenta d.c.a, aprovechar el editor de propiedades de delphi, si trabajas con un vector, las asignaciones las tendrás que programar a manita
__________________
E pur si muove
Responder Con Cita
  #10  
Antiguo 26-07-2004
Avatar de vic_ia
vic_ia vic_ia is offline
Miembro
 
Registrado: ene 2004
Posts: 238
Poder: 21
vic_ia Va por buen camino
me ha quedado claro....

gracias por sus respuestas.....

saludos....
Responder Con Cita
  #11  
Antiguo 29-07-2004
soul6301 soul6301 is offline
Miembro
 
Registrado: may 2004
Posts: 77
Poder: 20
soul6301 Va por buen camino
Hola:

Perdonen mi ausencia, yo inicié el hilo, leí las respuestas pero no tuve tiempo de responder. Muchas gracias por su interés en ayudar, les estoy realmente agradecido, y valga la redundancia.

Bueno, ahora ya sé la diferencia entre un vector y una colección, pero lo que realmente me interesa es lo segundo. Seguí la respuesta de delphi.com.ar (muchas gracias, por cierto) para que mi componente tenga una colección y resultó, era realmente sencillo, pero tengo un problema:
- Puedo trabajar normal con el componente, pero si lo elimino ocurre un error grave en todo Delphi. No me permite borrar el componente. Traté añadiendo esta sentencia MiColeccion.Free en el procedimiento destroy, pero no se soluciona el problema.
De seguro que el problema está en mi código, es por ello que quisiera ayuda para saber todas las pautas que se deben seguir para poder crear un componente con una colección de objetos. delphi.com.ar estaba dispuesto en enviarme un ejemplo, le estaré muy agradecido si me presta su tiempo para ayudarme.

Muchas gracias a todos, mis estimados colegas.
Responder Con Cita
  #12  
Antiguo 29-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Es muy probable que el error esté en el destructor de tu componente. Seguilo paso a paso... a ver si detectas la sentencia que genera el problema. También podes pegar aca el trozo de código del destructor completo, si este no está muy grande.

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
  #13  
Antiguo 29-07-2004
soul6301 soul6301 is offline
Miembro
 
Registrado: may 2004
Posts: 77
Poder: 20
soul6301 Va por buen camino
De seguro el error está en el destroy (tal vez), pero podrían decirme cuáles son los pasos o las sentencias que se deben poner en un componente que lleve ua colección.
En el club hay un tutorial para la creación de componentes pero no dice nada acerca de las colecciones.

Necesito ayuda que me siento fracasado.
Responder Con Cita
  #14  
Antiguo 29-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
ninguna sentencia en especial. De lo que debes cuidarte es de llamar a inherited en el destroy.

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
  #15  
Antiguo 29-07-2004
soul6301 soul6301 is offline
Miembro
 
Registrado: may 2004
Posts: 77
Poder: 20
soul6301 Va por buen camino
Eso sí lo he hecho, llamo al inherited. Mira, he creado ya otros componentes sin colección y este problema no aparece. Sólo aparece con el componente que tiene colección. Por eso, necesito un ejemplo de un componente con coleccion creado por alguno de Ustedes. El más sencillo que sea, no hay problema. Porque el mío no funciona y realmente no sé por qué.

Gracias
Responder Con Cita
  #16  
Antiguo 29-07-2004
Avatar de delphi.com.ar
delphi.com.ar delphi.com.ar is offline
Federico Firenze
 
Registrado: may 2003
Ubicación: Buenos Aires, Argentina *
Posts: 5.932
Poder: 27
delphi.com.ar Va por buen camino
¿Tienes algún otro componente nuevo que haga referencia a este o viceversa?
Es comportamiento es típico de componentes o clases con propiedades del tipo TComponent, sin utilizar el método Notification para "desasignar" las variables:
Código Delphi [-]
TMiComponente = class(TComponent)
  public
    ...
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
    ...
  published
    property DataSet: TDataSet read FDataSet write SetDataSet;
  end;
.....
procedure TMiComponente.Notification(AComponent: TComponent; Operation: TOperation);
begin
  inherited;
  if (Operation = opRemove) and (AComponent = FDataSet) Then
     FDataSet := Nil;
end;

Saludos!
__________________
delphi.com.ar

Dedique el tiempo suficiente para formular su pregunta si pretende que alguien dedique su tiempo en contestarla.
Responder Con Cita
  #17  
Antiguo 29-07-2004
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Yo te enviaría el destructor de alguna mia... pero es que ya busqué y todos tienen inherited nadamas..

Ejemplos abundan en el código fuente de la VCL, por ejemplo en la unidad

db.pas: TCheckConstraints, TParams
dbGrids.pas: TDBGridColumns

y muchos mas.

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 13:56:09.


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