Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: TOLO68 en Febrero 20, 2020, 06:20:43 pm

Título: Posicionar el cursor del mouse en un textbox
Publicado por: TOLO68 en Febrero 20, 2020, 06:20:43 pm
Hola a todos!!! Una pregunta, en VB6 cuando hacemos dobleclick en un CommandButton, por poner un ejemplo, se abre la ventana de edicion de codigo, y el cursor se situa justo debajo de la linea CommandButton1_Click(), habia pensado hacerlo de la siguiente manera..... Recorrer linea a linea el texto de un textbox hasta localizar CommandButton1_Click() con la funcion InStr, y una vez localizada la linea, situar el cursor con SetCursorPos o alguna funcion de la API......... Se os ocurre alguna otra manera para hacerlo????, o la que he propuesto esta bien, me imagino que tambien debe usar un sistema asi, al querer buscar una palabra dentro el notepad por ejemplo, muchas gracias de antemano.... Saludos!!!!!
Título: Re:Posicionar el cursor del mouse en un textbox
Publicado por: NEBIRE en Marzo 02, 2020, 01:08:19 pm
No. No es lo adecuado.
Cuando se trata de un texto plano, no queda otra que buscar el punto deseado.

Tratándose de un entorno de programación, debes tener en cuenta que se utiliza una tabla de símbolos, donde constan todas las funciones con la información precisa para ser tratada.
Cuando haces doble clik, el IDE primero verá cual es la opción por defecto (en caso de diseño hablamos), típicamente ir a un módulo de inicialización del componente, si no se localiza ne la tabla, irá al primero que encuentre relacionado con dicho control (imagina que has puesto código para un Command1_KayDown, pués a ese y si no hay ningún método almacenado, entonces hará una entrada en la tabla para el método por defecto para dicho control, cual es el método por defecto, para cada control no sabría decirte, para un programador que actúa como usaurio dle IDE carece de importancia.

En realidad dichas entradas en la tabla, aparecen listadas en el código en sendos combobox, a la izquierda la de los componentes (general para los que no son componentes) y a la derecha los métodos del componente elegido (se localizan en la tabla y se añaden a dicho combo).

Entonces, por debajo lo que hace es simplemente preguntar a la tabla cuantas línea socupa el método (si existe) y en que línea está (aunque también puede crear dinámicamente al instante la imagen, me consta que no es el modo que usa VB6, tiene preferencia por 'dibujar el listado del módulo donde está en una imagen, pero el nº de línea le sirve para saber de modo instantáneo donde se localiza el punto exacto deseado, sin tener que buscarlo (pués eso sería lento e ineficiente siendo que está obligado a mantener una tabla de símbolos a la que preguntar donde está cada ocurrencia de cualquier cosa buscada).

De hecho si te das cuenta, el editor tiene un ancho fijo por defecto prefijado al implementarlo en 1024 caracteres, que es el largo máximo de una línea de código. Lo que denota que en efecto, lo renderiza como imagen, así aunque cambies el ancho de la ventana, el texto no ocupa ni más ni menos líneas (no se adapta, requiere scroll), pués esa adaptación exigiría renderizar de nuevo la vista (que es algo muy rápido, pero no si has renderizado  todo el documento completo, y no solo lo que se ve en la vista).

Aún así, me temo que es un poquito más complejo, pero eficiente y elegante a la vez. Me explico... en realidad renderiza de una sola vez el código dentro de cada función y las mantiene como imágenes sueltas (en el orden que las editas), así renderizar, supone solo 'pegar' cada una de las que aparecen en la vista, y por tanto el editor tiene solamente que vérselas a cada rato exclusivamente con la función que estás editanto en ese momento, lo que simplifica enormemente la tarea.

...y después de tanta perorata, espero que entiendas que no localiza un string "Command1_Click" en el tocho del texto, si no "Command1" en la tabla de símbolos (seguramente sea una tabla hash) que le da un puntero a los métodos que tenga, ahí de nuevo buscará  "Click1" y devolverá un puntero a los datos que almacene dicha función. Fijo que su texto y algunos datos más como número d elíneas que ocupa y posición absoluta (esta seguramente se recalcule, sumando las línea que ocupen todas las funciones previas, porque no es plan que con cada línea añadida o eliminada deba actualizarse dicho dato para cada función). Probablemente tenga también algo como un buleano que señale si existe una imagen renderizada del fragmento de código que ocupa la función,  tal que si es que sí la pegue y si es que no la genere al instante... respecto del "Click", podrá devolverlo solo sí: es el primero, el por defecto, o el único que tenga... ese es un detalle interno sin importancia al caso. Entonces una vez encontrado el método a mostrar, borra el contenido del editor, pega la imagen que corresponde a dicha función (que como he dicho seguramente tenga ya renderizada o se renderice al instante) y si no completa la página añade el siguiente o siguientes, por supuesto debe actualizar el scroll como convenga, pués otra cosa que debe mantener es cuantas líneas ocupa cada función y que índice ocupa en el total, y con esos datos es muy sencillo y rápido actualizar el scroll e indicar el número de línea al posicionar el cursor.

Aunqe las funciones búsqueda hoy día sean muy rápidas, la búsqueda en una tabla hash, toma un tiempo 1... es decir no requiere búsqueda, está localizada y por tanto tarda lo mismo esté la primera o la última, haya 5 entradas en la tabla o 500 millones.


Por supuesto, para el texto de un textbox, simplemente hay que buscar, no haya palabras clave que uno pueda decir 'se usa siempre estas 400, que le lleven a uno a querer meterlo en uan tabla hash, por cuestión de eficiencia, total un textbox tendrá un texto limitado y además sin un formato predefinido como sucede con el código fuente de un lenguaje.
Título: Re:Posicionar el cursor del mouse en un textbox
Publicado por: Shagratt en Mayo 22, 2020, 11:36:55 pm
por poner un ejemplo, se abre la ventana de edicion de codigo, y el cursor se situa justo debajo de la linea CommandButton1_Click(), habia pensado hacerlo de la siguiente manera..... Recorrer linea a linea el texto de un textbox hasta localizar CommandButton1_Click() con la funcion InStr, y una vez localizada la linea, situar el cursor con SetCursorPos o alguna funcion de la API.........

Pero cual es el uso que le queres dar?  Porque si es para editar un texto que estas mostrando vos en un textbox tenes las propiedades .SelStart y .SelLength con las que podes mover el cursor a donde quieras.
Título: Re:Posicionar el cursor del mouse en un textbox
Publicado por: TOLO68 en Junio 05, 2020, 10:56:55 am
Hola, el uso que le quiero dar es para un pequeño IDE que estoy haciendo, o sea que tengo un textbox o richedit, mejor dicho, y cuando haga click en un boton u otro control, me vaya directamente a buscar el texto "control_click" en el richeedit, y se coloque el cusor alli, por poner un ejemplo seria algo parecido a un editor de texto, que le dices buscar tal palabra, y cuando la encuentra, el cursor se ha posicionado donde esta la palabra, pero eso lo necesito usando la api, ya que no lo estoy haciendo con VB6. O sea seria solo la funcion selstart de vb6, pero con la api, no se si me he explicado bien. Gracias
Título: Re:Posicionar el cursor del mouse en un textbox
Publicado por: TOLO68 en Junio 05, 2020, 11:39:21 am
Creo que para pocicionar el cursor  en una linea y columna de un control edit, seria algo asi

SendMessage (hEdit1,EM_SETSEL, 5, 5)

Pero no estoy seguro

Lo probare