| 
| 
 | Вопрос # 3 305/ вопрос открыт / | 
 |  Здравствуйте, эксперты!Вопрос мой заключается вот в чем.
 При выделении и копировании строк из одного поля  Memo во второе поле  Memo2.Lines.Add(Memo1.SelText). Это понятно!
 Но как только курсор находится не вначале строки IntToStr(Memo1.SelStart)  > 0
 Копируется обрезанная строка, т.е. с того места, откуда начали выделять строки.
 Как вернуть ту часть строки, которая не была выделена? Так же при окончании выделения. Если в строке выделено >= 3 символов, то выделяем целую строку, если < 3 выделение с этой строки  снимаем. Скопированные  строки во втором поле Memo должны быть целые.
 К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса) 
|  |   Вопрос задал: Kyran29 (статус: Посетитель)Вопрос отправлен: 20 октября 2009, 07:04
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: min@y™ Ну, функция, конечно, не претендует на оптимальность (её выполнение можно ускорить использованием промежуточных переменных), но, блин, работает! Потратил целый час на её написание.Тестовое приложение прицепляю к ответу.
 К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 
 Приложение:Переключить в обычный режим {      } function GetSelectedLines(AMemo: TMemo): string;var  Index: Integer;  List: TStringList;begin  if AMemo.SelLength < 3    then begin           Result:= '';           Exit;         end;   List:= TStringList.Create();  try    List.Text:= AMemo.SelText;      if Length(List[0]) < 3      then List.Delete(0)      else begin             Index:= AMemo.SelStart - 1;               while (Index >= 0) and not (AMemo.Text[Index + 1] in [#13, #10]) do               begin                 List[0]:= AMemo.Text[Index + 1] + List[0];                 Dec(Index);               end;           end;      if (List.Count <> 0)      then begin             if Length(List[List.Count - 1]) < 3               then List.Delete(List.Count - 1)               else begin                         while (Index <= Length(AMemo.Text)) and not (AMemo.Text[Index] in [#13,
#10]) do                        begin                          List[List.Count - 1]:= List[List.Count - 1] + AMemo.Text[Index];                          Inc(Index);                        end;                    end;           end;    finally    List.Free();  end;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™ (статус: Доктор наук), 20 октября 2009, 08:15 [#1]:A TListBox использовать для таких целей не проще? Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  20 октября 2009, 12:31: Вопрос перемещён из тематического раздела Delphi » Прочее в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А. 
|   | Паровоз (статус: 10-ый класс), 22 октября 2009, 18:19 [#2]:Как же бывает удивительно. Плохая программа ценится больше, чем хорошая. |  
|   | Kyran29 (статус: Посетитель), 22 октября 2009, 18:51 [#3]:Здравствуйте, Паровоз ! Спасибо за ответ !
 Ваш код работает наполовину! Если начинать выделять строки с верху -  работает.
 Если начнем выделять строки снизу.  Верхняя строка независимо, сколько в ней выделено  символов копируется полностью.
 У min@y  все работает !!!
 Извини !!!
 |  
|   | Паровоз (статус: 10-ый класс), 22 октября 2009, 19:02 [#4]:To Kyran29: Вот цитатата из вашего вопроса:
 "Копируется обрезанная строка, т.е. с того места, откуда начали выделять строки. Как вернуть ту часть строки, которая не была выделена"
 
 Я понял это как желание копировать первую выделенную строку полностью. Изменить код так, чтобы он работал по-другому  ничего не стоит.
 
 Но дело не в этом, удивительна не ваша безграмотность, а нежелание учиться программированию.
 |  
|   | min@y™ (статус: Доктор наук), 22 октября 2009, 19:38 [#5]: Цитата (Паровоз): Плохая программа ценится больше, чем хорошая.  
 Чем плоха моя прога?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Kyran29 (статус: Посетитель), 22 октября 2009, 20:10 [#6]:Уважаемый Паровоз !!! Вас удивляет моя безграмотность, и нежелание учится программированию.
 Но для чего же тогда создаются форумы ? Для слишком грамотных что ли ?
 И наверное на этих форумах  выученные, совсем умные программисты задают вопросы друг другу, и ставят себе баллы !!! Ха !!!
 Вопрос мой стоял так : «Копируется обрезанная строка, т.е. с того места, откуда начали выделять строки. Как вернуть ту часть строки, которая не была выделена?»
 В поле Memo строки можно выделить как с верху, так и снизу, т.е. как верхняя строка может стать последней выделенной строкой, так и нижняя строка может стать первой выделенной старкой.
 На мой вопрос   min@y™  (как мне безграмотному, нежелающему учится программированию),  показалось, ответил более полно.
 Я оценил!
 Если я заблуждаюсь. Поправите. Объясните, почему у   min@y™  плохая программа.
 А слова типа «Но дело не в этом, удивительна не ваша безграмотность, а нежелание учиться программированию» Программированию не научат !!!
 Ученик учится на ошибках !!!
 |  
|   | Kyran29 (статус: Посетитель), 22 октября 2009, 20:17 [#7]:min@y™  Спасибо !!!  Я получил ответ на свой вопрос !!!!!!! |  
|   | min@y™ (статус: Доктор наук), 22 октября 2009, 20:18 [#8]: Цитата (Kyran29): Программированию не научат !!!
 
 
 22.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | min@y™ (статус: Доктор наук), 22 октября 2009, 20:37 [#9]: Цитата (Kyran29): Спасибо !!! Я получил ответ на свой вопрос !!!!!!!  
 Где моё пиво?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Паровоз (статус: 10-ый класс), 22 октября 2009, 20:47 [#10]:To  Kyran29: 
 "верхняя строка может стать последней выделенной строкой, так и нижняя строка может стать первой выделенной старкой."
 Вот, например, это и есть безграмотность. Есто общепринятая терминология, в которой "первая выделенная строка" имеет номер всегда меньший, чем "последняя". Это не просто слова , а термины.
 |  
|   | 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™ (статус: Доктор наук), 22 октября 2009, 21:03 [#16]:То есть я некомпетентен? Тогда почему задача решена?
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | 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™ (статус: Доктор наук), 22 октября 2009, 21:23 [#20]: Цитата (Паровоз): 1) В погоне за очками Вы стараетесь побыстрее принести автору вопроса горшок с цветами и Вам это здорово мешает спокойно подумать над вопросом. 2) Вы действительно некомпетентны. 
 Третьего не дано? ©
 
 
 Цитата (Паровоз): Потому, что думать целый час над простым вопросом 
 Я не думал над вопросом, я программу писал (насиловал клаву).
 
 Ты какие сигареты куришь? Я - красный Winston.
 Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  Страницы: [1] [2] [Следующая »]  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |