Экспертная система 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] [Следующая »]

min@y™

min@y™ (статус: Доктор наук), 20 октября 2009, 08:15 [#1]:

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

20 октября 2009, 12:31: Вопрос перемещён из тематического раздела Delphi » Прочее в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

Паровоз

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

Как же бывает удивительно. Плохая программа ценится больше, чем хорошая.
Kyran29

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

Здравствуйте, Паровоз !
Спасибо за ответ !
Ваш код работает наполовину! Если начинать выделять строки с верху - работает.
Если начнем выделять строки снизу. Верхняя строка независимо, сколько в ней выделено символов копируется полностью.
У min@y все работает !!!
Извини !!!
Паровоз

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

To Kyran29:
Вот цитатата из вашего вопроса:
"Копируется обрезанная строка, т.е. с того места, откуда начали выделять строки. Как вернуть ту часть строки, которая не была выделена"

Я понял это как желание копировать первую выделенную строку полностью. Изменить код так, чтобы он работал по-другому ничего не стоит.

Но дело не в этом, удивительна не ваша безграмотность, а нежелание учиться программированию.
min@y™

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

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

Плохая программа ценится больше, чем хорошая.


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

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

Уважаемый Паровоз !!!
Вас удивляет моя безграмотность, и нежелание учится программированию.
Но для чего же тогда создаются форумы ? Для слишком грамотных что ли ?
И наверное на этих форумах выученные, совсем умные программисты задают вопросы друг другу, и ставят себе баллы !!! Ха !!!
Вопрос мой стоял так : «Копируется обрезанная строка, т.е. с того места, откуда начали выделять строки. Как вернуть ту часть строки, которая не была выделена?»
В поле Memo строки можно выделить как с верху, так и снизу, т.е. как верхняя строка может стать последней выделенной строкой, так и нижняя строка может стать первой выделенной старкой.
На мой вопрос min@y™ (как мне безграмотному, нежелающему учится программированию), показалось, ответил более полно.
Я оценил!
Если я заблуждаюсь. Поправите. Объясните, почему у min@y™ плохая программа.
А слова типа «Но дело не в этом, удивительна не ваша безграмотность, а нежелание учиться программированию» Программированию не научат !!!
Ученик учится на ошибках !!!
Kyran29

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

min@y™ Спасибо !!! Я получил ответ на свой вопрос !!!!!!!
min@y™

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

Цитата (Kyran29):


Программированию не научат !!!


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

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

Цитата (Kyran29):

Спасибо !!! Я получил ответ на свой вопрос !!!!!!!


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

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

To Kyran29:

"верхняя строка может стать последней выделенной строкой, так и нижняя строка может стать первой выделенной старкой."
Вот, например, это и есть безграмотность. Есто общепринятая терминология, в которой "первая выделенная строка" имеет номер всегда меньший, чем "последняя". Это не просто слова , а термины.
min@y™

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

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

"верхняя строка может стать последней выделенной строкой, так и нижняя строка может стать первой выделенной старкой." Вот, например, это и есть безграмотность. Есто общепринятая терминология, в которой "первая выделенная строка" имеет номер всегда меньший, чем "последняя". Это не просто слова , а термины.


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

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

To min@y™:
Для того, чтобы получить число выделенных символов в строке (а в этом, фактически и состояла задача) нужно взять

b-SendMessage(Memo1.Handle,EM_LINEINDEX,ln1,0)
и
e-SendMessage(Memo1.Handle,EM_LINEINDEX,ln2,0)

А то, что Вы думали над этим больше часа и так не додумались, говорит о Вас совсем не лучшее.
Паровоз

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

To min@y™:

Так, что пиво Вы совсем не заслужили.
Паровоз

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

P.S.
Опечатка:
не число выделенных символов в ln1, а число невыделенных.
Паровоз

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

"Что это меняет? "
Меняет смысл задачи в том понимании, в котором понял ее я.
min@y™

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

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

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

Уважаемый паровоз !!!
Когда я задал в свой вопрос. В нем не говорилось ни слова, как про первую, так и про последнюю строку.
Цитата из вопроса : «с того места, откуда начали выделять строки»
Цитата из вопроса : «Так же при окончании выделения»
А строки можно начать выделять, как снизу так и сверху !!!
Это тоже надо учитывать.
Паровоз

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

To min@y™:
"То есть я некомпетентен?"

Здесь возможны два варианта:

1) В погоне за очками Вы стараетесь побыстрее принести автору вопроса горшок с цветами и Вам это здорово мешает спокойно подумать над вопросом.
2) Вы действительно некомпетентны.

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

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

To Kyran29:
Я уже ответил на Ваш вопрос. Вы мыслите как начинающий. А профессионалы мыслят терминами. И в Windows принято, что независимо от способа выделения "первая строка" - это строка с меньшим номером. Мы просто не поняли друг друга, об этом я и говорю Вам на будущее. А лично к Вам и к Вашей оценке я никаких претензий не имею.
min@y™

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

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

1) В погоне за очками Вы стараетесь побыстрее принести автору вопроса горшок с цветами и Вам это здорово мешает спокойно подумать над вопросом. 2) Вы действительно некомпетентны.


Третьего не дано? ©

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

Потому, что думать целый час над простым вопросом


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

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

Страницы: [1] [2] [Следующая »]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.