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: