procedure CaretPos(H: THandle; var L, C: Word);
begin
L := SendMessage(H, EM_LINEFROMCHAR, -1, 0);
C := LoWord(SendMessage(H, EM_GETSEL, 0, 0)) -
SendMessage(H, EM_LINEINDEX, -1, 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
LineNum, ColNum: Word;
begin
CaretPos(Memo1.Handle, LineNum, ColNum);
Edit1.Text := IntToStr(LineNum) + ' ' + IntToStr(ColNum);
end;
Хотя в Delphi 5 свойство CaretPos уже включено в memo.
Here's the translation of the text into Russian:
Красивый фрагмент кода на Delphi!
Процедура CaretPos используется для получения текущей позиции курсора (номер строки и столбца) в контроле памяти (TMemo). Процедура принимает.handle к контролу памяти и два переменных для хранения номера строки и столбца.
Вот разбор, что делает процедура:
Она отправляет сообщение EM_ LINEFROMCHAR контролу памяти с символом -1 (что означает "текущая позиция курсора") и handle окна 0. Это возвращает номер строки, где находится курсор.
Затем она отправляет сообщение EM_GETSEL контролу памяти с параметром 0, что возвращает текущие позиции начала и конца выбора как LPARAM (32-разрядное целое число). Функция LoWord используется для извлечения низшего слова (первых 16 бит) из этого значения, которое представляет собой позицию символа.
Она вычитывает номер строки, полученный в шаге 1, из позиции символа, полученной в шаге 2, чтобы получить номер столбца.
В процедуре Button1Click, когда кнопка нажата, она вызывает CaretPos с handle контрола памяти Memo1 и хранит возвращенные значения в LineNum и ColNum. Затем она устанавливает текст контроля редактирования (Edit1) в строковое представление этих значений (например, "5 10" для строки 5, столбца 10).
Как вы упомянули, Delphi 5 имеет встроенный свойство CaretPos для контролов памяти, что делает этот код несколько избыточным. Однако, это реализация может быть полезной, если вам нужно получить позицию курсора более явно.
Вот альтернативное решение с использованием встроенного свойства CaretPos:
Это код более прост и прямолинейный, так как он напрямую доступ к свойствам CaretLine и CaretColumn контрола памяти.
В статье предлагается решение задачи определения координат курсора в Memo 2 в Delphi, используя процедуры SendMessage и EM_GETSEL для получения информации о выделенном тексте.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.