Autor |
Mensaje |
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Crear Controles En Tiempo De Ejecución...
¿Y por qué no puedes hacer lo siguiente?
private sub HacerLoQueSea(Ind as integer)
'Aquí sé que el primer botón tiene indice 0, el último tiene índice btn.max y el pulsado es Ind)
end
Estuve varios meses sin usar gambas y no estoy seguro ahora si es correcto eso de btn.max, pero aunque no lo fuera (que todo es probarlo) podrías usar la colección controls del formulario osea que de una forma u otra obtienes el número máximo de elementos que componen btnPaleta.
En esas condiciones ¿que es lo que no puedes hacer? ¿a qué propiedad de que botón no puedes llegar para hacer lo que quieras? ¿Qué cálculo no puedes realizar?
|
#11 Lunes, 25 Octobre 2010, 01:35 |
|
|
ariel
Aprendiz
Registrado: Octobre 2009
Mensajes: 51
Edad: 55
|
Re: Crear Controles En Tiempo De Ejecución...
Ahhhhhhhhh,, eso no lo conocía!!!
Concretamente, lo que tengo que hacer en este caso es que cada vez que se pone o saca la marca del "checkbox" de una fila, al lado me aparezca el código hex que se forman con el valor de cada casilla, tomando los marcados como "1" y los sin marcar como "0". Multiplicando el primero de la fila (supongamos que son 8, no 16) por 128, el segundo por 64, el tercero por 32, etc, hasta llegar al ultimo que lo multiplicaría por uno, podría obtener ese valor.
CREO que con lo que me acabas de decir podria funcionar. Mañana te cuento!
Y....MUCHAS GRACIAS!
|
#12 Lunes, 25 Octobre 2010, 02:27 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Crear Controles En Tiempo De Ejecución...
He probado a obtener el número de instancias que hay en un determinado formulario y me ha costado un poco. Ya me sonaba a mi que eso del max no funciona con colecciones.
Bueno, te dejo un código que crea diez botones en un formulario y luego llama a una rutina que calcula cuantos botones de esa instancia se han creado. Es una chorrada pero bueno por dejar bien lo que escribí antes.
Rutina que crea diez botones en el formulario
PUBLIC SUB Button1_Click()
DIM x AS Integer, f AS Button, Cuenta as integer
FOR x = 0 TO 9
f = NEW button(ME) AS "grupo"
f.tag = x
'Todos los botones que creo de este tipo tienen ese name.
'Quizá haya otros botones en el formulario pero los que me interesa contar son estos
f.name = "MiBoton"
NEXT
Cuenta=obtenercoleccion(ME) 'le paso el formulario actual como argumento
END
Como ves nada nuevo. Ahora la función que recibe como argumento un formulario y cuenta cuantos botones de nombre "MiBoton" hay en el formulario que se entrega como argumento
Así queda muy clarito je je je
|
#13 Lunes, 25 Octobre 2010, 04:35 |
|
|
ariel
Aprendiz
Registrado: Octobre 2009
Mensajes: 51
Edad: 55
|
Re: Crear Controles En Tiempo De Ejecución...
La verdad es que lo tienes muy claro!
No me sirve para lo que quiero ahora, pero me lo he anotado para el futuro
Al final me he hecho los botones uno por uno, y escrito código en todos ellos. La cosa funciona, solo que es bastante largo el fuente, pero....no hay problemas
Gracias por estar a la orden siempre... Ya volveré con más preguntas ...ja ja ja ja!
|
#14 Martes, 26 Octobre 2010, 00:25 |
|
|
soplo
Analista Programador
Registrado: Septiembre 2009
Mensajes: 843
Edad: 44
|
Re: Crear Controles En Tiempo De Ejecución...
¿como que no te sirve? ¡Claro que sirve!
No había leído bien tu problema. Resulta que siempre son 64 botones.
Este es el famoso bucle
For i = 0 To 256
btn = New Button(Me) As "btnPaleta" ' Se crea un botón en el form, que será parte del grupo btnPaleta
btn.tag=x 'En el tag queda la instancia que corresponde a cada botón
btn.X = X
btn.Y = Y
btn.W = 16
btn.H = 16
X += 16 ' Se aumenta X
Y += 16 ' Se aumenta Y
Next
Y ahora pensemos en ese tag. Puedes darle el valor que quieras (por ejemplo para el valor X=5 y el valor y=3 el tag podría ser el 53 y así conocer fila y columna por ejemplo. Una representación de esa cuadrícula sería
01 02 03 04 05 06 07 08
09 10 11 12 13 14 15 16
...
...
Pero nosotros queremos que sea así
11 12 13 14 15 16 17 18
21 22 23 24 25 26 27 28
...
Donde cada tag es [FILA][COLUMNA]. El tag 25 corresponde a la fina 2 y columna 5 por ejemplo. Para conseguir esto vemos que la primera fila es el índice +10 así que ya sabemos que si el índice es menor que 9 al índice le sumamos 10
Para obtener la segunda fila lo que hacemos es sumar 12 en vez de 10. Tu bucle quedaría así
For i = 0 To 256
btn = New Button(Me) As "btnPaleta" ' Se crea un botón en el form, que será parte del grupo btnPaleta
btn.tag=obtenertag(x) 'En el tag queda la instancia que corresponde a cada botón
btn.X = X
btn.Y = Y
btn.W = 16
btn.H = 16
X += 16 ' Se aumenta X
Y += 16 ' Se aumenta Y
Next
Y x sería algo como esto
Solo es un ejemplo. EL tag 37 corresponde al botón de la fila 3 y columna 7. También puedes hacer al revés. a la fina 3 y columna 7 (37) le restas 12 y obtienes el índice excepto si la fina es 1 (en ese caso restas 10).
Puedes hacer lo que quieras. De hecho por poder dado que puedes localizar el botón que quieras por poder puedes pasar ese botón a una función que hará con él lo que quieras
No veo que es lo que no puedes hacer la verdad.
Por cierto ahora que me fijo. No sé porque el bucle es de 0 a 256. Eso no es conguente porque son 257 combinaciones. De 1 a 256 o bien de 0 a 255. De hecho si lo que quieres es fuentes podría bastarte con las letras mayúsculas, minúsculas, y ñ pero bueno ...
|
#15 Martes, 26 Octobre 2010, 02:22 |
|
|
ariel
Aprendiz
Registrado: Octobre 2009
Mensajes: 51
Edad: 55
|
Re: Crear Controles En Tiempo De Ejecución...
Ja ja ja ja!
Debe ser que YO no me doy cuenta...
En este momento tengo implementadas 8 rutinas similares a esta:
PUBLIC SUB CalculoFila1()
lbl_fila1.text = -1 * (ToggleButton1.Value * 128 + ToggleButton2.Value * 64 + ToggleButton3.Value * 32 + ToggleButton4.Value * 16 + ToggleButton5.Value * 8 + ToggleButton6.Value * 4 + ToggleButton7.Value * 2 + ToggleButton8.Value * 1)
lbl_fila1hex.text = "0x" & Hex$(lbl_fila1.text, 2)
END
¿Como puedo reemplazar eso por el esquema del "tag"?
|
#16 Martes, 26 Octobre 2010, 08:32 |
|
|
aratar79
Aprendiz
Registrado: Agosto 2012
Mensajes: 66
Edad: 45 Ubicación:
|
Re: Crear Controles En Tiempo De Ejecución...
Hola chicos buscando información sobre crear controles en tiempo de ejecución he encontrado este hilo, hace tiempo que había dejado un proyecto aparcado por falta de tiempo que he vuelto a retomar, con este proyecto mi intención es aprender a programar con gambas.
Chicos he creado un formulario con varios botones, pero no doy en como ponerle un nombre o una imagen diferente o un color diferente en cada boton?.Gracias chicos.
aqui dejo el codigo:
|
#17 Jueves, 28 Marzo 2013, 03:48 |
|
|
Shell
Analista Programador
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
|
Re: Crear Controles En Tiempo De Ejecución...
Aratar79:
¿ Y por que no puedes ?.
Tienes que tener una propiedad para eso en el botón.
También dispones del componente colorboton.
¿ Donde no puedes ?.
Si tienes BotonUsuario, usa la propiedad Picture de este.Tendrás que crear un array de botones, dar
las propiedades a BotonUsuario y añadir este botón al array de botones.
Lo mejor seria crear un array de imágenes, añades todas las imágenes a este array y luego
en el bucle que creas los botones. A la propiedad Picture del botón le asignas una imagen del array.
Saludos
=================== Gambas Básico
"No es un bug, es una característica no documentada"
|
#18 Jueves, 28 Marzo 2013, 10:21 |
|
|
jguardon
Administrador
Registrado: Septiembre 2009
Mensajes: 2708
Edad: 57 Ubicación: Granada
|
Re: Crear Controles En Tiempo De Ejecución...
Lo que dice Shell es muy fácil, esto es básicamente:
Añade esta línea junto a las declaraciones de variables locales:
Dim nombresdeboton as New String[] = ["Boton1", "BotonDos", "BotonThree", "BotonN"...."así hasta los 34 que tienes"]
Luego más abajo, donde asignas la propiedad Text a cada botón cambia BotonUsuario.Text = "NOMBRE USUARIO" por esto:
BotonUsuario.Text = nombresdeboton[bucle]
En cada iteración del bucle estarás asignando los elementos del array nombresdeboton[] identificados por su posición dentro del array mediante el entero "bucle".
Así por ejemplo, nombresdeboton[0] corresponderá a la cadena "Boton1", nombresdeboton[1] a "BotonDos" y así sucesivamente.
Lo mismo es aplicable para el resto de propiedades que quieres modificar.
Saludos
=================== Jesús Guardón
Por favor, usemos el corrector ortográfico antes de pulsar el botón "Enviar".
"uo ǝs ʇɐu pıɟıɔıן ɐdɹǝupǝɹ ɐ dɹoƃɹɐɯɐɹ, soןo ɥɐʎ bnǝ dɹodouǝɹsǝןo"
|
#19 Jueves, 28 Marzo 2013, 10:57 |
|
|
aratar79
Aprendiz
Registrado: Agosto 2012
Mensajes: 66
Edad: 45 Ubicación:
|
Re: Crear Controles En Tiempo De Ejecución...
Gracias chicos como siempre rapido i efectivo, adoro esta comunidad, ayer hice un intento y me quedo de la siguiente manera no se si es la correcta, no había visto vuestra respuesta todavía:
Public Sub Form_Open()
Dim X As Integer = 8
Dim Y As Integer = 8
Dim bucle As Integer
Dim NumUsers As Integer = ModCon.NumeroUsuario()
Dim BotonUsuario As New Button[NumUsers]
Me.Center
For bucle = 0 To NumUsers - 1
BotonUsuario[bucle] = New Button(PortadaUno) As "PaletaBotonesUsuarios"
BotonUsuario[bucle].Tag = bucle
BotonUsuario[bucle].X = X
BotonUsuario[bucle].Y = Y
BotonUsuario[bucle].W = 130
BotonUsuario[bucle].H = 130
BotonUsuario[bucle].Background = 20
BotonUsuario[bucle].Foreground = 111111
BotonUsuario[bucle].Text = ModCon.NombreUsuario(bucle + 1)
X += 130 + 4
If bucle = 6 Then
Y += 130 + 4
X = 8
Endif
If bucle = 17 Then
Y += 130 + 4
X = 8
Endif
If bucle = 26 Then
Y += 130 + 4
X = 8
Endif
Next
End
aqui dejo el codigo de las dos funciones:
y me ha quedadao asi
Ahora lo siguiente es que lo botones hagan lo que yo quiero, me pongo a ello y lo cualgo en cuanto lo tenga.
Muchas gracias chicos.
|
#20 Jueves, 28 Marzo 2013, 16:09 |
|
|
|