How to implement smart indentation in a TRichEdit (Views: 28)
Problem/Question/Abstract: Is it possible to get the same indenting behaviour as in the Delphi editor into a TRichEdit or a TMemo? When I press enter for a new row I want the cursor to be positioned on the same column as the row above. Answer: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; RichEdit1: TRichEdit; procedure RichEdit1KeyPress(Sender: TObject; var Key: Char); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation uses richedit; {$R *.DFM} procedure TForm1.RichEdit1KeyPress(Sender: TObject; var Key: Char); var line, col, indent: integer; S: string; begin if key = #13 then begin key := #0; with sender as TRichEdit do begin {figure out line and column position of caret} line := PerForm(EM_EXLINEFROMCHAR, 0, SelStart); Col := SelStart - Perform(EM_LINEINDEX, line, 0); {get part of current line in front of caret} S := Copy(lines[line], 1, col); {count blanks and tabs in this string} indent := 0; while (indent < length(S)) and (S[indent + 1] in [' ', #9]) do Inc(indent); {insert a linebreak followed by the substring of blanks and tabs} SelText := #13#10 + Copy(S, 1, indent); end; end; end; end. |