TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: groundman en 26 de Febrero de 2009, 19:17:07

Título: activar un evento para un conjunto de componentes
Publicado por: groundman en 26 de Febrero de 2009, 19:17:07

hola.como puedo simplificar lo de abajo?me refiero a no tener que nombrar tantos condicionales para modificar la propiedad de los botones.


Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If MSComm1.PortOpen = True Then Command9.Enabled = False
If MSComm1.PortOpen = False Then Command9.Enabled = True

If MSComm1.PortOpen = False Then Command1.Enabled = False
If MSComm1.PortOpen = False Then Command2.Enabled = False
If MSComm1.PortOpen = False Then Command3.Enabled = False
If MSComm1.PortOpen = False Then Command4.Enabled = False
If MSComm1.PortOpen = False Then Command5.Enabled = False
If MSComm1.PortOpen = False Then Command6.Enabled = False
If MSComm1.PortOpen = False Then Command7.Enabled = False
If MSComm1.PortOpen = False Then Command8.Enabled = False
If MSComm1.PortOpen = True Then Command1.Enabled = True
If MSComm1.PortOpen = True Then Command2.Enabled = True
If MSComm1.PortOpen = True Then Command3.Enabled = True
If MSComm1.PortOpen = True Then Command4.Enabled = True
If MSComm1.PortOpen = True Then Command5.Enabled = True
If MSComm1.PortOpen = True Then Command6.Enabled = True
If MSComm1.PortOpen = True Then Command7.Enabled = True
If MSComm1.PortOpen = True Then Command8.Enabled = True
Título: Re: activar un evento para un conjunto de componentes
Publicado por: PalitroqueZ en 26 de Febrero de 2009, 19:36:13
la respuesta es usar un array de controles.

- pegas un commandbutton la primera vez
- copias dicho commandbutton y pegas, te preguntará si deseas crear un arreglo de botones, le dices que si
- ahora todos los commandbutton tienen el mismo nombre, solo que cambia el índice.

con un bucle puedes recorrer los botones.

for n=0 to 7
   Command1(n).enable=false
next n

no he probado hacer arrays con el mscomm, intenta a ver.

Título: Re: activar un evento para un conjunto de componentes
Publicado por: groundman en 26 de Febrero de 2009, 20:03:07
gracias.provare a ver.
Título: Re: activar un evento para un conjunto de componentes
Publicado por: groundman en 26 de Febrero de 2009, 20:18:09
ya hace tiempo intente hacer un array de controles bottom pero parece que no puedo ejecutar diferentes ejecuciones con el evento clic.
parece ser que aunque hay varios botones en el formulario con diferentes extensiones command11(1) y command11(2) etc.
se ejecuta solo una linea de codigo para todos los botones.cuando lo que quiero es que cada boton sea independiente.
no se si me explico.
Título: Re: activar un evento para un conjunto de componentes
Publicado por: migsantiago en 26 de Febrero de 2009, 20:25:04
En la función que se ejecuta con el evento de todos esos botones hay un parámetro que indica qué botón es el que la activó.

Private Sub Command1_Click(Index As Integer)

End Sub

Index entrega el número del objeto que llamó al evento (al menos en VB6).

Después con el index ya puedes actuar respecto al botón específico.
Título: Re: activar un evento para un conjunto de componentes
Publicado por: jfh900 en 26 de Febrero de 2009, 20:31:28
No programo en Visual Basic, pero por la estructura del programa yo pondría como una primera aproximación:

Command1.Enabled = MSComm1.PortOpen
Command2.Enabled = MSComm1.PortOpen
Command3.Enabled = MSComm1.PortOpen
Command4.Enabled = MSComm1.PortOpen
Command5.Enabled = MSComm1.PortOpen
Command6.Enabled = MSComm1.PortOpen
Command7.Enabled = MSComm1.PortOpen
Command8.Enabled = MSComm1.PortOpen
Command1.Enabled = MSComm1.PortOpen
Command2.Enabled = MSComm1.PortOpen
Command3.Enabled = MSComm1.PortOpen
Command4.Enabled = MSComm1.PortOpen
Command5.Enabled = MSComm1.PortOpen
Command6.Enabled = MSComm1.PortOpen
Command7.Enabled = MSComm1.PortOpen
Command8.Enabled = MSComm1.PortOpen

Y quitaría los IF.

Un saludo
Título: Re: activar un evento para un conjunto de componentes
Publicado por: groundman en 26 de Febrero de 2009, 21:05:18
gracias.ya voy entendiendo lo del Index.es que no me habia dado cuenta de que el index es el numero del boton independiente.
Título: Re: activar un evento para un conjunto de componentes
Publicado por: PalitroqueZ en 27 de Febrero de 2009, 18:22:58
Es como dice Santiago, el index es un valor que devuelve el evento indicando el índice del botón que lo generó. Después con un select case (o swicht en C) llamas a la función correspondiente al botón

No programo en Visual Basic, pero por la estructura del programa yo pondría como una primera aproximación:

Command1.Enabled = MSComm1.PortOpen
Command2.Enabled = MSComm1.PortOpen
Command3.Enabled = MSComm1.PortOpen
Command4.Enabled = MSComm1.PortOpen
Command5.Enabled = MSComm1.PortOpen
Command6.Enabled = MSComm1.PortOpen
Command7.Enabled = MSComm1.PortOpen
Command8.Enabled = MSComm1.PortOpen
Command1.Enabled = MSComm1.PortOpen
Command2.Enabled = MSComm1.PortOpen
Command3.Enabled = MSComm1.PortOpen
Command4.Enabled = MSComm1.PortOpen
Command5.Enabled = MSComm1.PortOpen
Command6.Enabled = MSComm1.PortOpen
Command7.Enabled = MSComm1.PortOpen
Command8.Enabled = MSComm1.PortOpen

Y quitaría los IF.

Un saludo

¡una solución elegante!  :P



Título: Re: activar un evento para un conjunto de componentes
Publicado por: groundman en 27 de Febrero de 2009, 19:26:42
pues una solucion muy buena.la que me habeis aconsejado.

Command1(0).Enabled = MSComm1.PortOpen
Command1(1).Enabled = MSComm1.PortOpen
Command1(2).Enabled = MSComm1.PortOpen
Command1(3).Enabled = MSComm1.PortOpen
Command1(4).Enabled = MSComm1.PortOpen
Command1(5).Enabled = MSComm1.PortOpen
Command1(6).Enabled = MSComm1.PortOpen
Command1(7).Enabled = MSComm1.PortOpen

pero practicando al final.oleeee
me habeis ayudado a hacerlo en solo tres lineas.y funciona perfectamente.

For i = 0 To 7
Command1(i).Enabled = MSComm1.PortOpen
Next i

Título: Re: activar un evento para un conjunto de componentes
Publicado por: groundman en 27 de Febrero de 2009, 21:48:56
tengo otro problemilla.

quiero que cuando se introduzca algo que no sea un numero en un textbox.me mande un mensage de error.y no se si esto sirve,ya que me salta hasta con numeros.

If IsNumeric(Text1.Text) Then MsgBox "solo se puede introducir numeros", vbInformation, "Error de Entrada"
Título: Re: activar un evento para un conjunto de componentes
Publicado por: migsantiago en 28 de Febrero de 2009, 01:34:17
Hace más de un año que usé esta opción, pero recuerdo que debes activar el evento Validation sobre el textbox a revisar. Ya dentro de la función que se ejecuta con ese evento pones:

Citar
'Hace la validación de los valores ingresados
Private Sub txtPoll_time_Validate(KeepFocus As Boolean) 'checa poll_time
    'si no es número o si no es mayor a 5 segundos y menor a 60
   If IsNumeric(txtPoll_time.Text) = False Or Val(txtPoll_time.Text) < 5 Or _
   Val(txtPoll_time.Text) > 60 Then
      KeepFocus = True
      MsgBox "Escriba un número en segundos, mayor a 5 y menor a 60", , _
      "Tiempo de petición"
   End If
End Sub

Si el dato está mal ingresado, obligas al control a no perder Focus poniendo KeepFocus a true. Así el usuario no podrá dejar el textbox mal llenado.
Título: Re: activar un evento para un conjunto de componentes
Publicado por: groundman en 08 de Marzo de 2009, 20:07:59
fenomenal me ha servido de mucho.gracias
Título: Re: activar un evento para un conjunto de componentes
Publicado por: Gonzalo_BlackHawk en 08 de Marzo de 2009, 20:57:38
quiero que cuando se introduzca algo que no sea un numero en un textbox.me mande un mensage de error.y no se si esto sirve,ya que me salta hasta con numeros.

Yo en mi caso, lo que hice fue diseñar una función que impidiera que el usuario coloque caracteres no numéricos en la caja de texto. Aunque antes de procesar los datos tambien verificaba si el dato ingresado era un numero válido y si estaba dentro del rango correcto, esta función daba un efecto mucho más profesional al programa. La función es la siguiente:

Código: [Seleccionar]
Public Function IngresarSoloNumeros(ByVal KeyAscii As Integer, ByVal Caracteres_adicionales As String) As Integer
'Esta función permite que solo sean ingresados en la caja de texto los numeros y los caracteres adicionales que se deseen.
If InStr("0123456789" & Caracteres_adicionales, Chr(KeyAscii)) = 0 Then
    IngresarSoloNumeros = 0
Else
    IngresarSoloNumeros = KeyAscii
End If
'Teclas especiales permitidas.
If KeyAscii = 8 Then IngresarSoloNumeros = KeyAscii     'Retroceso.
If KeyAscii = 13 Then IngresarSoloNumeros = KeyAscii    'Enter.
End Function

Luego para cada caja de texto que desees colocas el código siguiente. Supongamos que tenes una caja de texto llamada Txt_Numero y quieres que solo se puedan ingresar numeros enteros positivos. Entonces colocas en el formulario donde tenes la caja de texto:

Código: [Seleccionar]
Private Sub Txt_Numero_KeyPress(KeyAscii As Integer)
KeyAscii = IngresarSoloNumeros(KeyAscii, "")
End Sub

Inclusive a esta función puedes indicarle de antemano si podes colocar numeros solo positivos, o positivos y negativos, enteros o decimales, si podes ingresar numeros hexadecimales, entre otras, ya que permite pasar como parámetros los caracteres adicionales además de los numeros del 0 al 9 que podremos ingresar.

Por ejemplo, si tambien tenemos una caja de texto llamada Txt_Decimal y queremos que puedan ingresarse cualquier numero real, sea decimal o no, positivo o negativo, entonces colocamos:
Código: [Seleccionar]
Private Sub Txt_Decimal_KeyPress(KeyAscii As Integer)
KeyAscii = IngresarSoloNumeros(KeyAscii, "+-.")
End Sub

Bueno, espero que sea de utilidad. Nos estamos leyendo.