![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Buenas barman:
En los ejemplos no encuentro nada que me sirva y este código que has pegado tampoco ![]() El codigo lo que hace es que cuando se pulse la tecla TAB salga por pantalla la suma del SelStart y del SelLength y aparte de que no se imprima el TAB. Y no le veo relación con lo que yo quiero hacer, ya que estos dos valores son la posición del cursor y de la longitud de la seleccion. No sé, pero creo que no nos entendemos muy bien ![]() ![]() Se me ocurre que quizá tu idea era que seleccionase con el ratón el un TAB escrito anteriormente y que el código me dijera la longitud, si es eso te adelanto que no funciona ya que la longitud del caracter \t es siempre 1. Manualmente he comprobado que un TAB equivale a 9 espacios por defecto, y lo que yo quiero es poder cambiar eso (tanto acceder para obtener ese valor como acceder para cambiarlo). Gracias de todas formas, sigo esperando respuesta. |
#2
|
||||
|
||||
Cita:
A ver por parte, 1º escribres y si pulsas el tabulador le envias 9 espacios. void __fastcall TForm1::RichEdit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { if (Key == VK_TAB) { RichEdit1 ->SetSelTextBuf(" "); } } 2º que lea el texto escrito y que cambie los Tabs por que quieras SetSelTextBuf. for (int i = 0; i< strlen(RichEdit1 ->Text.c_str()); i++ ) { if (RichEdit1 ->Text.c_str()[i] == VK_TAB) ShowMessage("A"); } |
#3
|
|||
|
|||
Al final ya entendí por donde ibas
![]() Muchas gracias por no rendirte, es buena la idea pero no me sirve, ya que eso sólo funciona para los textos que se escriban directamente en el RichEdit. Pero si importara un texto desde un archivo los Tabs no se procesarían y tendría que hacer una lectura del texto para cambiar los \t por grupos de 9 espacios. Y resulta que eso tampoco estaría bien porque por otra parte, también comprendí que el simple hecho de haber planteado la pregunta era un error. Y es que un \t no equivale a ningún número de espacios (será por eso que no encontraba información) ![]() Quizás por eso no entendía tus explicaciones, porque yo buscaba algún mensaje a la API o alguna propiedad que me diera el número de espacios a que equivale un tab. Y no hacer yo mismo, que dicha equivalencia tuviera lugar. Y seguramente tú ya sabías mejor que yo lo que es un tab. Al final resolví el problema por otros caminos, pero muchas gracias por tu ayuda. Saludetes! |
#4
|
||||
|
||||
Cita:
Por otra parte, desde que vi este hilo hace tiempo pensé: un RichEdit tiene una propiedad Paragraph.Tabs que es un arreglo de enteros que indican los puntos donde debe detenerse el tabulador. Como ya bien notaste, un tabulador no corresponde a un número determinado de caracteres o espacios en blanco por una sencilla razón: a menos que la fuente que uses sea de ancho constante- como la Courier New - no tiene caso tratar de establecer el ancho de las tabulaciones en caracteres ya que éstos son de ancho variable. Así que, en lugar de eso, las tabulaciones se indican en twips desde el margen izquierdo (según la documentación). Ahora bien, como dije, había visto este hilo y pensado en la propiedad Paragraph.Tabs. Sin embargo no había dicho nada porque al probarlo yo mismo la mentada propiedad no funcionaba. Por más que le especificaba distintas medidas de tabulaciones, era como si no pasase nada y seguí poniendo las tabulaciones por defecto. Pero yo había hecho esto alguna vez. Finalmente, buscando en archivos viejos encontré cómo lo hice. Básicamente me olvidé de fijar las tabulaciones a través de la VCL y lo hice directamente mandando el mensaje EM_SETPARAFORMAT al control. En el código tengo algunos comentarios referentes a que la implementación de la VCL es incorrecta pero confieso que ya no recuerdo bien por qué, así como tampoco recuerdo exactamente qué es lo que hace el código. Pero lo he probado y funciona. El código está hecho pensando en una fuente de ancho fijo como Courier New de manera que en ese caso sí podía traducir los anchos de las tabulaciones en número de caracateres. Como te digo, no puedo explicar los detalles porque ya no los recuerdo pero creo que puede servirte a tí o alguien más para ver por donde va el asunto. El código es para Delphi pero debiera portarse sin problemas a C++.
La parte del FormCreate fue necesaria ya que la primera tabulación no la ponía donde yo quería de manera que establecí el margen con el mismo ancho que la tabulación. Hace tiempo que hice este código así que desconozco si actualmente el "problema" con la VCL se ha solucionado. Aunque aparentemente no, o bien es simplemente cuestión de que no sé como usar la mencionada propiedad Paragraph.Tabs directamente. // Saludos |
#5
|
|||
|
|||
El problema de los TABS surgió por la necesidad de hacer un Editor que se comportara de manera similar a la de Builder C++. Entre otras cosas lo que pretendía es que en una situación como esta:
Código:
linea 1 del texto linea2 del texto Hasta que no me di cuenta de que tal número no exístia por no ser '\t' un conjunto de caracteres como muy bien apuntaba Roman. No busqué otras soluciones. Al final decidí que lo mejor par mi caso era medir la distancia al margen izquierdo en píxels para comparar las distintas lineas. Y así lo hice mediante el mensaje a la API "EM_POSFROMCHAR" que facilita la distancia en píxels a los márgenes izquierdo y superior de un TRichEdit si más que indicar la posición que ocupa el caracter al que se quiere hacer referencia. Con este mensaje y algunas comparaciones mi problema quedó completamente resuelto. Muchas gracias Roman por tus aclaraciones y por recordarme que escribiera el final de la historia. Saludos a todos! |
![]() |
|
|
![]() |
|