Выделить строку в TMemo по OnClick

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Выделить строку в TMemo по OnClick

Сообщение gvido » 18.07.2013 09:17:46

Добрый день.

Возможно вопрос уже обсуждался. Если так то прошу прощения за неумение искать.

Необходимо при клике мышкой в строке TMemo выделялась вся строка, по которой кликнул пользователь.
Нашел кучу примеров для Делфи, но они не работаю в лазарусе.
Вот один из примеров который рекомендуют:
процедура
Код: Выделить всё

procedure SelectMemoLine(Memo : TMemo) ;
var
   Line : integer;
begin
   with Memo do
   begin
     Line := Perform(EM_LINEFROMCHAR, SelStart, 0) ;
     SelStart := Perform(EM_LINEINDEX, line, 0) ;
     SelLength := UTF8Length(Lines[Line]) ;
   end;
end;

Использование:
Код: Выделить всё
procedure TForm1.Memo1Click(Sender: TObject) ;
begin
   SelectMemoLine(Memo1) ;
end;

Странность в том, что в какую строку бы не кликал, выделяется всегда только первая строка.
Ощущение такое, что мемо автоматом ставит курсор на первую строку в первую позицию.
Как побороть или что я не правильно делаю?
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Выделить строку в TMemo по OnClick

Сообщение Лекс Айрин » 18.07.2013 10:23:08

gvido, http://www.freepascal.ru/forum/viewtopic.php?f=5&t=2681
возможно, дело в этом:
Метод Perform не предназначен для отправки сообщений.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выделить строку в TMemo по OnClick

Сообщение gvido » 18.07.2013 10:50:32

Спасибо огромное!!! Вы оказались правы.

Вот рабочий код процедуры

Код: Выделить всё
procedure SelectMemoLine(Memo : TMemo) ;
var
   Line : integer;
begin
   with Memo do
   begin
     Line:=SendMessage(Handle, EM_LINEFROMCHAR, SelStart,0);
     SelStart :=SendMessage(Handle,EM_LINEINDEX, line, 0) ;
     SelLength := UTF8Length(Lines[Line]) ;
   end;
end;
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Выделить строку в TMemo по OnClick

Сообщение Лекс Айрин » 18.07.2013 11:31:21

gvido, тоже, судя по всему, можно сделать и по другому... через CaretPos...но у меня пока не получилось разобраться с его использованием... Не знаю, будет ли Ваш код кросс-платформенным...

PS: у меня, кстати, приведенный код не работает... скорее всего, из-за не подключенного модуля.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выделить строку в TMemo по OnClick

Сообщение amateur » 18.07.2013 15:57:05

у меня есть теория: все идеи которые появляются можно найти в нете...

попробуйте
Код: Выделить всё
procedure TForm1.Memo1Click(Sender: TObject);
var
  Row, Col: Integer;
begin
  Col:= Memo1.CaretPos.x;
  Row:= Memo1.CaretPos.y;
  Memo1.SelStart:= Memo1.SelStart+Memo1.SelLength-Col;
  Memo1.SelLength:= UTF8Length(Memo1.Lines[Row]); //там был Length, но он не есть найс
end;


взято: http://forum.lazarus.freepascal.org/index.php?topic=15709.0

может теория права :)
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Выделить строку в TMemo по OnClick

Сообщение Лекс Айрин » 18.07.2013 17:10:14

amateur, скорее всего, теория права. Спасибо за код... очень помог. Как обычно, все гениальное просто.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выделить строку в TMemo по OnClick

Сообщение gvido » 19.07.2013 01:51:06

Второй вариант тоже работает. И он, если я не ошибаюсь, кроссплатформенный.
Еще раз спасибо.
На сайте есть некая копилка кода и знаний?
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Выделить строку в TMemo по OnClick

Сообщение Лекс Айрин » 19.07.2013 08:38:47

gvido, конечно, кроссплатформенный.

gvido писал(а):На сайте есть некая копилка кода и знаний?


Есть. Но и сам форум такая копилка.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выделить строку в TMemo по OnClick

Сообщение gvido » 20.07.2013 03:11:55

Копилка лучше - предлагает конкретное решение конкретной задачи. Поиск решения по форуму, порой, становится весьма не простой задачей. Формулировка тем и вопросов у всех разная. Но это уже лирика, флуд и ИМХО.

Еще раз спасибо.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Выделить строку в TMemo по OnClick

Сообщение Лекс Айрин » 21.07.2013 22:10:29

дополнение ко второму способу ... Под линуксом у меня это заработало только если вручную установить фокус на мемо поле. Думаю, не помешает такое и под виндой оставить.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выделить строку в TMemo по OnClick

Сообщение amateur » 21.07.2013 23:08:10

1. Данный код - сильно поверхностное решение;
2. Если делать, то по совести - сделать как в дельфине: создать компонент на основе Tmemo с row и col и пляши как угодно. Но код винда онли. По крайней мере то что я встречал. Как сделать ШОБ везде не интересовался. Реальной нужды в подобной "каке" не было. И не пойму - зачем надо такое реализовывать. Т.е. - выделение строки. Вот для внутренних вещиц зачем надо row и col могу предположить, а вот для визуальщины х.з..
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Выделить строку в TMemo по OnClick

Сообщение Лекс Айрин » 21.07.2013 23:29:32

amateur, 1) но оно полностью рабочее.

2) по совести, мне это только в одном месте и надо. Создавать для этого компонент излишество. И указанный тобой код, с небольшой доработкой, кроссплатформенный.

А насчет того зачем это нужно... для блокнота графомана -- менять абзацы местами/удалять их. При переделке текстов полезная, но не очень-то распространенная фича.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Выделить строку в TMemo по OnClick

Сообщение gvido » 22.07.2013 01:56:53

Лекс Айрин писал(а):amateur, 1) но оно полностью рабочее.2) по совести, мне это только в одном месте и надо. Создавать для этого компонент излишество. И указанный тобой код, с небольшой доработкой, кроссплатформенный. А насчет того зачем это нужно... для блокнота графомана -- менять абзацы местами/удалять их. При переделке текстов полезная, но не очень-то распространенная фича.


Согласен с Вами. Был вопрос, о том, как можно сделать. Были предложены решения. Кем и как в дальнейшем будут применяться предложенные варианты - дело десятое. Тут же люди приходят за опытом , советом... Чтобы как то развиваться. :) Я, вот, глядя на многие решения, предлагаемые в различных темах, понимаю, что я еще даже не в пеленках. :) Поиск решений, Ваши подсказки, по интересующим меня вопросам помогают лучше разбираться с языком.
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31

Re: Выделить строку в TMemo по OnClick

Сообщение amateur » 22.07.2013 03:14:58

код то не мой :) Как я понял другой кросс реализации нет или не придумали еще :wink: .
Аватара пользователя
amateur
энтузиаст
 
Сообщения: 552
Зарегистрирован: 03.08.2007 10:15:32

Re: Выделить строку в TMemo по OnClick

Сообщение gvido » 22.07.2013 10:17:24

Если нет копирайта, то все общее. :) Все мы так или иначе "плагиатим". Иначе, если бы каждый из нас, заново, изобретал колесо, то где бы мы были сейчас?!?!?!?
gvido
постоялец
 
Сообщения: 188
Зарегистрирован: 28.03.2012 11:35:31


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 230

Рейтинг@Mail.ru