Envases de encargo pack (ccpack 5)


la Revisión de este programa gratuito de expertos que le ayuda a construir visualmente los componentes de material compuesto
PERSONALIZADA CONTENEDORES PACK (CCPACK 5)
¿Qué es el Custom Contenedores Pack?
CCPack 5 es un paquete de freeware que permite visualmente combinar, ampliar y heredar VCL contenedores. El paquete fue desarrollado por Sergey Orlik, Gerente de Producto de Inprise oficina de Moscú (Rusia, C. I. S. y los Estados Bálticos).
CCPack 5 funciona con Delphi/C Builder 5, y es la evolución de dos Delphi/C Generador de 3,4 complementos: Formularios Personalizados Pack (CFPack) y Componentes de material Compuesto Pack (CCPack 4).
Uno de los usos más comunes de CCPack 5 es crear los componentes de los diversos componentes:
* CCPack Introducción de la película ('337K)

Descarga
* Envases de encargo Pack (CCPack 5) para Delphi/C Builder 5 ('695K)
* CCPack 4.5 para Delphi/C Builder 3 y 4 ('591K)
* CFPack 4.3 para Delphi/C Builder 4 ('129K)
* CFPack 1.01 para Delphi/C Builder 3 (el antiguo y el no-versión modificada) ('45K)
el código fuente Completo está disponible y usted puede modificar sin restricciones para cualquier proyectos no comerciales. Permita que el autor sabe si usted desea utilizar este software en sus proyectos comerciales por e-mail a [email protected] indicando la herramienta del nombre en la línea de asunto.

Un ejemplo de componente compuesto
Después de haber instalado CCPack, usted está listo para el primer ejemplo.
Cerrar todos los proyectos Delphi. En el menú 'Archivo' y seleccione 'Nuevo...', seleccione 'Contenedor Personalizado' (o 'Compuestos de Control' en Delphi 3/4) en los 'Nuevos elementos' de diálogo y haga clic en 'ACEPTAR'. En el 'Nuevo Contenedor de diálogo' seleccionar 'TFrame', escribir 'TFileComposite' en la 'Nueva clase' nombre de campo y haga clic en 'Finalizar'.
aparecerá Un formulario. Su superficie es la superficie de su nuevo componente de Delphi. Establezca las siguientes propiedades en el Inspector de Objetos:
Width = 281
& nbsp & nbsp Altura = 164

Este será el tamaño por defecto del componente. Colocar un Panel en el formulario y definir sus propiedades:
Align = alLeft
& nbsp & nbsp & nbsp & nbsp Width = 130
& nbsp & nbsp & nbsp & nbsp BevelOuter = bvNone
& nbsp & nbsp & nbsp & nbsp Caption =
& nbsp & nbsp & nbsp & nbsp Restricciones.MinWidth = 110

Colocar un Divisor a la derecha del panel. Se alinean automáticamente en el lado del panel. Caída de un DriveComboBox y un DirectoryListBox en el panel y en el conjunto de sus propiedades:
DriveComboBox:
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Izquierda = 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Top = 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Width = 130
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Altura = 19
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Anclajes = [akLeft, akTop, akRight]
& nbsp & nbsp & nbsp & nbsp DirectoryListBox:
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Izquierda = 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Top = 19
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Width = 130
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Altura = 145
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Anclajes = [akLeft, akTop, akRight, akBottom]

haga Clic en el lado derecho de la forma, y la caída de un FileListBox:
Align = alClient
& nbsp & nbsp & nbsp & nbsp TabOrder = 0

Con esto hemos completado la interfaz visual de nuestro componente compuesto. Ahora es el momento de añadir algo de código a 'enlace' de los componentes. Haga doble clic en el DriveComboBox y en el controlador de eventos de Cambio de escritura:
procedimiento TFileComposite.DriveComboBox1Change(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp DirectoryListBox1.Unidad := DriveComboBox1.La unidad
& nbsp & nbsp final

haga Doble clic en el DirectoryListBox y en el controlador de eventos de Cambio de escritura:
procedimiento TFileComposite.DirectoryListBox1Change(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp FileListBox1.Directorio := DirectoryListBox1.Directorio
& nbsp & nbsp final

Con esto hemos completado el comportamiento básico de nuestro componente compuesto, que para la interfaz de programación de heredar los métodos y propiedades de TFrame (la clase base elegimos cuando se creó el componente). Vamos a agregar un par de propiedades públicas: nombre de archivo y Directorio. En la declaración de la clase, agregue:
tipo
& nbsp & nbsp & nbsp & nbsp TFileComposite = clase(TFrame)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { declaraciones Protegidos }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp función GetFileName: string
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp procedimiento SetFileName(FileName: string)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp función GetDirectory: cadena

& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp procedimiento SetDirectory(Directorio: string)
& nbsp & nbsp & nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { Public declarations }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad FileName: cadena de leer GetFileName escribir SetFileName
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad de Directorio de: cadena de leer GetDirectory escribir SetDirectory
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :

La aplicación es bastante simple. Básicamente podemos obtener y establecer el nombre de archivo de la FileListBox y la propiedad de Directorio de la DirectoryListBox:
función TFileComposite.GetFileName: string
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := FileListBox1.Nombre de archivo
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.SetFileName(FileName: string)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp FileListBox1.FileName := nombre del archivo
& nbsp & nbsp final
& nbsp & nbsp función TFileComposite.GetDirectory: string
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := DirectoryListBox1.Directorio
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.SetDirectory(Directorio: string)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp DirectoryListBox1.Directorio := Directorio
& nbsp & nbsp final

Ahora vamos a añadir tres eventos: el Cambio, haga Clic y doble clic. En la declaración de la clase, agregue:
tipo
& nbsp & nbsp & nbsp & nbsp TFileComposite = clase(TFrame)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { Private declarations }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnChange: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnClick: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnDblClick: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp pública
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp publicado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { Publicado declaraciones }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad OnChange: TNotifyEvent leer FOnChange escribir FOnChange
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad OnClick: TNotifyEvent leer FOnClick escribir FOnClick
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad OnDblClick: TNotifyEvent leer FOnDblClick escribir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnDblClick
& nbsp & nbsp & nbsp & nbsp final

Como podría ser la de adivinanzas, estos eventos será provocado por el Cambio, haga Click y DblClick eventos de la FileListBox, para generar los correspondientes controladores de eventos y escribir lo siguiente:
procedimiento TFileComposite.FileListBox1Change(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si se ha Asignado(FOnChange), a continuación, FOnChange(Auto)
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.FileListBox1Click(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si se ha Asignado(FOnClick), a continuación, FOnClick(Auto)
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.FileListBox1DblClick(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si se ha Asignado(FOnDblClick), a continuación, FOnDblClick(Auto)
& nbsp & nbsp final

Si usted se pregunta acerca de la función Asignada, por favor, permítanme explicar. FOnChange es un campo de tipo TNotifyEvent, y esto significa que puede contener la dirección de un procedimiento objeto de una 'Sender: TObject' parámetro... o puede ser Nulo, por lo que debe asegurarse de que FOnChange no es Nil antes de hacer la llamada 'FOnChange(Auto)'. Sin embargo, el siguiente no funcionará:
si FOnChange <> nil entonces ...
La razón es que la referencia FOnChange es tomado por el compilador como una invocación del procedimiento apunta. Ya que es un procedimiento, no devuelve un valor de tipo compatible con un puntero (por lo que no se puede comparar con Nil), pero antes de darse cuenta de esto, el compilador va a encontrar que se nos olvidó el parámetro de (Remitente) en la llamada a FOnChange... Nuestra intención no es para llamar al procedimiento FOnChange puntos, pero para saber si el valor de FOnChange no es Nil. Este es el propósito de la función Asignada anteriormente.
el propósito de este ejemplo, es este. Puede instalar esta unidad y, a continuación, utilizar el componente de la Paleta de Componentes, o usted puede incluir la unidad en un proyecto de prueba y crear el componente de código como hicimos en la aplicación de prueba para ahorrarte el tener que instalar un inútil componente.
Como se puede ver, con CCPack alguien con poca experiencia en el componente de escritura puede construir componentes de material compuesto de forma rápida y sencilla.

Más información
Usted puede encontrar más información acerca de CCPack, y encontrar otros componentes de Sergey Orlik del sitio web.
Usted puede encontrar el código fuente completo de este artículo en el archivo que acompaña a la Pascal Boletín #24









Envases de encargo pack (ccpack 5)


Envases de encargo pack (ccpack 5) : Multi-millones de consejos para hacer su vida mas facil.


la Revision de este programa gratuito de expertos que le ayuda a construir visualmente los componentes de material compuesto
PERSONALIZADA CONTENEDORES PACK (CCPACK 5)
¿Que es el Custom Contenedores Pack?
CCPack 5 es un paquete de freeware que permite visualmente combinar, ampliar y heredar VCL contenedores. El paquete fue desarrollado por Sergey Orlik, Gerente de Producto de Inprise oficina de Moscu (Rusia, C. I. S. y los Estados Balticos).
CCPack 5 funciona con Delphi/C Builder 5, y es la evolucion de dos Delphi/C Generador de 3,4 complementos: Formularios Personalizados Pack (CFPack) y Componentes de material Compuesto Pack (CCPack 4).
Uno de los usos mas comunes de CCPack 5 es crear los componentes de los diversos componentes:
* CCPack Introduccion de la pelicula ('337K)

Descarga
* Envases de encargo Pack (CCPack 5) para Delphi/C Builder 5 ('695K)
* CCPack 4.5 para Delphi/C Builder 3 y 4 ('591K)
* CFPack 4.3 para Delphi/C Builder 4 ('129K)
* CFPack 1.01 para Delphi/C Builder 3 (el antiguo y el no-version modificada) ('45K)
el codigo fuente Completo esta disponible y usted puede modificar sin restricciones para cualquier proyectos no comerciales. Permita que el autor sabe si usted desea utilizar este software en sus proyectos comerciales por e-mail a [email protected] indicando la herramienta del nombre en la linea de asunto.

Un ejemplo de componente compuesto
Despues de haber instalado CCPack, usted esta listo para el primer ejemplo.
Cerrar todos los proyectos Delphi. En el menu 'Archivo' y seleccione 'Nuevo...', seleccione 'Contenedor Personalizado' (o 'Compuestos de Control' en Delphi 3/4) en los 'Nuevos elementos' de dialogo y haga clic en 'ACEPTAR'. En el 'Nuevo Contenedor de dialogo' seleccionar 'TFrame', escribir 'TFileComposite' en la 'Nueva clase' nombre de campo y haga clic en 'Finalizar'.
aparecera Un formulario. Su superficie es la superficie de su nuevo componente de Delphi. Establezca las siguientes propiedades en el Inspector de Objetos:
Width = 281
& nbsp & nbsp Altura = 164

Este sera el tamaño por defecto del componente. Colocar un Panel en el formulario y definir sus propiedades:
Align = alLeft
& nbsp & nbsp & nbsp & nbsp Width = 130
& nbsp & nbsp & nbsp & nbsp BevelOuter = bvNone
& nbsp & nbsp & nbsp & nbsp Caption =
& nbsp & nbsp & nbsp & nbsp Restricciones.MinWidth = 110

Colocar un Divisor a la derecha del panel. Se alinean automaticamente en el lado del panel. Caida de un DriveComboBox y un DirectoryListBox en el panel y en el conjunto de sus propiedades:
DriveComboBox:
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Izquierda = 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Top = 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Width = 130
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Altura = 19
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Anclajes = [akLeft, akTop, akRight]
& nbsp & nbsp & nbsp & nbsp DirectoryListBox:
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Izquierda = 0
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Top = 19
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Width = 130
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Altura = 145
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp Anclajes = [akLeft, akTop, akRight, akBottom]

haga Clic en el lado derecho de la forma, y la caida de un FileListBox:
Align = alClient
& nbsp & nbsp & nbsp & nbsp TabOrder = 0

Con esto hemos completado la interfaz visual de nuestro componente compuesto. Ahora es el momento de añadir algo de codigo a 'enlace' de los componentes. Haga doble clic en el DriveComboBox y en el controlador de eventos de Cambio de escritura:
procedimiento TFileComposite.DriveComboBox1Change(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp DirectoryListBox1.Unidad := DriveComboBox1.La unidad
& nbsp & nbsp final

haga Doble clic en el DirectoryListBox y en el controlador de eventos de Cambio de escritura:
procedimiento TFileComposite.DirectoryListBox1Change(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp FileListBox1.Directorio := DirectoryListBox1.Directorio
& nbsp & nbsp final

Con esto hemos completado el comportamiento basico de nuestro componente compuesto, que para la interfaz de programacion de heredar los metodos y propiedades de TFrame (la clase base elegimos cuando se creo el componente). Vamos a agregar un par de propiedades publicas: nombre de archivo y Directorio. En la declaracion de la clase, agregue:
tipo
& nbsp & nbsp & nbsp & nbsp TFileComposite = clase(TFrame)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { declaraciones Protegidos }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp funcion GetFileName: string
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp procedimiento SetFileName(FileName: string)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp funcion GetDirectory: cadena

& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp procedimiento SetDirectory(Directorio: string)
& nbsp & nbsp & nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { Public declarations }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad FileName: cadena de leer GetFileName escribir SetFileName
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad de Directorio de: cadena de leer GetDirectory escribir SetDirectory
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :

La aplicacion es bastante simple. Basicamente podemos obtener y establecer el nombre de archivo de la FileListBox y la propiedad de Directorio de la DirectoryListBox:
funcion TFileComposite.GetFileName: string
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := FileListBox1.Nombre de archivo
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.SetFileName(FileName: string)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp FileListBox1.FileName := nombre del archivo
& nbsp & nbsp final
& nbsp & nbsp funcion TFileComposite.GetDirectory: string
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp Resultado := DirectoryListBox1.Directorio
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.SetDirectory(Directorio: string)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp DirectoryListBox1.Directorio := Directorio
& nbsp & nbsp final

Ahora vamos a añadir tres eventos: el Cambio, haga Clic y doble clic. En la declaracion de la clase, agregue:
tipo
& nbsp & nbsp & nbsp & nbsp TFileComposite = clase(TFrame)
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp privada
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { Private declarations }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnChange: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnClick: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnDblClick: TNotifyEvent
& nbsp & nbsp & nbsp & nbsp protegido
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp publica
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp :
& nbsp & nbsp & nbsp & nbsp publicado
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp { Publicado declaraciones }
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad OnChange: TNotifyEvent leer FOnChange escribir FOnChange
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad OnClick: TNotifyEvent leer FOnClick escribir FOnClick
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp propiedad OnDblClick: TNotifyEvent leer FOnDblClick escribir
& nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp & nbsp FOnDblClick
& nbsp & nbsp & nbsp & nbsp final

Como podria ser la de adivinanzas, estos eventos sera provocado por el Cambio, haga Click y DblClick eventos de la FileListBox, para generar los correspondientes controladores de eventos y escribir lo siguiente:
procedimiento TFileComposite.FileListBox1Change(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si se ha Asignado(FOnChange), a continuacion, FOnChange(Auto)
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.FileListBox1Click(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si se ha Asignado(FOnClick), a continuacion, FOnClick(Auto)
& nbsp & nbsp final
& nbsp & nbsp procedimiento TFileComposite.FileListBox1DblClick(Sender: TObject)
& nbsp & nbsp empezar
& nbsp & nbsp & nbsp & nbsp si se ha Asignado(FOnDblClick), a continuacion, FOnDblClick(Auto)
& nbsp & nbsp final

Si usted se pregunta acerca de la funcion Asignada, por favor, permitanme explicar. FOnChange es un campo de tipo TNotifyEvent, y esto significa que puede contener la direccion de un procedimiento objeto de una 'Sender: TObject' parametro... o puede ser Nulo, por lo que debe asegurarse de que FOnChange no es Nil antes de hacer la llamada 'FOnChange(Auto)'. Sin embargo, el siguiente no funcionara:
si FOnChange <> nil entonces ...
La razon es que la referencia FOnChange es tomado por el compilador como una invocacion del procedimiento apunta. Ya que es un procedimiento, no devuelve un valor de tipo compatible con un puntero (por lo que no se puede comparar con Nil), pero antes de darse cuenta de esto, el compilador va a encontrar que se nos olvido el parametro de (Remitente) en la llamada a FOnChange... Nuestra intencion no es para llamar al procedimiento FOnChange puntos, pero para saber si el valor de FOnChange no es Nil. Este es el proposito de la funcion Asignada anteriormente.
el proposito de este ejemplo, es este. Puede instalar esta unidad y, a continuacion, utilizar el componente de la Paleta de Componentes, o usted puede incluir la unidad en un proyecto de prueba y crear el componente de codigo como hicimos en la aplicacion de prueba para ahorrarte el tener que instalar un inutil componente.
Como se puede ver, con CCPack alguien con poca experiencia en el componente de escritura puede construir componentes de material compuesto de forma rapida y sencilla.

Mas informacion
Usted puede encontrar mas informacion acerca de CCPack, y encontrar otros componentes de Sergey Orlik del sitio web.
Usted puede encontrar el codigo fuente completo de este articulo en el archivo que acompaña a la Pascal Boletin #24


Envases de encargo pack (ccpack 5)

Envases de encargo pack (ccpack 5) : Multi-millones de consejos para hacer su vida más fácil.
Recommander aux amis
  • gplus
  • pinterest

Comentario

Dejar un comentario

Clasificación