|
Вопрос # 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]
|
Паровоз (статус: 10-ый класс), 22 октября 2009, 21:35 [#21]:
"Я не думал над вопросом, я программу писал (насиловал клаву)."
Вот и я о том же, что насиловать плохо. А курением тоже не занимаюсь.
|
|
min@y™ (статус: Доктор наук), 22 октября 2009, 21:36 [#22]:
Цитата (Паровоз):
Потому, что думать целый час над простым вопросом и не догадаться, что нужно использовать API это ...
Что?
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
Kyran29 (статус: Посетитель), 22 октября 2009, 21:37 [#23]:
Расслабься min@y™ и попей пивка !!!
Я считаю, ты заработал !!!
|
|
min@y™ (статус: Доктор наук), 22 октября 2009, 21:48 [#24]:
Цитата (Kyran29):
Расслабься min@y™ и попей пивка !!! Я считаю, ты заработал !!!
Задача решена, ура, землекопа полтора! (©)
Кстати, угадал, я пиво щас пью.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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™ (статус: Доктор наук), 22 октября 2009, 22:19 [#28]:
Цитата (Паровоз):
А то что, во-первых, много пива пить вредно. А во-вторых, не надо носить горшки.
Конешно, сенсэй! Так и буду жить!
Цитата (Паровоз):
Так может писать код только человек, который себя не уважает как программист.
О как! Даже не могу представить себе, что это значит и как это сделать... Объясни, пожалуйста.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
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 (статус: Посетитель), 22 октября 2009, 22:44 [#32]:
Я все-таки считаю, что Вы Паровоз не правы.
Чем разводить стадию общения глухого и немого.
Написали бы код, как уважаемый программист, из нескольких строк!
Спокойной ночи !
|
|
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]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|