Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 2 de 2
Ir a la página Anterior  1, 2
 
Crear Controles En Tiempo De Ejecución...
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Re: Crear Controles En Tiempo De Ejecución... 
 
¿Y por qué no puedes hacer lo siguiente?

public sub btnPaleta_click()
HacerLoQueSea(last.tag)
end


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?

 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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!      
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

PRIVATE function obtenercoleccion(f AS form) AS Integer
  DIM B AS control, Var AS String, contador AS Integer
  
  FOR EACH b IN f.Controls
    var = b.name
    IF var = "MiBoton" THEN  
      contador += 1
    ENDIF      
  NEXT
return contador  
END


Así queda muy clarito je je je
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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

pantallazoiz

Gracias por estar a la orden siempre... Ya volveré con más preguntas ...ja ja ja ja!
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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
private function Obtenertag(valor as integer)
dim tag as integer=valor+10

if valor>8 then'de segunda fila en adelante
   tag +=2 'sumarle dos mas
endif
return tag
end

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
private sub CambiarBoton( boton as button)
boton.backcolor=color.grey
end


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 ...
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"?  
 



 
ariel - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:
Public Sub Form_Open()


  Dim X As Integer = 8
  Dim Y As Integer = 8
  Dim Xini As Integer = 8
  Dim bucle As Integer
  Dim BotonUsuario As Button
  
  Me.Center
  
  
  For bucle = 0 To 34
    BotonUsuario = New Button(Me) As "PaletaBotonesUsuarios"
    BotonUsuario.Tag = bucle  
    BotonUsuario.Text = "NOMBRE USUARIO"
    BotonUsuario.X = X
    BotonUsuario.Y = Y
    BotonUsuario.W = 130
    BotonUsuario.H = 130
    X += 130 + 4
    If bucle = 8 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
Public Sub PaletaBotonesUsuarios_Click()
  
  Select Case (Last.Tag)
    Case 0
      Message.Info("has pulsado el boton " & Last.Tag)
    Case 1
      Message.Info("has pulsado el boton " & Last.Tag)
  End Select
  
End
 

 



 
aratar79 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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"
 
jguardon - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje 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:
Public Function NumeroUsuario() As Integer
  Dim resulta As Result
  Dim numero As Integer
  ModCon.conectar()
  resulta = ModCon.$con.Exec("Select count(*) as contador from Usuarios")
  numero = resulta!contador
  ModCon.$con.Close
  Return numero
End
Public Function NombreUsuario(id As Integer) As String
  
  Dim resulta As Result
  Dim Usuario As String
  ModCon.conectar()
  resulta = ModCon.$con.Exec("select NombreCorto from Usuarios where idUsuario = '" & id & "'")
  Usuario = resulta!NombreCorto
  ModCon.$con.Close
  Return Usuario
  
End
 

y me ha quedadao asi
 capturapantalla
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.
 



 
aratar79 - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes ¿formularios En Tiempo De Ejecución O En... jsoto61 General 1 Jueves, 10 Diciembre 2009, 00:54 Ver último mensaje
fabianfv
No hay nuevos mensajes Crear Columnview En Tiempo De Ejecución D... aristicol Controles/Librerías/Componentes 5 Jueves, 30 Junio 2011, 18:43 Ver último mensaje
shordi
No hay nuevos mensajes Cambiar De Gb.qt4 A Gb.qtk En Tiempo De Ej... jsbsan General 1 Domingo, 14 Julio 2013, 21:46 Ver último mensaje
jguardon
No hay nuevos mensajes Crear Controles En Tiempo De Ejecución: F... jsbsan Programación en otros lenguajes 2 Sabado, 06 Diciembre 2014, 19:17 Ver último mensaje
jsbsan
 

Publicar nuevo tema  Responder al tema  Página 2 de 2
Ir a la página Anterior  1, 2

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron