PDA

Ver la Versión Completa : richedit


yossi
25-05-2010, 02:46:49
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 [-] (http://www.clubdelphi.com/foros/#)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:

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:

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/download/22024/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:


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:


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



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
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