Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 19-04-2005
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
Linea en TRichEdit

Hola a todos!

Intento añadir una linea vertical a un TRichEdit para que marque la porción de texto imprimible (igual que la que tiene el Builder C++).

La idea es crear un descendiente del TRichEdit que incluya esta opción y los propiedades necesarias para configurar el color y posición de la linea en cuestión.

Lo primero que se me ocurrió fue que el descendiente del TRichEdit creara una linea (TShape) dinámicamente. La creo con new y le asigno como Parent this. La linea se dibuja correctamente, y puedo manejarla sin problemas, sin embargo el texto del TRichEdit ya no se dibuja!!!

No se si he olvidado algo, pero ya he empezado a pensar en otras soluciones y no se me ocurre ninguna viable.

Por ejemplo se me ocurrió modificar el valor de los píxels del canvas del RichEdit para dibujar la linea. Pero el TRichEdit no dispone de tal propiedad.

También pensé en superponer un TImage en el que copiar el aspecto del TRichEdit tras modificarlo añadiéndole una linea pero creo que eso sería muy lento.

Como última solución tengo dibujar y gestionar la linea externamente, con lo que no necesitaría crear la nueva clase, pero no creo que fuera esto lo ideal.

Si alguién se le ocurre alguna otra idea o puede decirme en qué me equivoqué en la primera de mis opciones, le estaría muy agradecido.

Muchas gracias de antemano!
Responder Con Cita
  #2  
Antiguo 19-04-2005
Avatar de barman
barman barman is offline
Miembro
 
Registrado: may 2003
Posts: 139
Poder: 21
barman Va por buen camino
Ni idea de lo que me cuentas, pero a ver si te vale esto, yo lo uso para marcar dentro de un texto como si se tratase de un marcador.

CuandoQuieras(){
TPoint Pos = RichEdit1->CaretPos;
PintarFondoLinea(RichEdit1, Pos.y +1, clYellow);}


void __fastcall TFRichText::PintarFondoLinea(TRichEdit *RichEdit, int Linea, TColor Color)
{
// Seleccionamos la linea
int iStart = RichEdit->Perform(EM_LINEINDEX, Linea-1, 0);
int iEnd = RichEdit->Perform(EM_LINEINDEX, Linea, 0);
RichEdit->Perform(EM_SETSEL, iStart, iEnd );

::CHARFORMAT2 cf;
cf.cbSize = sizeof(cf);
cf.dwMask = CFM_BACKCOLOR;
cf.crBackColor = ColorToRGB(Color);
RichEdit->Perform(EM_SETCHARFORMAT, SCF_SELECTION, (int)&cf);

RichEdit1->SelStart = iEnd ;

cf.cbSize = sizeof(cf);
cf.dwMask = CFM_BACKCOLOR;
cf.crBackColor = ColorToRGB(clWhite);
RichEdit1->Perform(EM_SETCHARFORMAT, SCF_SELECTION, (int)&cf);


}
Responder Con Cita
  #3  
Antiguo 19-04-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Sonic
..Lo primero que se me ocurrió fue que el descendiente del TRichEdit creara una linea (TShape) dinámicamente. La creo con new y le asigno como Parent this. La linea se dibuja correctamente, y puedo manejarla sin problemas, sin embargo el texto del TRichEdit ya no se dibuja...
Tal vez has creado un Shape con el fondo pintado de blanco, y necesitas crear un Shape y dibujar sólo la línea. Otra opción es dibujar directamente sobre el canvas del RichEdit con un método del canvas (método Rectangle, por ejemplo).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 19-04-2005
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
Hola de nuevo a todos:

Cita:
Empezado por barman
a ver si te vale esto, yo lo uso para marcar dentro de un texto como si se tratase de un marcador.
Muchas gracias barman pero creo que hubo un mal entendido. La linea que necesito dibujar es una linea geométrica, no de texto, de todas formas muchas gracias ayudarme.

Cita:
Empezado por Netfalí
Tal vez has creado un Shape con el fondo pintado de blanco, y necesitas crear un Shape y dibujar sólo la línea.
Para poder tener una linea lo que hago es crear el TShape con forma de Rectángulo y asignarle una anchura de valor 1, con esto lo que consigo es que solo se vea una linea negra (la del borde). Lo de que no se vea el texto no es solo con el TShape, si no que si creo dinámicamente un TButton me ocurre lo mismo.

Mis primeras sospechas apuntaban a que los mensajes de Windows le estaban llegando solo al Shape y no al RichEdit, pero no estoy seguro, (tendré que probarlo).

En cuanto a lo de escribir directamente en el Canvas.... también lo pensé pero no consigo acceder al Canvas del RichEdit, a lo mejor alguién pueda decirme cómo.



Bueno, muchas gracias, sois tan atentos como siempre, (sigo en contacto).
Responder Con Cita
  #5  
Antiguo 20-04-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Sonic
...En cuanto a lo de escribir directamente en el Canvas.... también lo pensé pero no consigo acceder al Canvas del RichEdit, a lo mejor alguién pueda decirme cómo.
Me ha llamado la atención el problema, y he hecho un par de pruebas. Pensé que no debía ser muy complejo y como solución he llegado a ésto:

NOTA: Simplemente hay que redefinir el mensaje de pintado WMPaint, para pintar una línea en el interior del control (espero que sea lo que buscas...).

El ejemplo es en Delphi () aunque no te será difícil supongo pasarlo a C++.
El código del componente quedaría así:

Código Delphi [-]
  unit RichEditLine;
  
  interface
  
  uses
    Windows, Messages, SysUtils, Classes, Controls, StdCtrls, ComCtrls, Graphics;
  
  type
    TRichEditLine = class(trichedit)
    private
      procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
    end;
  
  procedure Register;
  
  implementation
  
  procedure Register;
  begin
    RegisterComponents('Neftalí', [trichEditLine]);
  end;
  
  { trichEditLine }
  procedure trichEditLine.WMPaint(var Message: TWMPaint);
  const
    CONST_SPACE = 10;
  var
    MCanvas: TControlCanvas;
    DrawBounds: TRect;
  begin
    inherited;
  
    // Crear el canvas
    MCanvas := TControlCanvas.Create;
    DrawBounds := ClientRect;
  
    // proteccon
    try
      // acceder al canvas
      MCanvas.Control := Self;
  
      // Configuracion de línea
      MCanvas.Pen.Color := clGray;
      MCanvas.Pen.Style := psDash    ;
      MCanvas.Pen.Width := 1;
      // Dibujar la línea
      MCanvas.MoveTo(CONST_SPACE, CONST_SPACE);
      MCanvas.LineTo(Self.Width - CONST_SPACE, CONST_SPACE);
      MCanvas.LineTo(Self.Width - CONST_SPACE, Self.Height - CONST_SPACE);
      MCanvas.LineTo(CONST_SPACE, Self.Height - CONST_SPACE);
      MCanvas.LineTo(CONST_SPACE, CONST_SPACE);
  
    finally
      MCanvas.Free;
    end;
  end;
  
  end.

P.D: Si te sirve el código y puedes pasarlo a C++, me gustaría ver cómo queda para comporar ambos. Thnks.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 20-04-2005 a las 11:12:08.
Responder Con Cita
  #6  
Antiguo 21-04-2005
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
Muchas gracias Netfalí, el código funciona casi a la perfección. El casi es porque la linea (en realidad yo sólo necesitaba una única linea vertical) aparece perfectamente al igual que el texto del RichEdit sin embargo cuando empiezo a escribir, la parte de la linea correspondiente al renglón en el que estoy escribiendo desaparece.

Pero sin duda es un gran avance, voy a ver si puedo resolver este pequeño percance y cuando lo tenga pegaré el código en C++ como me has pedido.


Muchísimas gracias!
Responder Con Cita
  #7  
Antiguo 21-04-2005
Sonic Sonic is offline
Miembro
 
Registrado: may 2004
Posts: 40
Poder: 0
Sonic Va por buen camino
Ya tengo el código!!!!

Si el RichEdit no tiene barras de Scroll funciona perfectamente. Para el caso en el que las barras existan tuve que responder también al mensaje WM_CHAR, para que si al escribir movemos las barras de Scroll la linea se siga dibujando.

Sin embargo si movemos el Scroll manualmente la linea no se dibuja hasta que la soltamos, eso aún tengo que arreglarlo, pero conforme voy avanzando parece que el código C++ se va distanciando del expuesto en Delphi, así que aunque aún no esté completo del todo he preferido colocarlo ya.

Como no sé mucho de Delphi, supongo que la traducción no es exacta pero al menos si parecida, ah por cierto, en lugar de crear una función que respondiera al mensaje WM_PAINT he creado una función que responda a todos los mensajes (para así poder hacer pruebas con otros mensajes que me pudieran hacer falta), bueno ahí pego el código y de nuevo muchas gracias Netfalí:


Código:
__fastcall TForm1::TForm1(TComponent* Owner)
		: TForm(Owner)
{
  // Creo un componente de la clase TDibuito (que hereda de TRichEdit)
  cuaderno=new TCuaderno(this);
  cuaderno->Parent=this;
  // Configuro algunas propiedades
  cuaderno->ScrollBars=ssBoth;
  cuaderno->WordWrap=false;

}
//-------------------------------------------------------------------------
__fastcall TCuaderno:: TCuaderno (TComponent* Owner)
		:TRichEdit(Owner)
{
  // Confiuro algunas propiedades
  Height=300;
  Width=500;
  // Creo el objeto MCanvas
  MCanvas= new TControlCanvas();
  MCanvas->Control=this;
  // Mediante esta asignación puedo responder a todos los eventos
  // Lo hago así por si me fuera necesario responder a más eventos
  // los pensados inicialmente
  Application->OnMessage= ApplicationEventsMessage;

}
//-------------------------------------------------------------------------
void __fastcall TCuaderno::ApplicationEventsMessage(tagMSG &Msg, bool &Handled)
{
  // Compruebo que el mensaje es alguno de los que me interesan
  if (((Msg.message==WM_PAINT)||(Msg.message==WM_CHAR))&&(Msg.hwnd==Handle))
  {
	// Envío manualmente el mensaje
	SendMessage(Msg.hwnd,Msg.message,Msg.wParam,Msg.lParam);
	// Pinto la linea que me interesa, siempre por debajo del texto escrito
	for (int a=0;a<=300;a++)
	  if (MCanvas->Pixels[50][a]==clWhite)
		MCanvas->Pixels[50][a]=clBlue;
	// Actualizo esta variable para que no se procese el mensaje de nuevo
	Handled=true;
  }
}
//-------------------------------------------------------------------------
Responder Con Cita
  #8  
Antiguo 21-04-2005
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.282
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por Sonic
...bueno ahí pego el código...
Gracias, era un tema de curiosidad, más que otra cosa .
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #9  
Antiguo 29-03-2007
mazuada mazuada is offline
Miembro
 
Registrado: ene 2006
Posts: 12
Poder: 0
mazuada Va por buen camino
Ya sé que igual es un poco tarde para preguntar sobre el tema...pero estaba buscando cómo insertar la linea vertical en mi RichEdit y como tampoco controlo mucho...alguien me podía explicar:
teniendo un TRichEdit y el código
que tan amablemente a facilitado Neftali
¿qué pasos tengo que dar para que aparezca esa linea vertical en mi trichedit?
Gracias por adelantado.
Un saludo,
María.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 09:50:28.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi