Domingo 22 de Diciembre de 2024, 10:30
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
Visual Basic 6.0 e inferiores
(Moderador:
F_Tanori
) »
Sobre Un Famoso Notepad
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Sobre Un Famoso Notepad (Leído 2396 veces)
Jamaicol
Nuevo Miembro
Mensajes: 22
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
Tweet
Brroz
Miembro de PLATA
Mensajes: 1058
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
Option Explicit
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
Private Sub Command1_Click()
MsgBox "El TextBox 'text1' tiene " _
& CuentaLineas(Text1.Hwnd) & " línea(s)." _
& "El lago de la línea 3 es " _
& LargoLinea(Text1.Hwnd, 2) & "."
' fíjate que el indice para el número de línea comienza en 0.
End Sub
Private Function CuentaLineas(ByVal Hwnd As Long) As Long
Const EM_GETLINECOUNT = &HBA
CuentaLineas = SendMessage(Hwnd, EM_GETLINECOUNT, 0&, 0&)
End Function
Private Function LargoLinea(ByVal Hwnd As Long, ByVal Linea As Long) As Long
Const EM_LINEINDEX = &HBB
Const EM_LINELENGTH = &HC1
Dim l1 As Long
l1 = SendMessage(Hwnd, EM_LINEINDEX, Linea, 0&)
LargoLinea = SendMessage(Hwnd, EM_LINELENGTH, l1, 0&)
End Function
Respecto a lo que dices del ratón... no sé a qué te refieres.
Chao.
Jamaicol
Nuevo Miembro
Mensajes: 22
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
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
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
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
Option Explicit
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
Private Function CuentaLineas(ByVal Hwnd As Long) As Long
Const EM_GETLINECOUNT = &HBA
CuentaLineas = SendMessage(Hwnd, EM_GETLINECOUNT, 0&, 0&)
End Function
Private Function LargoLinea(ByVal Hwnd As Long, ByVal Linea As Long) As Long
Const EM_LINEINDEX = &HBB
Const EM_LINELENGTH = &HC1
Dim l1 As Long
l1 = SendMessage(Hwnd, EM_LINEINDEX, Linea, 0&)
If l1 > -1 Then
LargoLinea = SendMessage(Hwnd, EM_LINELENGTH, l1, 0&)
Else
LargoLinea = 0
End If
End Function
Private Sub Text1_Click()
debug.print RowCol
End Sub
Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
debug.print RowCol
End Sub
Private Function RowCol() As String
Dim lRow As Long, lLen As Long
Dim lStart As Long, lPos As Long
lStart = Text1.SelStart
lPos = InStr(1, Text1.Text, vbCrLf)
While lPos < Text1.SelStart And lPos > 0
lStart = lStart - 2
lPos = InStr(lPos + 1, Text1.Text, vbCrLf)
Wend
lPos = 0
Do
lLen = LargoLinea(Text1.Hwnd, lRow)
lRow = lRow + 1
If lStart > lLen Then
lStart = lStart - lLen
Else
If Text1.SelStart > 2 Then
If Mid(Text1.Text, Text1.SelStart - 1, 2) = vbCrLf Then
lStart = 0
lRow = lRow + 1
End If
End If
If lStart = lLen And Text1.SelStart < Len(Text1.Text) - 1 Then
If Mid(Text1.Text, Text1.SelStart + 1, 2) <> vbCrLf Then
lStart = 0
lRow = lRow + 1
End If
End If
lStart = lStart + 1
Exit Do
End If
Loop
RowCol = "Fila " & lRow & " , columna " & lStart
End Function
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.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
Visual Basic 6.0 e inferiores
(Moderador:
F_Tanori
) »
Sobre Un Famoso Notepad