Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Cómo Conocer El Tipo De Control [Solucionado]
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Cómo Conocer El Tipo De Control [Solucionado] 
 
En la misma línea que mi mensaje sobre cómo acceder a un control por el nombre, me gustaría saber si alguno sabe cómo averiguar el tipo de un control cuando recorres la colección Children de un contenedor.
Lo que busco es saber si se puede hacer algo como esto:
Supongamos que quiero asignar 123456 a todos los campos de un formulario. Para ello creo una procedimiento asignoNumero que recibe la referencia al formulario:

private sub asignoNumero(oContenedor as form)
  dim micontrol as object
  dim mivar as variant
  mivar = 123456
  foreach micontrol in oContenedor.Children
      if micontrol.type = db.textbox  then  ' o algo parecido. Esto es lo que busco
          micontrol.text = mivar  
      else if micontrol.type=db.valuebox then  'etc. etc.
          micontrol.value = mivar
      endif
  next
end
 


¿Alguna Idea?
 




===================
No podemos regresar
 
última edición por shordi el Miercoles, 18 Noviembre 2009, 19:19; editado 2 veces 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control 
 


typeof

¿Te refieres a esto?
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control 
 
Citar:

private sub asignoNumero(oContenedor as form)
   dim micontrol as object
   dim mivar as variant
   mivar = 123456
   foreach micontrol in oContenedor.Children
       if micontrol.type = db.textbox  then  ' o algo parecido. Esto es lo que busco
           micontrol.text = mivar  
       else if micontrol.type=db.valuebox then  'etc. etc.
           micontrol.value = mivar
       endif
   next
 end
 



Así podés hacerlo:

PRIVATE SUB asignoNumero(oContenedor AS Form)
   DIM micontrol AS OBJECT
   DIM mivar AS VARIANT
   mivar = 123456
   FOR EACH micontrol IN oContenedor.Children
       IF micontrol IS TEXTBOX  THEN
           micontrol.Text = mivar  
       ELSE IF micontrol IS VALUEBOX THEN
           micontrol.Value = mivar
       ENDIF
   NEXT
 END
 

 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control 
 
Pues no. TypeOf devuelve el tipo de variable, en este caso siempre 16, que quiere decir objeto, porque estamos tratando con controles.
Lo que quiero averiguar es la clase a la que pertenece el objeto, si es textbox, valuebox, combobox o lo que sea...
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control 
 
Acabo de encontrar la solución. Resulta que existe la clase estática Object, que dispone de una serie de métodos para manipular objetos. Entre ellos
el metro type que devuelve el nombre de la clase.

Así, el código sería:

private sub asignoNumero(oContenedor as form)
  dim micontrol as object
  dim mivar as variant
  mivar = 123456
  foreach micontrol in oContenedor.Children
      if object.type(micontrol) = "TextBox"  then
          micontrol.text = mivar  
      else if object.type(micontrol) = "ValueBox" then  
          micontrol.value = mivar
      endif
  next
end
 


Realmente gambas carece de documentación por esas redes de Dios, que encontrar esto me ha costado un güebo. Supongo que eso es un mal endémico en los desarrollos acelerados...
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control [Solucionado] 
 
Gracias fabianfv, hemos cruzado las respuestas y no había leído tu solución... tal vez hasta más clara que la mía.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control [Solucionado] 
 
No entiendo typeof porque efectivamente siempre devuelve 16 que es el valor de la constante gb.object.

mirando la documentación veo que en gambas 3 habrá dos nuevos métodos para objetos
object.class devuelve la clase a la que pertenece object
object.type devuelve el nombre de la clase a la que pertenece object.

He probado con "is" tal como dice la documentación y tampoco consigo resultados
Dim o as object
 ...
  FOR EACH o IN ME.Children
    DEBUG o is "TextBox"
  NEXT


Y tampoco consigo resultados. Evidentemente estoy usando estas cosas mal por no saber. Ya por probar pongo un formulario con un textbox diseñado en el formulario y añado uno dinámicamente y pruebo
DIM O AS Object
  DIM T AS TextBox
  t = NEW TextBox(ME)
  t.x = 200
  t.y = 200
  
  FOR EACH o IN ME.Children
    DEBUG o IS "TextBox",
  NEXT


Y todo es false. Según ese IS no hay ningún textbox en el formulario.
 



 
última edición por soplo el Miercoles, 18 Noviembre 2009, 20:05; editado 3 veces 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control [Solucionado] 
 
Citar:

He probado con "is" tal como dice la documentación y tampoco consigo resultados


IS compara tipos de datos no cadenas de caracteres, por lo que debes quitar las comillas:

Dim o as object
 ...
  FOR EACH o IN ME.Children
    DEBUG o is TextBox 'No "TextBox"
  NEXT
 


Object.Type(o) devuelve el nombre del tipo de datos (en nombre de clase) como un string y su argumento debe ser de tipo Object.

Object.Is(o, "TextBox") devuelve un Boolean, su primer argumento es de tipo Object y el segundo argumento debe ser de tipo String (el nombre de una clase).

Estas posibilidades brindan mucha flexibilidad cuando se necesita saber el tipo de un objeto:


PRIVATE SUB asignoNumero(oContenedor AS Form)
DIM micontrol AS Object
DIM mivar AS Variant

    mivar = 123456

    FOR EACH micontrol IN oContenedor.Controls
        SELECT CASE Object.Type(micontrol)
          'Notar que se deben respetar las mayúsculas y minúsculas en el nombre de la clase: "TextBox" no "TEXTBOX"
          'o usar UCase(Object.Type(micontrol)) y comparar siempre contra mayúsculas.
           CASE "TextBox"
              micontrol.Text = mivar  
           CASE "ValueBox"
              micontrol.Value = mivar
        END SELECT
    NEXT

END

PRIVATE SUB MostrarUOcultarBtnsBarraHerr()
DIM control AS Object

  'Observar que se puede usar una coleccion cualquiera de objetos en lugar de Me.Controls
  FOR EACH control IN ME.Controls
  
    'Lo mismo seria:
    'IF control IS ToolButton THEN
    IF Object.Is(control, "ToolButton") THEN
      control.Visible = NOT control.Visible
    ENDIF

  NEXT

END

 

 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
última edición por fabianfv el Miercoles, 18 Noviembre 2009, 20:53; editado 2 veces 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Cómo Conocer El Tipo De Control [Solucionado] 
 
ah, eso

Sin comillas si me funciona. Voy a seguir probando a ver que cosas saco.
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
10.00 10 10 1
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

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
No puede descargar archivos
No puede publicar eventos en el calendario