TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado 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
-
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.
-
gracias.provare a ver.
-
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.
-
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.
-
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
-
gracias.ya voy entendiendo lo del Index.es que no me habia dado cuenta de que el index es el numero del boton independiente.
-
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
-
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
-
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"
-
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:
'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.
-
fenomenal me ha servido de mucho.gracias
-
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:
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:
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:
Private Sub Txt_Decimal_KeyPress(KeyAscii As Integer)
KeyAscii = IngresarSoloNumeros(KeyAscii, "+-.")
End Sub
Bueno, espero que sea de utilidad. Nos estamos leyendo.