Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Componentes con colección (https://www.clubdelphi.com/foros/showthread.php?t=12697)

soul6301 24-07-2004 03:21:52

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.

jachguate 24-07-2004 07:49:23

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.

;)

delphi.com.ar 26-07-2004 02:35:59

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 :D... 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!

vic_ia 26-07-2004 16:40:55

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??? :confused:

saludos

marto 26-07-2004 16:47:21

Wop!

Una colección, en el argot de Delphi, es una instancia de TCollection o una clase que derive de ella. Un vector :confused: .... es un vector!

delphi.com.ar 26-07-2004 16:50:51

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!

vic_ia 26-07-2004 17:21:35

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

jachguate 26-07-2004 17:26:59

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.

;)

marto 26-07-2004 17:41:53

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 ;)

vic_ia 26-07-2004 17:54:15

me ha quedado claro....

gracias por sus respuestas.....

saludos....

soul6301 29-07-2004 19:56:58

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.

jachguate 29-07-2004 20:04:37

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.

;)

soul6301 29-07-2004 20:15:29

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.

jachguate 29-07-2004 20:26:32

ninguna sentencia en especial. De lo que debes cuidarte es de llamar a inherited en el destroy.

Hasta luego.

;)

soul6301 29-07-2004 20:29:12

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

delphi.com.ar 29-07-2004 21:03:38

¿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!

jachguate 29-07-2004 21:12:53

Yo te enviaría el destructor de alguna mia... pero es que ya busqué y todos tienen inherited nadamas.. :D

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.

;)


La franja horaria es GMT +2. Ahora son las 23:52:26.

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