TRichEdit
Code: |
// This example doesn't use TReplaceDialog // Ohne Benutzung von TReplaceDialog
function Search_And_Replace(RichEdit: TRichEdit; SearchText, ReplaceText: string): Boolean; var startpos, Position, endpos: integer; begin startpos := 0; with RichEdit do begin endpos := Length(RichEdit.Text); Lines.BeginUpdate; while FindText(SearchText, startpos, endpos, [stMatchCase])<>-1 do begin endpos := Length(RichEdit.Text) - startpos; Position := FindText(SearchText, startpos, endpos, [stMatchCase]); Inc(startpos, Length(SearchText)); SetFocus; SelStart := Position; SelLength := Length(SearchText); richedit.clearselection; SelText := ReplaceText; end; Lines.EndUpdate; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Search_And_Replace(Richedit1, 'OldText', 'NewText'); end;
|
Code: |
function SearchForText_AndSelect(RichEdit: TRichEdit; SearchText: string): Boolean; var StartPos, Position, Endpos: Integer; begin StartPos := 0; with RichEdit do begin Endpos := Length(RichEdit.Text); Lines.BeginUpdate; while FindText(SearchText, StartPos, Endpos, [stMatchCase])<>-1 do begin Endpos := Length(RichEdit.Text) - startpos; Position := FindText(SearchText, StartPos, Endpos, [stMatchCase]); Inc(StartPos, Length(SearchText)); SetFocus; SelStart := Position; SelLength := Length(SearchText); end; Lines.EndUpdate; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin SearchForText_AndSelect(RichEdit1, 'Some Text'); end;
|
Code: |
uses RichEdit;
procedure RE_SetLineSpacing(ARichEdit: TRichEdit; lineSpacing: Byte); var pf2: ParaFormat2; begin FillChar(pf2, SizeOf(pf2), 0); pf2.cbSize := SizeOf(PARAFORMAT2); pf2.dwMask := PFM_LINESPACING; pf2.bLineSpacingRule := lineSpacing; SendMessage(ARichEdit.Handle, EM_SETPARAFORMAT, 0, Longint(@pf2)); end;
//Example: Setlinespacing to 1: procedure TForm1.Button1Click(Sender: TObject); begin RE_SetLineSpacing(RichEdit1, 1); end; |
Самое главное, что мне не нравится в Richedit - это то, что он сам меняет язык при перемещении по тексту, не смотря, что вы включили нужный язык, при переходе на участок текста, набраный другим языком.
этот баг я обхожу так.
я создаю потомка Richedit:
меню Component\New Component
указываю предком TRichedit
Переписаю обработку события WM_INPUTLANGCHANGE, при этом я не вызываю обработчик предка, т.е. Richedit-а
Заодно обрабатываю событие WM_INPUTLANGCHANGEREQUEST, которое сообщает, что пользователь изменил язык. Тут надо вызвать обработчик предка, а то не будет переключаться язык.
Вот что из этого получилось. Имеем исправленный компонент VCL с дополнительным событием.
Code: |
uses RichEdit;
procedure RE_SetSelBgColor(RichEdit: TRichEdit; AColor: TColor); var Format: CHARFORMAT2; begin FillChar(Format, SizeOf(Format), 0); with Format do begin cbSize := SizeOf(Format); dwMask := CFM_BACKCOLOR; crBackColor := AColor; Richedit.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format)); end; end;
// Example: Set clYellow background color for the selected text. procedure TForm1.Button1Click(Sender: TObject); begin RE_SetSelBgColor(RichEdit1, clYellow); end; |
Code: |
uses RichEdit;
// Using the Paragraph property procedure RE_AlignText1(ARichEdit: TRichEdit; alignment: TAlignment); begin ARichEdit.Paragraph.Alignment := alignment; end;
// Using PARAFORMAT2; nonVCL procedure RE_AlignText2(ARichEdit: TRichEdit; alignment: TAlignment); var pf2: PARAFORMAT2; begin FillChar(pf2, SizeOf(pf2), 0); pf2.cbSize := SizeOf(PARAFORMAT2); SendMessage(ARichEdit.Handle, EM_GETPARAFORMAT, 0, Longint(@pf2)); pf2.dwMask := PFM_ALIGNMENT; case alignment of taLeftJustify: pf2.wAlignment := PFA_LEFT; taCenter: pf2.wAlignment := PFA_CENTER; taRightJustify: pf2.wAlignment := PFA_RIGHT; end; SendMessage(ARichEdit.Handle, EM_SETPARAFORMAT, 0, Longint(@pf2)); end;
// Example: Right align text // Beispiel: Text rechtsbundig ausrichten procedure TForm1.Button1Click(Sender: TObject); begin RE_AlignText2(RichEdit1, taRightJustify); end; |
Автор: Лагонский Сергей Николаевич
В версии Borland Delphi 3 Client/Server я обнаружил, что при загрузке текста формата RTF методом "LoadFromStream" в компонент TRichEdit он не интерпретируется как RTF, а отображается полностью (со всеми управляющими символами). Разбираясь в исходном тексте модуля COMCTRLS.PAS (дата создания: 4 августа 1997 года, размер: 391728 байт) я нашел причину, из-за которой вышеуказанный метод не работал как надо. Ниже я привожу исходный и исправленный тексты реализации метода "TRichEditStrings.LoadFromStream" (измененные строки отмечены символом "!"):
1. Исходный текст
Code: |
{ To color text in a TRichEdit, follow this two steps:
1) Select the text with the SelStart, SelLength properties.
2) Set the text attribtutes through the SelAttributes property. }
{ 1. Example/ Beispiel:
Add a colored line to a TRichEdit: }
procedure AddColoredLine(ARichEdit: TRichEdit; AText: string; AColor: TColor); begin with ARichEdit do begin SelStart := Length(Text); SelAttributes.Color := AColor; SelAttributes.Size := 8; SelAttributes.Name := 'MS Sans Serif'; Lines.Add(AText); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin AddColoredLine(RichEdit1, 'Hallo', clRed); AddColoredLine(RichEdit1, 'Hallo', clGreen); end;
{ 2. Example/ Beispiel:
To color the 5 characters. Die ersten 5 Zeichen im Richedit blau einfдrben. }
procedure TForm1.Button1Click(Sender: TObject); begin RichEdit1.SelStart := 0; RichEdit1.SelLength := 5; RichEdit1.SelAttributes.Color := clBlue; end;
{ 3. Example/ Beispiel: ( by www.delphimania.de)
To color a specified line with a color So kann eine beliebige Zeile mit einer Farbe gefдrbt werden: }
procedure RE_ColorLine(ARichEdit: TRichEdit; ARow: Integer; AColor: TColor); begin with ARichEdit do begin SelStart := SendMessage(Handle, EM_LINEINDEX, ARow - 1, 0); SelLength := Length(Lines[ARow - 1]); SelAttributes.Color := AColor; SelLength := 0; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ZeileFaerben(RichEdit1, 4, clGreen); end; |
Вот так можно вставить картинку в формате Bitmap в позицию курсора в TRichEdit:
Автор: McAndrews
Code: |
//Кидаем на форму RichEdit1, Button1, OpenDialog1 //и по клику кнопки создаём следующую процедуру: procedure TForm1.Button1Click(Sender: TObject); var i, nFiles: integer; FileNames, UnitedText, Separator, Tmp: string; TextStream: TStringStream; begin TextStream := TStringStream.Create(''); Separator := '\par \par \par '; // это разеделитель между выводимыми // файлами, в данном случае - 3 параграфа UnitedText := '';
OpenDialog1.Options := OpenDialog1.Options // что бы можно было выбрать несколько + [ofAllowMultiSelect]; // файлов
RichEdit1.MaxLength := $7FFFFFF0; // предусмотрительно увеличиваем максимальный // объём загружаемых данных в RichEdit1
try // а вдруг что..
if OpenDialog1.Execute then begin nFiles := OpenDialog1.Files.count - 1; for i := 0 to nFiles do begin
FileNames := OpenDialog1.Files.Strings[i]; RichEdit1.Lines.LoadFromFile(FileNames); // открываем каждый файл поочереди // в RichEdit1 RichEdit1.Lines.SaveToStream(TextStream); // и записываем данные уже от туда в // поток TextStream, Tmp := TextStream.DataString; // а из потока во временную // переменную Tmp типа String,
TextStream.Position := 0; // ставим указатель в потоке на 0,
if i = 0 then // проверяем - является ли данный Tmp := copy(Tmp, 0, length(Tmp) - 5) // файл первый, последним, или else if i = nFiles then // или между ними, в зависимости Tmp := Separator + copy(Tmp, 2, length(Tmp)) // от этого удаляем управляющие else // символы начала или окончания Tmp := Separator + copy(Tmp, 2, length(Tmp) - 5); // RTF-файла и всталяем разделитель. // дело в том, что каждый RTF-файл // начинаетcz c символа '{' и заканчивается '}'. UnitedText := UnitedText + Tmp; // записываем всё в переменную UnitedText end;
TextStream.WriteString(UnitedText); // помещаем уже объеденённый текст в поток
TextStream.Position := 0; // ставим указатель на 0 RichEdit1.Lines.LoadFromStream(TextStream); // и записываем потом в RichEdit1 end; finally TextStream.Free; end; end; |
В стандартном RichEdit нельзя, для RichEdit с картинками используйте RichEdit из RxLib или JVCL.
Ниже представлен пример, который можно применить к RxRichEdit, RichEditEx, RichEdit98, и Microsoft RichTextBox (поставляемый с VB5+) не прибегая к использованию буфера обмена или OLE:
Страница 1 из 4