Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Máscaras De Pantalla
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Máscaras De Pantalla 
 
Tengo un ratito y he pensado poner algunas rutinas sencillas para las máscaras de pantalla que es algo sencillito y que igual ayuda a los que empiezan.

Así que partamos de un formulario como este
 instant_nea1
Y sobre este formulario trabajemos los siguientes puntos:
1. Crear el formulario con el label "Nombre" y el textbox "PideNombre"
2. Pinchar el label y Copiar. Luego Pegar, Ubicar el label debajo de 'Nombre y ponerle ' 1º Apellido'
3. Pinchar el textbox PideNombre y Copiar. Luego Pegar. Ubicar el textbox debajo de Pidenombre, Llamarle PideApe1
4. Repetir el mismo proceso para cada objeto hasta conseguir el formulario propuesto. Los nombres de los textboxes son PideNombre, PideApe1,PideApe2,PideDireccion,PidePoblacion,PideCPostal, PideTelefono,PideFax.

Ahora ya tenemos el formulario de pruebas. El siguiente paso va a ser revisar los contenidos. Como los contenidos de estos textboxes van a ir a campos de una tabla pondremos la propiedad maxlength de cada uno de ellos conforme a la longitud del campo que corresponda.

Ahora que ya tenemos puestas las longitudes el siguiente paso es comprobarlas pulsaciones válidas.
Los textboxes Nombre, Ape1,Ape2,Poblacion tienen las mismas características. Deben admitir letras y espacios pero no números. Les ponemos a todos la propiedad group="letras"
Los textboxes PideTelefono y PideFax son iguales. Ambos deben permitir guardar dígitos y espaciosl. Les ponemos a los dos la propiedad group="telef"
El textbox PideCpostal es único porque solo puede contener dígitos sin espacios ni nada. No le pongo group
El textbox PideFecha es único porque debe contener dígitos y caracteres "/-.". No le pongo group.

Para comprobar las pulsaciones de teclas dispongo del evento keypress que se dispara al pulsar una tecla y del evento keyrelease que se dispara al soltarla. Yo voy a usar el evento keypress para evaluar la tecla pulsada y decidir si es correcta en ese lugar.

gambas tiene unas funciones muy prácticas para saber lo que son estas teclas. Son las siguientes
Comprobación de caracteres
Pero existen algunos problemillas porque en español por ejemplo existe la Ñ que estas funciones codificadas para el ingles no lo consideran una letra.
Así pues basándome en estos pequeños problemillas me he creado yo un módulo de comprobación de teclado que es muy sencillito pero soluciona estas cosas. Llamo a esta clase TEC y tiene el siguiente contenido

Función Esletra que devuelve true si una pulsación es letra o false si no lo es
PUBLIC FUNCTION Esletra(l AS String) AS Boolean
DIM R AS Boolean()
IF IsLetter(l) THEN
  r = TRUE
ELSE
  r = EsENe(l)
ENDIF
RETURN r
END

Si Isletter devuelve true es que es letra. Si no lo es pregunta a ver si es Ñ mediante esta funcion
PRIVATE FUNCTION EsENe(l AS String) AS Boolean
DIM r AS Boolean

IF InStr(l, "Ñ") > 0 OR InStr(l, "ñ") > 0 THEN
  r = TRUE
ENDIF
RETURN r
END

Así que en resumidas cuentas cuando llamo a Esletra mira a ver si es letra y si no lo es mira a ver si es ñ y si alguna de las dos circunstancias se dan devuelve true

Tengo también otra rutinita que comprueba si una pulsación es un caracter alfa. Esto es todas las letras (incluída ñ), signos de puntuación y espacio. No incluye números.
PUBLIC FUNCTION EsAlfa(l AS String) AS Boolean
DIM r AS Boolean

r = IsPunct(l)
IF NOT r THEN
  r = Esletra(l)
ENDIF
IF NOT r THEN
  r = IsSpace(l)
ENDIF
RETURN r
END


y tengo otra sencillita para saber si la pulsación es válida para una petición de fechas
PUBLIC FUNCTION EsFecha(l AS String) AS Boolean
  DIM valor AS Boolean
  
  valor = TRUE
  IF l <> Key[":"] THEN
    IF l <> Key["/"] THEN
      IF l <> Key["."] THEN
        IF NOT IsDigit(l) THEN
          valor = FALSE
        ENDIF
      ENDIF
    ENDIF
  ENDIF
  RETURN valor
  
END


También tengo otra función corrientita para saber si la pulsación es de borrado de caracter
PUBLIC FUNCTION EsBorrar(l AS Integer) AS Boolean
  DIM B AS Boolean
  IF l = Key.BackSpace OR l = Key.Delete THEN
    b = TRUE
  ENDIF
  RETURN b
END


Y otra para saber si la pulación se corresponde a flechas del teclado
PUBLIC FUNCTION Esflecha(l AS Integer) AS Boolean
  DIM B AS Boolean
  IF l = Key.right OR l = Key.left OR Key.up OR Key.Down THEN
    b = TRUE
  ENDIF
  RETURN b
END


Así que ahora que os he mostrado estas rutinitas tan simples veremos como programamos los eventos keypress
El keypress de Pidefecha
Para admitir únicamente caracteres válidos para una fecha
sub Pidefecha_keypress()
DIM var AS Boolean = TRUE

SELECT CASE var
  CASE TEC.EsFecha(Key.text) 'válida si es fecha
  CASE TEC.EsBorrar(Key.code) 'válida si es tecla de borrar
  CASE TEC.Esflecha(Key.code) 'válida si es tecla de mover el curor
  CASE ELSE
    STOP EVENT 'cualquier otra anular pulsación
END SELECT

end
[/code]
El keypress para el nombre, apellidos, dirección y poblacion
sub letras_keypress()
DIM var AS Boolean = TRUE

SELECT CASE var
  CASE TEC.EsAlfa(Key.text) 'admitir letras, puntuación, números y espacio
  CASE IsDigit(Key.text) 'admitir dígitos
  CASE IsSpace(Key.text) 'no es necesario porque esalfa ya admite espacios pero para que se vea
  CASE TEC.EsBorrar(Key.code) 'admitir teclas de borrar
  CASE TEC.Esflecha(Key.code) 'admitir teclas de mover el cursor
  CASE ELSE
    STOP EVENT
END SELECT
end

Este evento se aplica a todos los objetos que tengan group "letras" y por tanto a nombre, ape1, ape2, direccion y poblacion

El keypress de telefono y fax
sub telef_keypress()
DIM var AS Boolean = TRUE

SELECT CASE var
  CASE IsDigit(Key.text) 'admitir dígitos
  CASE IsSpace(Key.text) 'admitir espacos
  CASE TEC.EsBorrar(Key.code) 'admitir teclas de borrar
  CASE TEC.Esflecha(Key.code) 'admitir teclas de mover el cursor
  CASE ELSE
    STOP EVENT 'anular las demás
END SELECT
end

este evento se dispara en todos los objetos que tengan por group telef

El Keypress del PideCPostal
Este control debe admitir únicamente dígitos sin espacios ni nada
Sub PideCPostal_keypress()
DIM var AS Boolean = TRUE
sub PideCPostal_keypress
SELECT CASE var
  CASE IsDigit(Key.text)
  CASE TEC.EsBorrar(Key.code)
  CASE TEC.Esflecha(Key.code)
  CASE ELSE
    STOP EVENT
END SELECT
end


Ahora ya tenemos controladas las pulsaciones de todo el formulario.

Destacar el control en el que está el foco
A mi me gusta que al ponerme en un textbox o lo que sea para escribir este se destaque de los demás. Para ello utilizo el evento gotfocus y el lostfocus que se disparan cuando se obtiene y se pierde el foco
Sub PideFecha_GotFocus()
pidefecha.backcolor=color.yellow
end

sub PideFecha_LostFocus()
PideFecha.Backcolor=color.white
end

Hagamos lo mismo para los controles nombre, ape1, ape2,direccion y poblacion. Como hay varios utilizaré el método LAST
Sub Letras_GotFocus()
LAST.backcolor=color.yellow
end

sub Letras_LostFocus()
Last.Backcolor=color.white
end

y los del teléfono
Sub telef_GotFocus()
LAST.backcolor=color.yellow
end

sub Telef_LostFocus()
LAST.Backcolor=color.white
end


Movimiento del ratón
Esto no suelo hacerlo pero ya puestos pues lo cuento. También se puede hacer que se destaquen objetos cuando el ratón pasa sobre ellos o deja de pasar. Son los eventos ENTER y LEAVE
sub PideFecha_Enter()
PideFecha.Backcolor=color.white
end

sub PideFecha_Leave()
PideFecha.Backcolor=color.white
end

Sub Letras_Enter()
LAST.backcolor=color.yellow
end

sub Letras_Leave()
Last.Backcolor=color.white
end

y los del teléfono
Sub telef_Enter()
LAST.backcolor=color.yellow
end

sub Telef_Leave()
LAST.Backcolor=color.white
end

Respecto a los botones
El botón Cancelar debería quitarlo todo así que le pongo un código tan simple como este

Y el botón de Grabar debería comprobar que los datos son correctos y en su caso grabar en una tabla "Datos". Para saber si son datos correctos comprueba que la fecha sea una fecha válida y que se haya metido un nombre y un primer apellido
sub Grabar_click
  DIM Cn AS NEW Connection, Rs AS Result, Valido AS Boolean
  
  Valido = ComprobarDatos
  IF valido THEN
    Cn = Conectar()
    Rs = Cn.Create("Datos")
    rs!nombre = PideNombre.Text
    rs!ape1 = PideApe1.Text
    rs!ape2 = pideape2.text
    rs!telefono = PideTelefono.Text
    rs!pidefax = PideFax.Text
    rs!poblacion = PidePoblacion.Text
    rs!PideCPostal = PideCPostal.Text
    rs!pidefecha = PideFecha.Text
    rs.update
    ME.close
endif
end


Y la función que comprueba es la siguiente
private function ComprobarDatos() as boolean
dim Valor as boolean=true
if not isdate(PideFecha.text) then 'si no es fecha
   valor=false
endif
if not pideNombre.text or  not valor then 'si hubo error antes o no hay un nombre
   valor=false
endif
if not pideApe1.text or  not valor then 'si hubo error antes o no hay un ape1
   valor=false
endif
return valor
end


Todo esto es muy básico pero son las cosas que dan dolores de cabeza cuando se empieza y lo pongo en parte para animar a la gente a que se anime a probar gambas y en parte porque no puedo dormir.

 
 



 
última edición por soplo el Viernes, 13 Noviembre 2009, 22:08; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Máscaras De Pantalla 
 
Ahora voy a utilizar otro formulario junto con el anterior para montar un sencillo sistema de altas, bajas y modificaciones.

Primero voy a crear un formulario nuevo donde aparece una lista de todos los los clientes en un gridview. En ese formulario hay tres botones (agregar, modificar, borrar)

Este es el formulario de clientes:
 instant_nea2_1257876914_238774

Así que empecemos con el código
Sub Form_Open()
DIM Cn AS NEW Connection, Rs AS Result
  
  ME.Center 'centrar formulario
  
  cuadro.columns.Count = 6 'número de columnas del gridview
  cuadro.mode = 1 'seleccionar columnas enteras
  
  cn = BD.ConectarBd()
  rs = cn.EXEC("select * from clientes order by nombre")  
  cuadro.Columns[0].text = "Codigo"
  cuadro.Columns[0].Width = 50
  cuadro.Columns[1].text = "Nombre"
  cuadro.Columns[1].Width = 150
  cuadro.Columns[2].text = "Dni"
  cuadro.Columns[2].Width = 75
  cuadro.Columns[3].text = "Email"
  cuadro.Columns[3].Width = 200
  cuadro.Columns[4].text = "Teléfono"
  cuadro.Columns[4].Width = 75
  cuadro.Columns[5].text = "Móvil"
  cuadro.Columns[5].Width = 75
  LlenarCuadro(cn, rs)
END

Con esto ya he definido columnas y cabeceras del gridview. Ahora meterle datos
Observad que cada línea se escribe alternando en un color u otro.
De ahora en adelante cada vez que desee llenar el formulario llamaré a llenarcuadro()
PRIVATE SUB LlenarCuadro(Cn AS Connection, Rs AS result)
  DIM MiColor AS Integer, MiColor2 AS Integer, Contador AS Integer = 0
  cuadro.Clear
  rs.MoveLast
  cuadro.Rows.count = rs.Count 'saber cuantas filas tendrá el gridview
  rs.MoveFirst
  DO WHILE rs.Available
    micolor = IIf(rs!activo, Color.Black, Color.blue) 'elegir color 1
    micolor2 = IIf(rs!activo, Color.White, Color.LightBackground) 'elegir color 2
    cuadro[contador, 0].ForeColor = micolor
    cuadro[contador, 0].backcolor = micolor2
    cuadro[Contador, 0].text = rs!codigo
    cuadro[Contador, 1].text = rs!nombre
    cuadro[contador, 1].ForeColor = micolor
    cuadro[contador, 1].backcolor = micolor2
    cuadro[Contador, 2].text = rs!dni
    cuadro[contador, 2].ForeColor = micolor
    cuadro[contador, 2].backcolor = micolor2
    cuadro[Contador, 3].text = rs!email
    cuadro[contador, 3].ForeColor = micolor
    cuadro[contador, 3].backcolor = micolor2
    cuadro[Contador, 4].text = rs!telefono
    cuadro[contador, 4].ForeColor = micolor
    cuadro[contador, 4].backcolor = micolor2
    cuadro[Contador, 5].text = rs!movil
    cuadro[contador, 5].ForeColor = micolor
    cuadro[contador, 5].backcolor = micolor2
    contador += 1
    rs.MoveNext
  LOOP
  
END

Si nos fijamos la primera columna contiene el código de cada cliente. Lo utilizaremos para identificar al cliente que tenemos elegido para modificarlo o borrarlo.

Ahora el código del botón 'agregar' que usaremos para crear un cliente nuevo
sub Agregar_Click()
DIM Ficha AS NEW ClientesFicha 'este es el nombre figurado del formulario del post anterior
  Ficha.Load 'cargarlo en memoria sin mostrarlo
  Ficha.Cambiar.tag = 1 'ponerle una variable que indica que quiero insertar dato
  Ficha.ShowModal() 'mostrar el formulario a rellenar
  LlenarCuadro() 'Borrar los datos actuales del gridview y volver a llenar
END

Ahora el código del botón de borrar
PUBLIC SUB Borrar_Click()

  DIM Cn AS NEW Connection
  Dim CodigoCliente as integer
  CodigoCliente=cuadro[cuadro.row,0].text 'el dato de la primera columna de la fila seleccionada
  Cn = BD.ConectarBd() 'conectar a base de datos
  cn.delete("clientes","codigo=&1",CodigoCliente) 'borrar el cliente con ese codigo
  LlenarCuadro() 'repintar el gridview con los datos correctos
END


Ahora el código del botón de modificar
DIM Ficha AS NEW ClientesFicha, Cn AS NEW Connection, Rs AS Result, CodigoCliente as integer
  Ficha.Load
  Ficha.text = "Modificar Empleado"
  Ficha.Cambiar.text = "&Modificar"
  Ficha.tag = cuadro[cuadro.row, 0].Text
  Ficha.Cambiar.tag = 2 'ponerle al formulario una variable que indica que deseo modificar dato
  Cn = BD.ConectarBd()
  CodigoCliente=cuadro[cuadro.row, 0].Text 'el código del cliente que queremos modificar
  Rs = Cn.Find("empleados", "codigo=&1",CodigoCliente ) 'buscar el cliente en la tabla
  WITH Ficha  'copiar los datos del registro al formulario. Notar que los controles del formulario son públicos.
    .Pidenombre.text = cuadro[cuadro.Row, 1].Text
    .PideApe1.text = rs!ape1
    .PideApe2.Text = rs!ape2
    .pidedireccion.Text = rs!direccion
    .PidePoblacion.Text = rs!poblacion
    .PideCPostal.Text = rs!cp
    .PideTelefono.Text = rs!telefono
    .PideFax.Text = rs!movil
    .Showmodal() 'mostrar el formulario de ficha del cliente con sus datos
  END WITH
  LlenarCuadro() 'mostrar el gridview con los datos actualizados

END


Así que de una forma tan simple ya tenemos un formulario que muestra una lista de clientes con posibilidad de agregar nuevos, modificarlos o borrarlos y que tiene este aspecto
 instant_nea3

Por último recuerdo que teníamos en el formulario anterior el botón de grabar que tenía este código
sub Grabar_click
  DIM Cn AS NEW Connection, Rs AS Result, Valido AS Boolean
  
  Valido = ComprobarDatos
  IF valido THEN
    Cn = Conectar()
    Rs = Cn.Create("Datos")
    rs!nombre = PideNombre.Text
    rs!ape1 = PideApe1.Text
    rs!ape2 = pideape2.text
    rs!telefono = PideTelefono.Text
    rs!pidefax = PideFax.Text
    rs!poblacion = PidePoblacion.Text
    rs!PideCPostal = PideCPostal.Text
    rs!pidefecha = PideFecha.Text
    rs.update
    ME.close
endif
end

pero ahora tenemos que hacer algún pequeño cambio porque ahora ese botón sirve para agregar un cliente nuevo cuanto me.tag=1 y para modificarlo cuando me.tag=2
sub Grabar_click()
  DIM Cn AS NEW Connection, Rs AS Result, Valido AS Boolean, CodigoCliente as integer
  
  Valido = ComprobarDatos
  IF valido THEN
     Cn = Conectar()

     if me.tag=1 then 'queremos agregar un cliente
          Rs = Cn.Create("Datos")
     else 'queremos modificar cliente
        CodigoCliente=Principal.Cuadro[cuadro.row,0].text 'guardar el código de cliente seleccionado
        Rs=Cn.edit("Cliente","Codigo=&1",CodigoCliente) 'Buscar el cliente
     endif
  
    rs!nombre = PideNombre.Text
    rs!ape1 = PideApe1.Text
    rs!ape2 = pideape2.text
    rs!telefono = PideTelefono.Text
    rs!pidefax = PideFax.Text
    rs!poblacion = PidePoblacion.Text
    rs!PideCPostal = PideCPostal.Text
    rs!pidefecha = PideFecha.Text
    rs.update
    ME.close
endif
end


Con lo que ahora el botón de grabar mira si me.tag=1 o 2. Si es uno hace lo de grabar y si es 2 modifica.
En cualquiera de ambos casos se hace me.close (se cierra) y el formulario principal que estaba detrás sigue con la secuencia que es LlenarCuadro que lo que hace es poner de nuevo el GridView con los datos nuevos.

¡que simple! ¡Dos formularios y tres rutinas pequeñitas.
 



 
última edición por soplo el Miercoles, 11 Noviembre 2009, 18:46; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Máscaras De Pantalla 
 
Bueno no se si es el lugar correcto para hacer una pregunta pero nos hemos digitado cada funcion y hemos colocadom en una clase ETEC. pero como hacemos para quye se aciven estas funciones.

Gracias
 



 
emiliogm - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Máscaras De Pantalla 
 
No entiendo tu pregunta emiliogm.

He puesto eso para que los que quieran iniciarse tengan un ejemplo por donde empezar. Pregunta lo que quieras, pero si no te entiendo no responderé bien.

 
 



 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Máscaras De Pantalla 
 
Creo que ya te he entendido emiliiogm. Tu te has pasteado todo eso en una clase y no sabes como hacer que funcione.

Eso es porque es tu primer intento en gambas y no entiendes como funcionan las clases.

Lo que tienes que meter en una clase a la que en mi ejemplo llamo TEC son las rutinas Esletra, EsEne, EsAlfa, EsFecha, Esborrar y EsFlecha.

No las tienes que escribir. Te las puedes pastear. Así que creas un proyecto, en él creas una clase nueva, le llamas TEC y le metes esas rutinas.

Luego agregas un formulario nuevo que se llamará ClientesFicha y en él haces todo lo que pone el primer formulario. Ahí se explican los textbox (cada cual con su nombre para que el código funcione bien).

Cuando tengas todos sus controles tendrás que hacerles sus rutinas. Al hacer doble click en el formulario se abrirá el editor de código y pasteas allí las rutinas restantes pidefecha_keypress, letras_keypress(), telef_keypress(), PideCpostal_keypress(), PideFecha_Gotfocus(), PideFecha_LostFocus(), Letras_GotFocus(), Letras_LostFocus(), Telef_Gotfocus(), Telef_LostFocus(), PideFecha_Enter(), PideFecha_Leave, Letras_Enter, Letras_Leave, Telef_enter, Telef_leave
Y metes allí también el grabar_click que está en el segundo post que según el caso agrega o modifica.

Cuando ya tengas el formulario ClientesFicha te vas al formulario principal (que se llamará Fmain) y allí pones todo lo que indica el segundo post (el de agregar, quitar, etc.) y allí pones los botones, el gridview, le pones por nombre CUADRO y pasteas el código de los botones.

Te lo he puesto a huevo.
 



 
soplo - 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 Pantalla De Bienvenida anahaga General 2 Martes, 09 Noviembre 2010, 09:50 Ver último mensaje
jsbsan
No hay nuevos mensajes La Pantalla Del Gestor De Empaquetado Se S... alki General 2 Sabado, 02 Julio 2011, 22:38 Ver último mensaje
alki
No hay nuevos mensajes Resolucion De Pantalla De Un Programa SergioDanyelpy General 4 Miercoles, 04 Septiembre 2013, 18:03 Ver último mensaje
jsbsan
No hay nuevos mensajes Pantalla De Despedida. Como??? fedefunes Aplicaciones/Fragmentos de Código 2 Jueves, 19 May 2016, 13:49 Ver último mensaje
fedefunes
 

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

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
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