![]() |
Crear un Componente TScrollbox con botones dentro
Hola a todos, hace unos días estaba pidiendo consejo sobre la creación de una aplicación, cosa que ya he acabado.
Para dicha aplicación he usado un Scrollbox y dentro de él he metido botones que creo en tiempo de ejecución, dependiendo la cantidad de los mismos de cierta cantidad de una consulta. Pues bien, una vez dicho esto, mi intención es hacer un componente con lo que he comentado anteriormente, es decir, un Scrollbox al que se le puedan insertar botones dependiento de la cantidad que lea de una propiedad creada. Hasta ahora tengo el componente del boton creado con las nuevas propiedades que quiero que tenga y su procedimientos pero es solo el botón, yo quiero que me muestro un Scrollbox y como he dicho antes, esos botones se creen leyendo una nueva propiedad. Espero haberme explicado bien, de todas formas no duden en preguntar, un saludo. |
Hola Corbatin. No he entendido exactamente tu duda. Es que creas el botón, y no te aparece en el Paintbox??
|
Hola, ya he solucionado ese problema y lo tengo casi acabado el componente.
De todas formas, cuando este del todo terminado (según yo) lo pondré aquí en el foro para mejorarlo y para quién quiera copiarlo, un saludo. |
Aquí estoy otra vez, he tenido algunos problemillas con la creación del componente pero los he ido solventando poco a poco. En esto momentos estoy parado con el siguiente problema:
- Ya me he creado mi tipo de boton que incluire en el Scrollbox. - También he creado mi Scrollbox el que crea botones dentro de si mismo dependiendo de una cantidad en una propiedad del inspector de objetos (incluso los crea en tiempo de diseño guay). Estos botones los voy metiendo en un array dinámico del mismo tipo para poder interactuar con ellos. - Pero ahora tengo el problema de como hacer algo cuando se pulse sobre el botón, es decir, no se como programar el componente para que cuando se pulse un botón que tiene en su interior hacer lo que sea. - En tiempo de diseño, cuando pulsas sobre el botón en realidad lo estas haciendo sobre mi Scrollbox, por lo que no puedo acceder al evento Onclick del botón. - Si alguién sabe implementar un procedimiento para mi componente Scrollbox, para que cuando se pulse un botón de los que contiene pueda hacer algo, que me lo diga, gracias y saludos. |
simplemente hace un método en tu componente que reciba un parámetro llamado Sender de tipo TObject. Supongamos que este método se va a llamar BotonClick.
Cuando estas creando los botones, asignas este método a su evento OnClick. . De esta forma se ejecuta el método BotonClick cada vez que se pulsa cualquier boton. Llegando un poco mas lejos, podes incluso definir un nuevo evento en tu componente que se dispare cada vez que se hace click sobre cualquier boton... Hasta luego. ;) |
No te he entendido muy bien, ¿lo puedes explicar un poquito más?
Gracias. |
Aclarando un poquito lo anterior, mi intención es que sea algo parecido o igual a lo que ocurre cuando haces click sobre cualquier componente, te sale el procedimiento o evento Onclick y en él se puede colocar código introducido por el usuario, gracias de nuevo.
|
Un evento es un apuntador a un método. Para ser exactos, es una propiedad de los objetos que apunta a direcciones de métodos de otros objetos. Lo que haces en el object inspector es eso... relacionar los "eventos" de los objetos (componentes) con métodos de otro objeto (regularmente de los formularios).
Esa asignación que hace el ObjectInspector, también podes hacerla por código. La condicion a cumplir es que la lista de parámetros sea igual, en número y tipo, a la requerida por el evento. Esta verificación se realiza usando tipos procedurales para definir los eventos, y es chequeada en tiempo de compilación. Para que el inspector de objetos interprete una propiedad como evento, esta tiene que ser de un tipo procedural. Ya hay algunos tipos definidos en unidades de la VCL, como el TNotifyEvent, cuya definición es algo como:
la clausula of Object indica al compilador que solamente un método de otro objeto será válido, y no un procedimiento "independiente". Lo que haces por código, entonces, es asignar un método de tu componente a la propiedad "evento" de los botones. En este método, ya vos podes identificar, mediante el sender, que botón es el que ha sido pulsado, y actuar en consecuencia. Para ampliar tus conocimientos en este tema, te recomiendo la lectura de un libro que abarque el diseño de componentes. El que a mi mas me gusta es Mastering Delphi, de Marco Cantú. Hasta luego. ;) |
Hola a todos, lo prometido es deuda, aquí teneis el componente en el que he estado trabajando. Es mi primer componente, así que espero que las críticas sean moderadas. Ha quedado hacer que cuando se cambia el tamaño del ScrollBox en diseño, se re-coloquen los botones que contienen. Esto se consigue volviendo hacer enter sobre el campo CanBotones. También queda pendiente, que si colocamos algún componente en el interior del Scrollbox como por ejemplo un Toolbar, pues que lo respete y no pinte los botones por encima de ellos. Por lo demás creo que esta bastante logrado, pero aquí lo teneis para mejorarlo o para lo que sea, un saludo. :cool:
:eek: Ahhh, instalar primero el MyButtons y después el MyBox. Yo los he metido en paquetes diferentes para instarlarlos. Código:
Código:
unit MyBox; |
Pero que os pasa, nadie quiere opinar sobre los componentes que he creado?
tal vez mejorarlos?. Espero que alguién pueda contribuir con opiniones, son mis primeros componentes y encima que los comparto, me esperaba más interés, en fin, la vida es así de dura, un saludo para todos. :p |
Hola Corbatin.
No te impacientes. El código lo publicaste hace apenas un par de días. Para que alguien se interese en tu componente, debiera tener una necesidad específica que este cubra, no te parece? Solo ve a tu alrededor y te vas a dar cuenta que la gente no vuela a poner una crítica constructiva, ni por los componentes que son mucho mas espectaculares... Julián, un moderador del club ha hecho un componente para conectarse a Word y hacer algunas maravillas... y ha recibido algun feedback?? pos no! Yo he echado un ojo a la interfaz del componente, sin entrar a ver nada de la implementación... y lo que puedo decirte es que:
No te desanimes. Quizas sea mejor que colgues el componente listo para descargarlo e instalarlo (indicando para que versión de delphi funciona). Si no tenes un espacio para hacerlo, yo te ofrezco colgarlo de mi (futura) web personal aqui en el club, y por lo pronto se puede colocar alli y poner un enlace desde aqui para quien quiera probarlo. hasta luego. ;) |
Cita:
Cita:
Cita:
Cita:
mybox1.botones[indice].caption:= 'hola'; mybox1.botones[indice].glyh.loadfromfile('dibujo.bmp'); Además existe un evento en el mybox llamado "Pulsarboton" que podemos saber que botón ha sido pulsado a través del sender e incluso un indice para poder localizarlo en el array botones: (sender as TMyButtons).caption:= 'hola'; También existe propiedades para cambiar el tamaño de los botones dentro del MyBox como MyButtonsHeight y MyButtonsWidth. Cita:
Te agradezco tus opiniones, de momento aquí se queda el componente, en cuanto lo tenga un poquito más definido te aviso y si quieres lo puedes colocar en tú futura página web, un saludo para todos y gracias. |
CORBATIN
Me tomé la libertad de borrar el mensaje en donde te equivocaste al usar las etiquetas viendo que lo habías repetido posteriormente con el formato correcto. Quizá no te hayas percatado pero te informo que cuando te suceda eso puedes editar tú mismo el mensaje paa hacer las correcciones pertinentes. // Saludos |
Hola corbatín.
En primer lugar, te comento que has encerrado las citas en etiquetas [ code ], cuando debiste hacerlo en etiquetas [ quote ]cita[ /quote ] que queda asi: Cita:
Luego... una última idea, ya que realmente me parece engorroso tener que asignar por código los captions e imagenes de los botones... supongo que ya dependerá de las necesidades de cada uno, pero para hacer algo mas de propósito general, creo que podrias definir una propiedad Captions en el componente, que sea un TStrings, y que al ser asignada escriba el caption de cada botón... igual, podes poner una propiedad glyphs, que se base en un TImageList. O bien que hagas otras dos propiedades arrays para acceder estas propiedades y no directamente a los botones... Hasta luego. ;) |
Aquí estamos otra vez, pido perdón por el error anterior del [code], lo he editado y le ha cambiado los tags pero sigue siendo muy ancho, lo siento.
Cita:
Lo de la propiedad glyphs esta tal y como se hace actualmente con los bitbtn naturales y con respecto a los arrays para acceder a las propiedades y no directamente a los botones, no entiendo lo que quieres decir. Si puedes ser un poco más concreto intentaré hacerlo, pero debes tener en cuenta que ha sido mi primer componente, así que como se suele decir, no le pidas Peras al Olmo jajaja. De todas formas, y como te he dicho anteriormente, si me explicas un poquito mejor lo que quieres decir, lo intentare seguro, un saludo. |
Declarar un par de propiedades propiedad tipo array... de manera que podas hacer:
ButtonBox1.glyphs[1].LoadFromFile('glyph1.bmp'); ButtonBox1.captions[1] := 'Prueba'; en lugar de ButtonBox1.buttons[1].glyph.LoadFromFile('glyph1.bmp'); ButtonBox1.buttons[1].caption := 'Prueba'; es solo un capricho... :p Por otro lado, al haber editado tus etiquetas en el post anterior, en mi navegador ahora se ve perfecto... Hasta luego. ;) |
La franja horaria es GMT +2. Ahora son las 18:15:05. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi