Delphi World - Событие Key Press и курсорные клавиши в TMemo
Delphi World - это проект, являющийся сборником статей и малодокументированных возможностей  по программированию в среде Delphi. Здесь вы найдёте работы по следующим категориям: delphi, delfi, borland, bds, дельфи, делфи, дэльфи, дэлфи, programming, example, программирование, исходные коды, code, исходники, source, sources, сорцы, сорсы, soft, programs, программы, and, how, delphiworld, базы данных, графика, игры, интернет, сети, компоненты, классы, мультимедиа, ос, железо, программа, интерфейс, рабочий стол, синтаксис, технологии, файловая система...
Событие 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.

Проект Delphi World © Выпуск 2002 - 2017
Автор проекта: Эксклюзивные курсы программирования