Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 305

/ вопрос открыт /

Здравствуйте, эксперты!
Вопрос мой заключается вот в чем.
При выделении и копировании строк из одного поля Memo во второе поле Memo2.Lines.Add(Memo1.SelText). Это понятно!
Но как только курсор находится не вначале строки IntToStr(Memo1.SelStart) > 0
Копируется обрезанная строка, т.е. с того места, откуда начали выделять строки.
Как вернуть ту часть строки, которая не была выделена? Так же при окончании выделения. Если в строке выделено >= 3 символов, то выделяем целую строку, если < 3 выделение с этой строки снимаем. Скопированные строки во втором поле Memo должны быть целые.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Kyran29 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Kyran29 (статус: Посетитель)
Вопрос отправлен: 20 октября 2009, 07:04
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: min@y™

Ну, функция, конечно, не претендует на оптимальность (её выполнение можно ускорить использованием промежуточных переменных), но, блин, работает! Потратил целый час на её написание.
Тестовое приложение прицепляю к ответу.
К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)

Приложение:
  1. {
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8. }
  9.  
  10. function GetSelectedLines(AMemo: TMemo): string;
  11. var
  12. Index: Integer;
  13. List: TStringList;
  14. begin
  15. if AMemo.SelLength < 3
  16. then begin
  17. Result:= '';
  18. Exit;
  19. end;
  20.  
  21. List:= TStringList.Create();
  22. try
  23. List.Text:= AMemo.SelText;
  24.  
  25.  
  26. if Length(List[0]) < 3
  27. then List.Delete(0)
  28. else begin
  29. Index:= AMemo.SelStart - 1;
  30.  
  31.  
  32. while (Index >= 0) and not (AMemo.Text[Index + 1] in [#13, #10]) do
  33. begin
  34. List[0]:= AMemo.Text[Index + 1] + List[0];
  35. Dec(Index);
  36. end;
  37. end;
  38.  
  39.  
  40. if (List.Count <> 0)
  41. then begin
  42. if Length(List[List.Count - 1]) < 3
  43. then List.Delete(List.Count - 1)
  44. else begin
  45.  
  46.  
  47.  
  48. while (Index <= Length(AMemo.Text)) and not (AMemo.Text[Index] in [#13, #10]) do
  49. begin
  50. List[List.Count - 1]:= List[List.Count - 1] + AMemo.Text[Index];
  51. Inc(Index);
  52. end;
  53. end;
  54. end;
  55.  
  56.  
  57. finally
  58. List.Free();
  59. end;
  60. end;


Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 20 октября 2009, 09:36
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: Паровоз

Здравствуйте, Kyran29!
Можно сделать так:

var
  b,e:Integer;
  ln1,ln2:Integer;
  cnt:Integer;
  i:Integer;
begin
  b:=Memo1.SelStart;
  e:=b+Memo1.SelLength;
  //первая выделенная строка:
  ln1:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,b,0);
  //последняя выделенная строка:
  ln2:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,e,0);
  //число символов, выделенных в последней строке:
  cnt:=e-SendMessage(Memo1.Handle,EM_LINEINDEX,ln2,0);
  if cnt<3 then dec(ln2);
  for i:=ln1 to ln2 do Memo2.Lines.Add(Memo1.Lines[i]);
end;

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 20 октября 2009, 13:18
Оценка за ответ: 3


Мини-форум вопроса

Всего сообщений: 35; последнее сообщение — 22 октября 2009, 23:37; участников в обсуждении: 3.

Страницы: [« Предыдущая] [1] [2]

Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 21:35 [#21]:

"Я не думал над вопросом, я программу писал (насиловал клаву)."

Вот и я о том же, что насиловать плохо. А курением тоже не занимаюсь.
min@y™

min@y™ (статус: Доктор наук), 22 октября 2009, 21:36 [#22]:

Цитата (Паровоз):

Потому, что думать целый час над простым вопросом и не догадаться, что нужно использовать API это ...


Что?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Kyran29

Kyran29 (статус: Посетитель), 22 октября 2009, 21:37 [#23]:

Расслабься min@y™ и попей пивка !!!
Я считаю, ты заработал !!!
min@y™

min@y™ (статус: Доктор наук), 22 октября 2009, 21:48 [#24]:

Цитата (Kyran29):

Расслабься min@y™ и попей пивка !!! Я считаю, ты заработал !!!


Задача решена, ура, землекопа полтора! (©)
Кстати, угадал, я пиво щас пью.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Kyran29

Kyran29 (статус: Посетитель), 22 октября 2009, 21:48 [#25]:

Но, Уважаемый Паровоз!
Я и есть начинающий !
И в моем вопросе нет ни слова про "первую строку" ! Признайтесь! А!!!
Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 22:02 [#26]:

To min@y™:
"Что?"

А то что, во-первых, много пива пить вредно. А во-вторых, не надо носить горшки.
Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 22:07 [#27]:

"Я и есть начинающий !
И в моем вопросе нет ни слова про "первую строку""
Так то оно так. Однако Вы плохо вчитываетесь в то, что Вам пишут. Разговор идет совсем о другом. Не нужно городить огород там, где достаточно двух строчек кода. И Вы упорно не хотите этого видеть. А то, что написал min@y™ в своем решение - это просто безобразие. Так может писать код только человек, который себя не уважает как программист. Об этом и идет речь, а не о том, что min@y™ ответил на Ваш вопрос.
min@y™

min@y™ (статус: Доктор наук), 22 октября 2009, 22:19 [#28]:

Цитата (Паровоз):

А то что, во-первых, много пива пить вредно. А во-вторых, не надо носить горшки.


Конешно, сенсэй! Так и буду жить!

Цитата (Паровоз):

Так может писать код только человек, который себя не уважает как программист.


О как! Даже не могу представить себе, что это значит и как это сделать... Объясни, пожалуйста.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
Kyran29

Kyran29 (статус: Посетитель), 22 октября 2009, 22:26 [#29]:

Ах, вот! О чем речь!!!
Уважаемый Паровоз!
Ну взяли бы и написали две строки кода !!!
К чему весь этот «сыр-бор». Не пойму ?
Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 22:30 [#30]:

P.S. Разговор перешел в стадию общения глухого и немого. Поэтому смысла отвечать дальше не вижу.
Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 22:43 [#31]:

"Ну взяли бы и написали две строки кода"
Ну вот, написал за 5 минут, проверить не успел:
var
  b,e:Integer;
  no1,no2:Integer;
  cnt1,cnt2:Integer;
  i:Integer;
begin
  b:=Memo1.SelStart;
  e:=b+Memo1.SelLength;
  ln1:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,b,0);
  ln2:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,e,0);
  no1:=SendMessage(Memo1.Handle,EM_LINEINDEX,ln1+1,0);
  no2:=SendMessage(Memo1.Handle,EM_LINEINDEX,ln2,0);
  cnt1:=no1-b-3;
  cnt2:=e-no2;
  if cnt1<3 then Inc(ln1);
  if cnt2<3 then Dec(ln2);
    Memo2.Clear;
  for i:=ln1 to ln2 do Memo2.Lines.Add(Memo1.Lines[i]);
  Memo1.SetFocus;
end;
Kyran29

Kyran29 (статус: Посетитель), 22 октября 2009, 22:44 [#32]:

Я все-таки считаю, что Вы Паровоз не правы.
Чем разводить стадию общения глухого и немого.
Написали бы код, как уважаемый программист, из нескольких строк!
Спокойной ночи !
Kyran29

Kyran29 (статус: Посетитель), 22 октября 2009, 22:57 [#33]:

Спасибо Паровоз !!!
Работает !!!
Вот и все !!!
А столько было лишних слов !!!
Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 23:34 [#34]:

P.S. Немного нужно подработать пилкой для ногтей:
var
  b,e:Integer;
  no1,no2:Integer;
  cnt1,cnt2:Integer;
  i:Integer;
begin
  b:=Memo1.SelStart;
  e:=b+Memo1.SelLength;
  ln1:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,b,0);
  ln2:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,e,0);
  no1:=SendMessage(Memo1.Handle,EM_LINEINDEX,ln1,0);
  no2:=SendMessage(Memo1.Handle,EM_LINEINDEX,ln2,0);
  cnt1:=Length(Memo1.Lines[ln1])-b+no1);
  cnt2:=e-no2;
  if cnt1<3 then Inc(ln1);
  if cnt2<3 then Dec(ln2);
    Memo2.Clear;
  for i:=ln1 to ln2 do Memo2.Lines.Add(Memo1.Lines[i]);
  Memo1.SetFocus;
end;
Паровоз

Паровоз (статус: 10-ый класс), 22 октября 2009, 23:37 [#35]:

Тфу-ты. Написал дишнюю скобку, нужно:
var
  b,e:Integer;
  no1,no2:Integer;
  cnt1,cnt2:Integer;
  i:Integer;
begin
  b:=Memo1.SelStart;
  e:=b+Memo1.SelLength;
  ln1:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,b,0);
  ln2:=SendMessage(Memo1.Handle,EM_LINEFROMCHAR,e,0);
  no1:=SendMessage(Memo1.Handle,EM_LINEINDEX,ln1,0);
  no2:=SendMessage(Memo1.Handle,EM_LINEINDEX,ln2,0);
  cnt1:=Length(Memo1.Lines[ln1])-b+no1;
  cnt2:=e-no2;
  if cnt1<3 then Inc(ln1);
  if cnt2<3 then Dec(ln2);
    Memo2.Clear;
  for i:=ln1 to ln2 do Memo2.Lines.Add(Memo1.Lines[i]);
  Memo1.SetFocus;
end;

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 21 апреля 2026, 14:58
Выполнено за 0.03 сек.