Наследник TMemo со свойствами row & col:

 

 

Code:

SendMessage(Memo.Handle, EM_REPLACESEL, 0, PCHAR('Delphi World - это КРУТО!'));

  

Var TempBuf :Array [0..255] of Char;

SendMessage(Memo.Handle, EM_REPLACESEL, 0, StrPCopy(TempBuf,'Delphi World - это КРУТО!'));

  

Memo1.SelText := 'Delphi World!';

 

 

  

Code:

procedure LoadUnicodeFile(const filename: string; strings: TStrings);

 

procedure SwapWideChars(p: PWideChar);

begin

   while p^ <> #0000 do

   begin

     p^ := WideChar(Swap(Word(p^)));

     Inc(p);

   end;

end;

 

var

ms: TMemoryStream;

wc: WideChar;

pWc: PWideChar;

begin

ms := TMemoryStream.Create;

try

   ms.LoadFromFile(filename);

   ms.Seek(0, soFromend);

   wc := #0000;

   ms.Write(wc, sizeof(wc));

   pWC := ms.Memory;

   if pWc^ = #$FEFF then {normal byte order mark}

     Inc(pWc)

   else if pWc^ = #$FFFE then

   begin {byte order is big-endian}

     SwapWideChars(pWc);

     Inc(pWc);

   end

   else

     ; {no byte order mark}

   strings.Text := WideChartoString(pWc);

finally

   ms.free;

end;

end;

  

Использовать

 

LoadUnicodeFile(filename, memo1.lines);

 

Code:

procedure TfrmMain.Memo1Click(Sender: TObject);

var

Line: Integer;

begin

with (Sender as TMemo) do

begin

   Line      := Perform(EM_LINEFROMCHAR, SelStart, 0);

   SelStart  := Perform(EM_LINEINDEX, Line, 0);

   SelLength := Length(Lines[Line]);

end;

end;

 

 

Просто создайте собственный TxxxMemo: наследуйтесь от стандартного TMemo и перекройте метод Paint.

 

Вот мой старый пример, изменяющий цвет каждой строки:

 

 Результат совместной работы Fanasist'а и меня. Это компонент для Дельфи для известного пакета SynEdit (https://synedit.sourceforge.net), позволяющий на лету создавать подкраску синтаксиса по любым правилам любых форматов (создание и загрузка в run-time, хранение шаблонов на диске). В настоящее время пакет включает в себя более 300 готовых шаблонов для наиболее распространённых форматов, но каждый может создать свой собственный шаблон (можно с помошью компонента или используя прилагающуюся утилиту). Пример использования - простенький текстовый редактор с поддержкой любых расскрасок.

Платформа: Delphi 5/6/7

 Для работы необходимо установить предварительно установить пакет SynEdit (https://synedit.sourceforge.net).

 Компонент свободен для распространения и поставляется с исходными кодами.

Логика работы:

Для подкраски синтаксиса необходимо предусмотреть следующие правила:

1) расскраска всего кода в промежутке от одного слова до второго - например комментарии /*...*/ или строки "...."

2) расскраска ключевых слов

 

Это реализовано, кроме того бывают ситуации когда промежуток должен быть расскрашен по другому с другими правилами например ASP код внутри HTML или ассемблерные вставки внутри Дельфи - это тоже реализовано тем что внутри промежутка можно использовать свои правила и промежутки. Вложенность не лимитирована.

 Всем кому интересно, я создал форум для обсуждения компонента, правда сообщения писать только на английском, там уже идёт дискуссия с авторами проекта SynEdit:

Для рисования на поверхности TMemo необходимо создать создать собственный компонент, наследованный от TMemo и переопределить в нём рисование. Примерно так:

Code:

Memo1.Perform( WM_SETREDRAW, 0, 0 );

// ... здесь можно добавлять строки

Memo1.Perform( WM_SETREDRAW, 1, 0 );

Memo1.Refresh;

 

 

 Пошлите в Memo сообщение EM_SETTABSTOPS

 

Code:

procedure TForm1.FormCreate(Sender: TObject);

var

DialogUnitsX: LongInt;

PixelsX: LongInt;

i: integer;

TabArray: array[0..4] of integer;

begin

Memo1.WantTabs := true;

DialogUnitsX := LoWord(GetDialogBaseUnits);

PixelsX := 20;

for i := 1 to 5 do

   begin

     TabArray[i - 1] := ((PixelsX * i) * 4) div DialogUnitsX;

   end;

SendMessage(Memo1.Handle,

   EM_SETTABSTOPS, 5, LongInt(@TabArray));

Memo1.Refresh;

end;

 

Для чтения файла будем использовать TMemoryStream, а затем используем метод SetSelTextBuf() из TMemo, чтобы вставить в него текст: