Возвращаюсь вечером с работы домой, устал естессно, причём день выдался сплошь да рядом связаный с аккаунтами... подхожу к двери подъезда, вставляю ключ, дёргаю дверь... дверь не открывается - первая мысль "БЛИН , ОПЯТЬ ПАРОЛЬ СМЕНИЛИ"...(на самом деле ключ не до конца вставил)
procedure TfrmMain.Memo1Click(Sender: TObject);
var
Line: Integer;
beginwith (Sender as TMemo) dobegin
Line := Perform(EM_LINEFROMCHAR, SelStart, 0);
SelStart := Perform(EM_LINEINDEX, Line, 0);
SelLength := Length(Lines[Line]);
end;
end;
Here's the translation of the provided content into Russian:
Задача - выделить конкретную строку в контроле Memo.
В предоставленном кодовом фрагменте мы имеем процедуру TfrmMain.Memo1Click, которая обрабатывает событие клика по контролю Memo. Эта процедура пытается выбрать и выделить текущую строку, на которую пользователь нажал, рассчитывая свойства SelStart и SelLength.
Вот шаг за шагом, что код делает:
Он получает номер строки из позиции символа, где пользователь выбрал текст с помощью EM_LINEFROMCHAR.
Он рассчитывает индекс строки от номера строки с помощью EM_LINEINDEX.
Он устанавливает свойство SelStart в расчитанный индекс строки.
Он устанавливает свойство SelLength в длину текста на этой строке.
Однако, кажется, что в коде есть маленькая проблема. Если вы хотите выделить всю строку, вам нужно установить SelLength в количество символов в строке, а не только в длину строки, рассчитанную с помощью Lines[Line]. Это потому, что свойство SelLength specifies количество символов для выбора, а не количество строк.
Вот альтернативное решение:
procedure TfrmMain.Memo1Click(Sender: TObject);
var
Line: Integer;
begin
with (Sender as TMemo) do
begin
Line := Perform(EM_LINEFROMCHAR, SelStart, 0);
SelStart := Line * Memo.Lines - 1; // Рассчитать позицию начала строки
SelLength := Memo.Lines[Line].Length + 1; // Выделить всю строку
end;
end;
В этом коде мы рассчитываем SelStart умножением номера строки на общее количество строк и вычитанием одного (поскольку индексация начинается с нуля). Затем мы устанавливаем SelLength в длину текста на этой строке плюс один, чтобы выделить всю строку.
В статье описывается проблема с выделением строки в компоненте Memo при помощи кода на языке Delphi и рассмотрено решение этой проблемы.
Комментарии и вопросы
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.