TMemo
Наследник 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, чтобы вставить в него текст:
Code: |
Function SetCaretPosition(memo:TMemo; x,y:integer); {©Drkb v.3(2007): www.drkb.ru, ®Vit (Vitaly Nevzorov) - Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.} var i:integer; begin i := SendMessage(memo.Handle, EM_LINEINDEX, y, 0) + x; SendMessage(memo1.Handle, EM_SETSEL, i, i); end;
или
type TFake=class(TCustomMemo);
....
TFake(MyMemo).SetCaretPos() |
Страница 1 из 3