|
Вопрос # 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] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|