Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   richedit (https://www.clubdelphi.com/foros/showthread.php?t=68103)

yossi 25-05-2010 02:46:49

richedit
 
Hola,
tengo un componente richedit, en el que el usuario escribe la descripcions de X cosa, quisiera que el usuario puediera configurar el formato de lo que escribe, es decir, cambiarle el color, el tipo de letra ponerlo en negrita, subrayarlo, cursiva, y sobre todo que lo pueda alinearlo a su gusto, incluyendo justificarlo como hace word. de paso lo que el usuario escribe en ese richedit tengo que guardarlo en la base de datos (mysql) en un campo que tengo longtext, y al recuperarlo para imprimirlo mediante un qreport quiero que tenga la configuracion que el usuario eligio.

he usado las funciones

Código Delphi [-]selstart; sellength; selattribute;


que me han funcionado bien, pero no se como hacer todo eso que me quiero, ya logre cambiar el tipo de letra, que el usuario escoje desde un combobox, pero no le logrado cambiar el color que el usuario escoje del combobox porque los tipos son incompatibles (tcaption and tcolor), no se cual atributo es el que me permite colocar el texto, negrita, subrayado y cursiva, ademas que solo me permite alinear a la izquierda, derecha y centro (no me deja justificar) y como hago para cuando lo guarde en la base de datos y lo recupero venga con el formato que escogio el usuario

se que pregunto mucho pero estoy aprendiendo a penas :(

yossi 25-05-2010 03:28:47

respondo el post, porque no puedo editar el anterior

ya se como cambiarle e, color, la letra, ponerlo en negrita, subrayado y cursiva pero aun no se como justificarlo, y busco aqui en el foro y en la web y no encuentro nada concreto, sera que no se puede?, tampoco logro nada con la base de datos

ecfisa 25-05-2010 03:50:39

hola yossi.

Usá la propiedad Paragraph del TRichEdit.

Ejemplo:
Código:


procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  case ComboBox1.ItemIndex of
    0:RichEdit1.Paragraph.Alignment:= taLeftJustify;
    1:RichEdit1.Paragraph.Alignment:= taRightJustify;
    2:RichEdit1.Paragraph.Alignment:= taCenter;
  end;
end;


En cuanto a tipo, color, estilo, etc.
Podes hacer por ejemplo:
Código:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if FontDialog1.Execute then
  begin
    RichEdit1.SelAttributes.Color:= FontDialog1.Font.Color;
    RichEdit1.SelAttributes.Style:= FontDialog1.Font.Style;
    RichEdit1.SelAttributes.Name:= FontDialog1.Font.Name;
    RichEdit1.SelAttributes.Size:= FontDialog1.Font.Size;
  end;
end;

Saludos

yossi 25-05-2010 04:16:53

gracias por la respuesta, pero de casualidad tambien sabras como puedo hacer con lo de la base de datos,

revisando el foro encontre esto

http://www.clubdelphi.com/foros/showthread.php?t=39524

pero no me esta funcionando bien

José Luis Garcí 25-05-2010 09:00:28

Busca en el foro y encontraras una funcion para justificar en Richedit, yoo trabajo con ella si no la encuentras, dimelo y te la busco en casa, por cierto si no recuerdo mal tambien es posible cambiar el color de fondo de una parte del texto por si quieres destacar algo.

yossi 25-05-2010 18:00:53

encontre esta funcion aca en el foro, no se si te refieres a esta que mencionan en este hilo
http://www.clubdelphi.com/foros/showthread.php?t=162

tambien encontre en otro hilo que mencionaban un componente "justifyrichedit"
lo descargue de aqui http://www.programmersheaven.com/dow.../download.aspx
para justificar funciona, tengo que probar las demas opciones

yossi 26-05-2010 01:50:43

el componente "justifyrichedit" es un richedit pero con la opcion de justificar el texto. ese problema ya esta resuelto gracias al foro y a ustedes

pero ahora tengo otra dificultad dentro de la misma

tengo un boton mediante el cual el texto seleccionado se coloca en negrita, igualmente ento botones para el subrayado, hacer que el texto se coloque en negrita o en subrayado ya lo hice, el problema esta en quitarle la negrita a un texto sin quitarle el subrayado, no hallo la manera de acceder a la propiedad fsbold del style directamente para colocarlo en false y asi mantener el subrayado.

alguna idea?

ecfisa 26-05-2010 04:03:03

Hola yossi.

Si utilizas un TButton podrías usar algo como este código:

Código:

procedure TForm1.btNegritaClick(Sender: TObject);
begin
  with RichEdit1.SelAttributes do
    if fsBold in Style then
      Style:= Style - [fsBold]
    else
      Style:= Style + [fsBold];
end;

Pero al hacer click sobre el TButton, perdes la selección del texto al perder el foco.
Mejor sería usar un TPopupMenu con los items: Negrita, Subrayado e Itálica. Asignar el
PopupMenu al TRichEdit y poner en el evento OnClick del TMenuItem lo siguiente:

Código:

procedure TForm1.Negrita1Click(Sender: TObject);
begin
  Negrita1.Checked := not Negrita1.Checked;
  with RichEdit1.SelAttributes do
    if Negrita1.Checked then
      Style:= Style + [fsBold]
    else
      Style:= Style - [fsBold];
end;

ahora te quedará la selección.

Tendrías que hacer lo mismo con Subrayado e Itálica. ([fsUnderline], [fsItalic])

Saludos.

Mystery 26-05-2010 13:52:51

Hola foro....
bueno yo trabajo con el delphi 6 y en los demos viene un buen ejemplo de trabajo con RichEdit... no se si en otras versiones de delphi aparece este demo...
bueno sin mas
Mystery

José Luis Garcí 26-05-2010 19:16:39

Te pongo el código que uso para lo siguiente

Código Delphi [-]

procedure TFprincipal.ColorBox2Click(Sender: TObject);
//-------------------------------------------------------------------------------
//***********************************************[color del fondo]****
//-------------------------------------------------------------------------------
var
  Format: CHARFORMAT2;
begin
  FillChar(Format, SizeOf(Format), 0);
  with Format do
  begin
    cbSize := SizeOf(Format);
    dwMask := CFM_BACKCOLOR;
    crBackColor := ColorBox2.Selected;
    redtrededitcion.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
  end;
end;

procedure TFprincipal.ColorBox1Click(Sender: TObject);
//-------------------------------------------------------------------------------
//*****************************************************[ELEGIMOS COLOR texto]****
//-------------------------------------------------------------------------------
begin
redtrededitcion.SelAttributes.Color := ColorBox1.Selected;
end;

procedure TFprincipal.btn5Click(Sender: TObject);
//-----------------------------------------------------------------------------
//**************************************************[ Justificar Texto  ]******
//-----------------------------------------------------------------------------
begin
   if Length(redtrededitcion.selText)>0 then JustifyRichEdit(redtrededitcion,FAlse)
                                        else JustifyRichEdit(redtrededitcion,True);
end;


// AllText : True=todo o texto; False=parágrafo atual
procedure JustifyRichEdit(RichEdit :TRichEdit; AllText :Boolean);
const
  TO_ADVANCEDTYPOGRAPHY   = $1;
  EM_SETTYPOGRAPHYOPTIONS = (WM_USER + 202);
  EM_GETTYPOGRAPHYOPTIONS = (WM_USER + 203);
var
  ParaFormat :TParaFormat;
  SelStart,
  SelLength :Integer;
begin
  ParaFormat.cbSize := SizeOf(ParaFormat);
  if SendMessage(RichEdit.handle,
              EM_SETTYPOGRAPHYOPTIONS,
              TO_ADVANCEDTYPOGRAPHY,
              TO_ADVANCEDTYPOGRAPHY) = 1 then
  begin
    SelStart := RichEdit.SelStart;
    SelLength := RichEdit.SelLength;
    if AllText then
      RichEdit.SelectAll;
    ParaFormat.dwMask := PFM_ALIGNMENT;
    ParaFormat.wAlignment := PFA_JUSTIFY;
    SendMessage(RichEdit.handle, EM_SETPARAFORMAT, 0, LongInt(@ParaFormat));
// Restaura seleção caso tenhamos mudado para All
    RichEdit.SelStart := SelStart;
    RichEdit.SelLength := SelLength;
  end;
end;

procedure TFprincipal.ColorBox3Change(Sender: TObject);
//-----------------------------------------------------------------------------
//*****************************************[ Color de Fondo del Editor  ]******
//-----------------------------------------------------------------------------
begin
   redtrededitcion.Color:=ColorBox3.Selected;
end;

Espero os sirva

ecfisa 26-05-2010 21:54:27

Hola José Luis.

Yo también tenía por algún lado esa rutina :rolleyes:... y buscando la encontré.

Y como suelo copiar y pegar las url, la saque de aqui :http://www.swissdelphicenter.ch/en/showcode.php?id=1438

Como detalle, agrego que hay que agregar
Código:

uses RichEdit;
si no, va a arrojar errores de identificador desconocido con: CHARFORMAT2, cbSize, ...

Saludos.

yossi 26-05-2010 22:05:49

muchisimas gracias a todos, ya he podido hacer todo lo que queria con mi richedit, las ideas que me dieron fueron muy buenas, tome un poco de cada uno para lograr mi objetivo :D


La franja horaria es GMT +2. Ahora son las 02:49:30.

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