• Martes 30 de Abril de 2024, 03:30

Autor Tema:  Duda Con String  (Leído 2615 veces)

joselito

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Duda Con String
« en: Domingo 3 de Julio de 2005, 13:41 »
0
:huh: vereis tengo una duda con un programita en el cual le he asignado una serie de instrucciones a cada letra de manera que cuando escriba un texto se vallan ejecutando todas las instrucciones seguidas en funcion de las letras que contenga esa cadena de caracteres pero solo me reconoce la primera letra y de ahi no pasa a la(s) siguiente(s).

alguien sabria como solucionar esto??
gracias a todos y un saludo

Shiquilla

  • Miembro MUY activo
  • ***
  • Mensajes: 188
  • Nacionalidad: es
    • Ver Perfil
    • http://www.songesoft.com
Re: Duda Con String
« Respuesta #1 en: Domingo 3 de Julio de 2005, 16:14 »
0
¿Podrías explicarlo mejor? ¿o poner parte del código?

Saludos,  :P
« §hÿqµïllæ »

joselito

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Duda Con String
« Respuesta #2 en: Lunes 4 de Julio de 2005, 14:18 »
0
ok, si, vereis mi idea es hacer un traductor de morse pero que en vez de que emita pitidos emita "destellos", es decir, el punto o pitido seria un destello y la ralla
o pitido largo seria  un "destello" de mayor duracion ok?

para lo cual he utilizado un shape que cambia de color del negro al blanco, considerandose el blanco como un destello

este cambia de color en funcion de las letras que se introducen en una caja de texto, es decir, cada letra tiene su codigo

entonces por ejemplo para la "A" (punto ralla)
el codigo seria:

en el timer1

vez = vez + 1

if text1 = "A" Then
if vez =  4 Then
timer1.interval = 500
Else
timer1.interval = 100
End if

if vez Mod 2 = 1
shape1.fillcolor = vbBlack
Else
shape1.fillcolor = vbWhite
End if

if vez > 4 Then
timer1.Enabled = False
vez = 0
End if
End if

de esta manera cuando introduzco la "A" en la caja de texto, el shape me lo traduce como un "destello" corto y uno largo.

y mi pregunta es como se podria hacer para que me traduzca una frase o un texto
letra por letra todo seguido??

ya que cuando introduzco mas de dos letras en la caja de texto o no hace nada o solo me traduce la primera

no se si ahora me he explicado mejor  :rolleyes:

un saludo y muchas gracias a todos

Blag

  • Moderador
  • ******
  • Mensajes: 697
    • Ver Perfil
    • http://atejada.blogspot.com
Re: Duda Con String
« Respuesta #3 en: Lunes 4 de Julio de 2005, 17:55 »
0
Bueno.....no tengo Visual Basic a la mano....y ya hace varios años que no lo uso para programar....pero veamos...:lol:

Lo que deberías hacer es más o menos lo siguiente:

Citar
Tienes que leer caracter por caracter, para lo cual puedes utilizar un for o un while que vaya desde 0 hasta la longitud de la frase que ha ingresado el usuario....Si mal no recuerdo, la longitud la obtienes con Text1.lenght();
Para leer cada texto....creo que se utiliza el getChar();

Espero que te sirva  :hola:

Saludos,

Blag  :devil:

Shiquilla

  • Miembro MUY activo
  • ***
  • Mensajes: 188
  • Nacionalidad: es
    • Ver Perfil
    • http://www.songesoft.com
Re: Duda Con String
« Respuesta #4 en: Lunes 4 de Julio de 2005, 18:33 »
0
Vale, creo que lo he entendido..
Yo haría algo así..

Código: Text
  1. Option Explicit
  2. Private mnContador As Integer
  3.  
  4. Private Sub Command1_Click()
  5. Dim lnI As Integer
  6. Dim lsLetra As String
  7. Dim lsFrase As String
  8.     lsFrase = Text1.Text
  9.     For lnI = 1 To Len(lsFrase) Step 1
  10.         lsLetra = Mid(lsFrase, lnI, 1)
  11.         msTratarLetra lsLetra
  12.     Next lnI
  13. End Sub
  14.  
  15. Private Sub msTratarLetra(lsLetra As String)
  16.     mnContador = mnContador + 1
  17.     If lsLetra = "A" Then
  18.         If mnContador = 4 Then
  19.             'Tratamiento
  20.         Else
  21.             'Tratamiento
  22.         End If
  23.         If mnContador Mod 2 = 1 Then
  24.             'Tratamiento
  25.         Else
  26.             'Tratamiento
  27.         End If
  28.         
  29.         If mnContador > 4 Then
  30.             'Tratamiento
  31.             mnContador = 0
  32.         End If
  33.     End If
  34. End Sub
  35.  

No te recomiendo usar Timer, porque creo que cuando estás en un bucle no se ejecuta el timer hasta que haya acabado. No sé si poniendo un DoEvents para que haga los eventos te lo hará.. yo lo haría así.

Espero haberte ayudado.

Saludos,
« §hÿqµïllæ »

Juanolo

  • Miembro MUY activo
  • ***
  • Mensajes: 202
    • Ver Perfil
Re: Duda Con String
« Respuesta #5 en: Martes 5 de Julio de 2005, 18:48 »
0
Hola, Joselito.
  Me parece muy interesante tu idea..., y entusiasmante a la vez. Siento no tener un Visual cerca, pues como soy sólo un aficionado, mi código podría no resultar exacto sin que Visual me esté recordando mis errores.
 Bueno, mi aporte es el siguiente (si gustas):
 1º, me quedo con la primera parte del código de Shiquilla con una pequeña corrección para el caso de los espacios separadores de palabras. Es decir:

Código: Text
  1. Dim lnI As Integer
  2. Dim lsLetra As String
  3. Dim lsFrase As String
  4.    lsFrase = Text1.Text
  5.    For lnI = 1 To Len(lsFrase) Step 1
  6.        lsLetra = Mid(lsFrase, lnI, 1)
  7.        if lsLetra=" " then
  8.           Sleep 500
  9.        Else
  10.           msTratarLetra lsLetra
  11.        Endif
  12.    Next lnI
  13.  

Notas: Esto es para el caso de que quieras traducir una cadena que ya està en un TextBox. Si quieres traducir a medida que presionas las letras necesitas usar KeyPress; pero creo que esto esta bien. Tengo dudas con la funciòn Sleep (o Wait.., o algo así; como te explicaba, no tengo un visual cerca). Lo que pretendo que haga es esperar 500 milisegundos antes de continuar con la siguiente instrucción.

Lo que cambiaría sería el procedimiento msTratarletra. Pero antes, agregaremos el siguiente procedimiento para manejar destellos:

Código: Text
  1. Private sub Destellar(CodDestello as String)
  2.   Dim i as integer, MlEsperar as integer
  3.   For i=1 to len(CodDestello)
  4.      if mid(CodDestello,i,1)="0" then
  5.         MlEsperar=150 'Espera 150 milisegundos manteniendo el Shape blanco
  6.      Else
  7.         MlEsperar=300 'Espera el Doble (Raya. El anterior era Punto)
  8.      Endif
  9.      'Hago Destellar por el tiempo que corresponda
  10.      'Tomando tu idea del Shape
  11.      Shape.FillColor=vbWhite'Blanco
  12.      Sleep MlEsperar
  13.      Shape.FillColor=vbBlack 'Negro            (vuelve al color original)
  14.   Next i
  15. End Sub
  16.  

Donde CodDestellos es una cadena de 0s y 1s que indicará si se trata de un Punto o una Raya.
Así, por ejemplo, una S sería "000", una O serìa "111" (Dije POR EJEMPLO, no sé Morse)

Ahora retomamos la funciòn msTratarLetra:

Código: Text
  1. Private Sub msTratarLetra(lsLetra As String)
  2.   Select Case lsLetra
  3.      Case "S"
  4.        Destellar "000"
  5.      Case "O"
  6.        Destellar "111"
  7.      'Etcètera
  8.   End Select
  9.  

Nota que al asignar 0s y 1s te evitas....

Espero que sirva al menos como idea. A mi tu pregunta me ha servido pa' sacudir un poco las neuronas.

Salu2.

Pd: En cuanto tenga tiempo lo intento.
La luz que sólo se ilumina a sí misma, es oscuridad.

Juanolo

  • Miembro MUY activo
  • ***
  • Mensajes: 202
    • Ver Perfil
Re: Duda Con String
« Respuesta #6 en: Martes 5 de Julio de 2005, 23:10 »
0
Bueno, ya te había dicho que sin Visual pa que me corrija cometo equivocaciones.

Primero, me faltaba declarar 'Sleep', que es API... y otras pequeñas cosillas para que funcione como yo quería. Así es que te incluyo un nuevo código con el que me estuve entreteniendo.
Te adjunto, además, el proyecto, por si quieres probar como funciona la idea sin tener que darte la lata de copiar y pegar (je).

Código: Text
  1. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
  2.  
  3. Private Sub Command1_Click()
  4.     Dim Lni As Integer
  5.     Dim lsLetra As String
  6.     Dim lsFrase As String
  7.     Text1.SetFocus
  8.     Screen.MousePointer = vbHourglass
  9.    lsFrase = Text1.Text
  10.    For Lni = 1 To Len(lsFrase) Step 1
  11.        lsLetra = Mid(lsFrase, Lni, 1)
  12.        'Un pequeño lujillo, pa que vaya marcando la letra que está leyendo.
  13.        'También la podrías mostrar en una etiqueta... Pero nada de esto es necesario.
  14.        Text1.SelStart = Lni - 1
  15.        Text1.SelLength = 1
  16.        If lsLetra = " " Then
  17.           Sleep 500 ' Para separar palabras
  18.        Else
  19.           msTratarLetra lsLetra
  20.           Sleep 300  'Para separar códigos entre letras
  21.        End If
  22.    Next Lni
  23.    Screen.MousePointer = vbDefault
  24. End Sub
  25.  
  26. Private Sub Destellar(CodDestello As String)
  27.   Dim i As Integer, MlEsperar As Integer
  28.   For i = 1 To Len(CodDestello)
  29.      If Mid(CodDestello, i, 1) = "0" Then
  30.         MlEsperar = 150 'Espera 150 milisegundos manteniendo el Shape blanco
  31.      Else
  32.         MlEsperar = 300 'Espera el Doble (Raya. El anterior era Punto)
  33.      End If
  34.      'Hago Destellar por el tiempo que corresponda
  35.     Sleep MlEsperar  'Para que se mantenga el negro el tiempo suficiente
  36.      Shape1.BackColor = vbWhite 'Blanco
  37.      Beep
  38.      DoEvents 'Necesario para que se muestre en el formulario
  39.      Sleep MlEsperar
  40.      Shape1.BackColor = vbBlack 'Negro            (vuelve al color original)
  41.      DoEvents
  42.   Next i
  43. End Sub
  44.  
  45. Private Sub msTratarLetra(lsLetra As String)
  46.     'Primero pongo la letra en mayúscula para una fácil comparación
  47.     lsLetra = UCase(lsLetra)
  48.   Select Case lsLetra
  49.     Case "A"
  50.         Destellar "01"
  51.     Case "B"
  52.         Destellar "1000"
  53.     Case "C"
  54.         Destellar "1010"
  55.     Case "D"
  56.         Destellar "100"
  57.     Case "E"
  58.         Destellar "0"
  59.     Case "F"
  60.         Destellar "0010"
  61.     Case "G"
  62.         Destellar "110"
  63.     Case "H"
  64.         Destellar "0000"
  65.     Case "I"
  66.         Destellar "00"
  67.     Case "J"
  68.         Destellar "0111"
  69.     Case "K"
  70.         Destellar "101"
  71.     Case "L"
  72.         Destellar "0100"
  73.     Case "M"
  74.         Destellar "11"
  75.     Case "N"
  76.         Destellar "10"
  77.     Case "O"
  78.         Destellar "111"
  79.     Case "P"
  80.         Destellar "0110"
  81.     Case "Q"
  82.         Destellar "1101"
  83.     Case "R"
  84.         Destellar "010"
  85.     Case "S"
  86.         Destellar "000"
  87.      Case "T"
  88.        Destellar "1"
  89.      Case "U"
  90.        Destellar "001"
  91.      Case "V"
  92.        Destellar "0001"
  93.      Case "W"
  94.        Destellar "011"
  95.      Case "X"
  96.        Destellar "1001"
  97.      Case "Y"
  98.        Destellar "1011"
  99.      Case "Z"
  100.        Destellar "1100"
  101.     End Select
  102. End
  103.  

Salu2

Pd: Aquí va el código... Espero que subas o me envíes al correo el proyecto terminado.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
La luz que sólo se ilumina a sí misma, es oscuridad.