Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Lazarus, Free Pascal, CodeTyphon
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2020, 10:38   #1
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию Memo При нажатии на строке мемо2 выделяется соответствующая ей в мемо1

Подскажите. При нажатии на строке мемо2 выделяется соответствующая ей в мемо1. Заранее спасибо.

Код:
procedure TForm1.Memo2Click(Sender: TObject);
var
  Col: integer;
  Row: integer;
  str_1: string;
  number: integer;
  len_1: integer;

begin
   Col:=Memo2.CaretPos.x;                             
   Row:=Memo2.CaretPos.y;                           

   Edit1.Text:=inttostr(Memo2.CaretPos.y);
   number:=strtoint(Edit1.Text);                     

   str_1:=Memo1.Lines.Strings[number];            
   len_1:=Length(str_1);                               

   Form1.ActiveControl := Memo1;                   

   Memo1.SelStart:=Memo2.SelStart+Memo1.SelLength-Row;
   Memo1.SelLength:=Length(Memo1.Lines[number]);
end;

Последний раз редактировалось IvaNoff2020; 09.12.2020 в 10:41.
IvaNoff2020 вне форума Ответить с цитированием
Старый 09.12.2020, 11:26   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Lazarus работает с UTF8 строками (символ может занимать несколько байт) в частности русские буквы занимают по два байта.
Length(...) в Lazarus работает c байт-строкой (считает число байт, но не букв).
LengthUTF8(...)

Цитата:
выделяется соответствующая
???

а тексты в обоих мемо одинаковы ?

и назовите Мemo как-нибудь более различно чем одна цифра.
Код:
Memo1.SelStart:=Memo2.SelStart+Memo1.SelLength-Row;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 09.12.2020, 11:57   #3
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

evg_m, В memo1 записаны номера строк: от 0 допустим до 20. Такого же размера memo2 только заполнен он произвольно. Кириллицу не использую. Поэтому Length() меня вполне устраивает.
Вопрос как работает SelStart и SelLength я не совсем понимаю.
Если бы у меня был не Memo, а ListBox (в нем есть свойство аналогичное интересующее меня ItemIndex). По которому я могу выделить текущую строку. В Memo не выходит.
IvaNoff2020 вне форума Ответить с цитированием
Старый 09.12.2020, 13:19   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

SelStart и SelLength я не совсем понимаю.

приблизительно так
Код:
s:=Memo.Text; // все в "одну" строчку включая "разделители сток" #13#10 
r:=copy(s , selstart, sellength);  // это и будет выделенный текст (без учета "поправок" utf8)
и не учитывая что sellength может оказаться и отрицательным при выделении "с конца (выделения)"
только конечно наоборот.
находишь в полной строке(s) нужный фрагмент ( pos) это будет selStart
узнаешь его длину (utf8) это будет SelLength

быть может нужна просто таблица(сетка) StringGrid c двумя колонками???
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.12.2020 в 13:29.
evg_m вне форума Ответить с цитированием
Старый 09.12.2020, 14:44   #5
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

evg_m, Это не совсем то, что мне нужно. Видимо я плохо объясняю.
В memo1 записаны номера строк. В memo2 тоже записаны строки, но содержимое их не важно. Считаю кириллица отсутствует. Чтобы не заморачиваться с модулем LazUTF8.
При нажатии на строке memo2 активируется memo1 и в нем выделяется соответствующая строка (номер нажатой в memo2 строки). То есть если в memo2 нажата строка 'qwerty' и она 3 по счету. то в memo1 выделится строка '3'
Сopy(s, selstart, sellength) не выделяет строку, а лишь из переданной "вырезает" ее часть (подстроку) с такого-то символа по такой-то согласно переданной длине.
StringGrid тоже не подойдет.
Проблема в применении SelStart и SelLength.
Вложения
Тип файла: zip memo.zip (393.5 Кб, 0 просмотров)
IvaNoff2020 вне форума Ответить с цитированием
Старый 09.12.2020, 15:02   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

1.
Цитата:
только конечно наоборот.
находишь в полной строке(s) нужный фрагмент ( pos) это будет selStart
узнаешь его длину (utf8) это будет SelLength
бежишь по строке и считаешь сколько раз встретился разделитель(#13#10)
Цитата:
k:=1;
k:=posEx('#13#10', s, k); // столько раз до какой строки надо дойти
// это будет SelStart;

k2:=posEx('#13#10', s); // еще раз
// k2 -k это длина следующей строки и SelLength соответственно
2. а чего нельзя сделать с Grid ?

Цитата:
При нажатии на строке memo2
при нажатии на строке во Второй колонке
Цитата:
активируется memo1
grid уже активирован
Цитата:
и в нем выделяется соответствующая строка
выделяется соответствующая строка НО... первой колонки.

все это делается одной строкой
Код:
if grid.col=2 then grid.col:=1;
3. озвучьте исходную задачу (без упоминания Memo ListBox и прочих средств отображения ).
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 09.12.2020 в 15:09.
evg_m вне форума Ответить с цитированием
Старый 09.12.2020, 15:37   #7
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

evg_m, Задача, чтобы правильно заработало, то что описал выше через средство отображения Memo. Иначе, я бы проще сделал: данные закинул изначально построчно в ListBox и при нажатии на одном выделял ItemIndex другого. Ладно, спасибо. Попробую через posEx и подключенной библиотеки StrUtils.
IvaNoff2020 вне форума Ответить с цитированием
Старый 09.12.2020, 17:52   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

сага об X, Y, Z
X -решение с двумя Memo
Y -решение на Grid
Z -исходная неозвученая задача
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 10.12.2020, 13:04   #9
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

evg_m,
Сделал то, что мне нужно было. Спасибо, что пояснили, как работает selStart и selLength.
Правда я без posEx() сделал. Но работает как надо.

Код:
procedure TForm1.Memo2Click(Sender: TObject);
var
  number: integer;
  str_1: string;
  len_1: integer;
  i: integer;

  ind_13: integer;
  sum: integer;
  len_str: integer;
  selStart: integer;
  selLength: integer;

begin

   Edit1.Text := inttostr(Memo2.CaretPos.y);           // номер нажатой строки Memo2
   number := strtoint(Edit1.Text);

   str_1 := Memo1.Lines.Strings[number];               // соответствующая строка Memo1
   len_1 := UTF8Length(str_1);                         // длина соответствующей строки

   Form1.ActiveControl := Memo1;

   sum := 0;
   ind_13 := 0;
   for i := 0 to number do
   begin
      if( (i=0)or(i<>0) )then
      begin
         len_str := UTF8Length(Memo1.Lines.Strings[i]);
         sum := sum + UTF8Length(Memo1.Lines.Strings[i]) + 2;
         ind_13 := sum - 2;
      end;
   end;

   selStart := ind_13-len_str;
   selLength := len_str;

   Memo1.SelStart := selStart;
   Memo1.SelLength := selLength;

end;
IvaNoff2020 вне форума Ответить с цитированием
Старый 10.12.2020, 13:12   #10
IvaNoff2020
Пользователь
 
Регистрация: 09.12.2020
Сообщений: 30
По умолчанию

IvaNoff2020,

Только инициализацию str_1 и len_1 можно удалить конечно. Их же не использую в будущем.
IvaNoff2020 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сделать кнопку при нажатии показывался объект, при повторном нажатии пропадал. nyqpblcTuk Microsoft Office Excel 3 31.08.2017 14:32
Сколько выделяется памяти под ядро при использовании РАЕNX? dimoni414 Windows 0 24.04.2017 19:21
сколько памяти выделяется под двустороннюю очередь STL при инициализации? temp_acc Общие вопросы C/C++ 1 27.06.2012 18:11
кнопка выделяется при запуске Марк Охман Общие вопросы Delphi 7 23.02.2011 18:37
при наведении на один текст, выделяется другой bogachev JavaScript, Ajax 1 17.04.2009 16:48