• Sábado 27 de Abril de 2024, 03:59

Autor Tema:  Sobre Un Famoso Notepad  (Leído 2292 veces)

Jamaicol

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Sobre Un Famoso Notepad
« en: Jueves 5 de Mayo de 2005, 08:52 »
0
Estoy haciendo un notepad y no se como meterle mano a eso identificar dentro
de mi cuadro de texto las filas y las columnas para poner en el estatusbar. Por supuesto necesito tambien el tratamiento para el raton, para que cuando hagan click no se me pierda y ahi es donde esta realmente mi duda si alguien pudiese explicarmelo se lo agradeceria :hola:

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Sobre Un Famoso Notepad
« Respuesta #1 en: Jueves 5 de Mayo de 2005, 09:25 »
0
Hola Jamaicol.

Puedes usar la funcion del api SendMessage tal que así:

Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  5.  
  6. Private Sub Command1_Click()
  7.     MsgBox "El TextBox 'text1' tiene " _
  8.     & CuentaLineas(Text1.Hwnd) & " línea(s)." _
  9.     & "El lago de la línea 3 es " _
  10.     & LargoLinea(Text1.Hwnd, 2) & "."
  11.     ' fíjate que el indice para el número de línea comienza en 0.
  12. End Sub
  13.  
  14. Private Function CuentaLineas(ByVal Hwnd As Long) As Long
  15.    Const EM_GETLINECOUNT = &HBA
  16.    CuentaLineas = SendMessage(Hwnd, EM_GETLINECOUNT, 0&, 0&)
  17. End Function
  18.  
  19. Private Function LargoLinea(ByVal Hwnd As Long, ByVal Linea As Long) As Long
  20.     Const EM_LINEINDEX = &HBB
  21.     Const EM_LINELENGTH = &HC1
  22.     Dim l1 As Long
  23.     l1 = SendMessage(Hwnd, EM_LINEINDEX, Linea, 0&)
  24.     LargoLinea = SendMessage(Hwnd, EM_LINELENGTH, l1, 0&)
  25. End Function
  26.  
  27.  

Respecto a lo que dices del ratón... no sé a qué te refieres.

Chao.

Jamaicol

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Sobre Un Famoso Notepad
« Respuesta #2 en: Jueves 5 de Mayo de 2005, 09:43 »
0
Brroz Eres el amo pero al problema al que me refiero es que yo cojo el raton y haciendo click me posiciono en cualquier parte del texto, y claro, luego se me descentra
todas las cuentas que estoy haciendo es decir que la columna no concuerda ni la fila, y a partir de ahi descontrol total

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Sobre Un Famoso Notepad
« Respuesta #3 en: Jueves 5 de Mayo de 2005, 10:23 »
0
Hola.

Para saber en qué posición del textbox se encuentra el cursor utiliza la propiedad SelStart del textbox en el evento click del mismo.

Ten en cuenta que algunas de las líneas acabarán con dos carácteres adicionales (Cr + Lf), serán aquellas en las que el usuario ha pulsado intro para saltar a una nueva línea. Las líneas que se inicien nuevas porque el texto ha llegado al extremo del textbox no incluyen estos caracteres...

Si no se te da y tengo tiempo (que cada vez menos) más adelante te echo un cable...

Suerte.

Jamaicol

  • Nuevo Miembro
  • *
  • Mensajes: 22
    • Ver Perfil
Re: Sobre Un Famoso Notepad
« Respuesta #4 en: Jueves 5 de Mayo de 2005, 19:47 »
0
Lo siento pero soy torpon ya lo he asumido, no he logrado que esa funcion que me has dicho cuente pero lo que no hace es distincion entre lineas, no entienco muy bien eso de  (Cr + Lf), vamo que no me suena y no he encotrao na sobre ello si puedieses pasarme algo te lo agradeceria, (te apuntaria una caña mas a la cuenta).

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Sobre Un Famoso Notepad
« Respuesta #5 en: Sábado 7 de Mayo de 2005, 09:56 »
0
Hola Jamaicol.

Prueba con algo así:

Código: Text
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal Hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  5.  
  6. Private Function CuentaLineas(ByVal Hwnd As Long) As Long
  7.   Const EM_GETLINECOUNT = &HBA
  8.   CuentaLineas = SendMessage(Hwnd, EM_GETLINECOUNT, 0&, 0&)
  9. End Function
  10.  
  11. Private Function LargoLinea(ByVal Hwnd As Long, ByVal Linea As Long) As Long
  12.     Const EM_LINEINDEX = &HBB
  13.     Const EM_LINELENGTH = &HC1
  14.     Dim l1 As Long
  15.     l1 = SendMessage(Hwnd, EM_LINEINDEX, Linea, 0&)
  16.     If l1 > -1 Then
  17.         LargoLinea = SendMessage(Hwnd, EM_LINELENGTH, l1, 0&)
  18.     Else
  19.         LargoLinea = 0
  20.     End If
  21. End Function
  22.  
  23. Private Sub Text1_Click()
  24.     debug.print RowCol
  25. End Sub
  26.  
  27. Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
  28.     debug.print RowCol
  29. End Sub
  30.  
  31. Private Function RowCol() As String
  32.     Dim lRow As Long, lLen As Long
  33.     Dim lStart As Long, lPos As Long
  34.     lStart = Text1.SelStart
  35.     lPos = InStr(1, Text1.Text, vbCrLf)
  36.     While lPos < Text1.SelStart And lPos > 0
  37.         lStart = lStart - 2
  38.         lPos = InStr(lPos + 1, Text1.Text, vbCrLf)
  39.     Wend
  40.     lPos = 0
  41.     Do
  42.         lLen = LargoLinea(Text1.Hwnd, lRow)
  43.         lRow = lRow + 1
  44.         If lStart > lLen Then
  45.             lStart = lStart - lLen
  46.         Else
  47.             If Text1.SelStart > 2 Then
  48.                 If Mid(Text1.Text, Text1.SelStart - 1, 2) = vbCrLf Then
  49.                     lStart = 0
  50.                     lRow = lRow + 1
  51.                 End If
  52.             End If
  53.             If lStart = lLen And Text1.SelStart < Len(Text1.Text) - 1 Then
  54.                 If Mid(Text1.Text, Text1.SelStart + 1, 2) <> vbCrLf Then
  55.                     lStart = 0
  56.                     lRow = lRow + 1
  57.                 End If
  58.             End If
  59.             lStart = lStart + 1
  60.             Exit Do
  61.         End If
  62.     Loop
  63.     RowCol = "Fila " & lRow & " , columna " & lStart
  64. End Function
  65.  
  66.  

Está sin optimizar y el caso de los comienzos y finales de las líneas está tratado un poco chafalleiramente...

Fíjate en este caso en el que no funciona bien:
En una línea que no termina en retorno de carro + nueva línea, si te mueves al final de línea con el cursor o escribiendo no hay problema, ya que el propio control pasará a la línea siguiente, pero si vas al final con la tecla <Fin> o haciendo click con el ratón, el cursor no salta a la siguiente línea, pero la funcion sí...

Haber si tu lo arreglas, porque yo un sábado que tengo que currar no estoy para gran cosa...

Suerte.