Идёт загрузка страницы...

htp://aptem.net.ru





Событие "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.
[000172]