Событие Key Press и курсорные клавиши в TMemo
Вам повезло. Совсем недавно мне пришлось помучиться с этой задачкой. Я переместил функции в отдельный модуль. Для тестирования кода создайте пустую форму с одним компонентом Tmemo.
Вам потребуется перехватывать ряд событий. В приведенном ниже коде я создал обработчиков всех возможных для данной операции событий, выберите себе необходимые сами. Некоторые из событий могут иметь общий обработчик.
Данный пример отображает в заголовке текущие координаты курсора (столбец, строка).
Я не стал отображать координаты, когда текст выбран, поскольку не был уверен как этим оперировать без рассогласования...
Сообщайте мне о любых возникающих проблемах, но я уверен что это должно работать как положено.
unit Unit1; interface uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Memo1: TMemo; procedure Memo1Change(Sender: TObject); procedure Memo1Click(Sender: TObject); procedure Memo1Enter(Sender: TObject); procedure Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); procedure Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); private { Private declarations } function GetLineIndex: Word; function GetStrInsertIndex: Word; procedure GetCursorCoord; public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} function TForm1.GetLineIndex: Word; begin Result := SendMessage(Memo1.handle, EM_LINEFROMCHAR, memo1.selstart, 0); end; function TForm1.GetStrInsertIndex: word; begin GetStrInsertIndex := memo1.Selstart - SendMessage(Memo1.handle, EM_LINEINDEX, GetLineIndex, 0) end; procedure TForm1.GetCursorCoord; var LineIndex: word; LineChar: byte; SelSt: word; begin SelSt := Memo1.selstart; LineIndex := GetLineIndex; Linechar := GetStrInsertIndex; if Memo1.seltext > '' then Caption := 'Выбранный текст' else Caption := 'Колонка ' + inttostr(LineChar + 1) + ' , ' + 'Строка ' + inttostr(Lineindex + 1); end; procedure TForm1.Memo1Change(Sender: TObject); begin GetCursorCoord; end; procedure TForm1.Memo1Click(Sender: TObject); begin GetCursorCoord; end; procedure TForm1.Memo1Enter(Sender: TObject); begin GetCursorCoord; end; procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin GetCursorCoord; end; procedure TForm1.Memo1KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); begin GetCursorCoord; end; procedure TForm1.Memo1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin GetCursorCoord; end; procedure TForm1.Memo1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin GetCursorCoord; end; end.
DelphiWorld 6.0