Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.01.2010, 21:24   #1
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
Вопрос Удаление строк в Memo

Всем привет, поздравляю всех с новым годом!!!

Подскажите что делаю не так. У меня в мемо есть текст в котором много лишних строк, я хочу их удалить.Текст примерно такого вида:

<Пустая строка>
Текст
<Пустая строка>
<Пустая строка>

Для удаления хотел воспользоваться вот таким кодом:

Код:
if Pos('Текст', memOnlyText.Lines.Text) then
begin
  memOnlyText.Lines.Delete(j-1);
  memOnlyText.Lines.Delete(j+1);
  memOnlyText.Lines.Delete(j+1);
  Exit;
end;
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 01.01.2010, 21:44   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Код:
i:=-1;
while i < Memo.Lines.Count-1 do begin
  inc(i);
  if Memo.Lines[i] = '' then begin
    Memo.Delete(i);
    dec(i);
  end;
end;
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 01.01.2010, 23:11   #3
Marsel737
Форумчанин
 
Аватар для Marsel737
 
Регистрация: 09.11.2009
Сообщений: 669
По умолчанию

Selestis, есть одна проблема, мне нужно удалять не все проблемы, а только один до текста, один после. Я не лишнюю строку в коде написал
Я не всегда знаю, о чем говорю, но знаю, что прав. © Мухаммед Али.
К чёрту обстоятельства. Я создаю возможности. © Брюс Ли
Marsel737 вне форума Ответить с цитированием
Старый 02.01.2010, 08:39   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
//if Pos('Текст', memOnlyText.Lines.Text) then
if pos('ntrcn',memonlytext.lines.string[j]>0 then
begin
  memOnlyText.Lines.Delete(j-1);
  memOnlyText.Lines.Delete(j+1);
  memOnlyText.Lines.Delete(j+1);
  Exit;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.01.2010, 12:01   #5
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
//if Pos('Текст', memOnlyText.Lines.Text) then
if pos('ntrcn',memonlytext.lines.string[j]>0 then
begin
  memOnlyText.Lines.Delete(j-1);
  memOnlyText.Lines.Delete(j+1);
  memOnlyText.Lines.Delete(j+1);
  Exit;
end;
Только вот у вас 2 ошибки.
Во-первых не String[j], а Strings[j].
Во-вторых не хватает скобки после Strings[j]
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 02.01.2010, 12:08   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m, скорее всего код работать НЕ БУДЕТ.
Похоже, что Вы не учитываете, что как только мы удалили строчку из Memo, все остальные строки СДВИГАЮТСЯ (у них уже новые индексы, поэтому Delete(j+1) удалит уже не ту строку, что планировалось!

Этого уже достаточно, чтобы код был нерабочим, но, кроме того, я в упор не вижу, где и как изменяется j, а без этого я на 99.9% уверен, что цикл по j огранизован неверно, и программа всё равно не будет правильно работать!
Кроме того, крайне не люблю программы, БЕЗ ВСЯКИХ проверок (в данном случаем, как минимум на то, что есть точно одна пустая строка до <Текст> и точно две после!

я бы решал задачу через обратный цикл.
вот мой рабочий вариант:
Код:
var j:integer;
begin
  j:=memOnlyText.Lines.Count-1;
  while j>=3 do
  begin
    if (Trim(memOnlyText.Lines[j])='') and
       (Trim(memOnlyText.Lines[j-1])='') and
       (Pos('Текст',memOnlyText.Lines[j-2])>0) and
       (Trim(memOnlyText.Lines[j-3])='') then
    begin
      memOnlyText.Lines.Delete(j);
      memOnlyText.Lines.Delete(j-1);
      memOnlyText.Lines.Delete(j-3);
      j := j - 3;
    end;
    Dec(j);
  end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.01.2010, 22:30   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

к вопросу порядка удалений
Цитата:
<Пустая строка> j-1
Текст j
<Пустая строка> j+1
<Пустая строка> 1+1 (еще оаз)
это был не рабочий код а пример что надо было исправлять Текст и
strings[j]
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.01.2010, 00:45   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
к вопросу порядка удалений
ну, вообще-то выше я привёл уже рабочий код..
но, по по вопросу порядка удалений, не хочется спорить, (и тем более проверять ),
но, имхо, мне кажется, что как только Вы выполните удаление строчки (j-1), то та строка, которая была
Цитата:
Текст j
станет строкой j-1
поэтому удалять надо строчку, следующую за текстом,
она уже будет иметь индекс J
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.01.2010, 10:42   #9
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Цитата:
станет строкой j-1
поэтому удалять надо строчку, следующую за текстом,
она уже будет иметь индекс J
согласен забыл про Delete(j-1)
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление лишних символов из Memo NSV Общие вопросы Delphi 10 23.11.2012 08:38
Удаление строк из Memo Leksda Общие вопросы Delphi 6 20.03.2009 15:31
Удаление конкретной строки Memo JakSon Общие вопросы Delphi 6 03.03.2008 09:35
Удаление пустрых строчек в Memo GAGARIN-NEW Общие вопросы Delphi 4 07.12.2007 17:09
Нумерация строк в Memo Макс84 Компоненты Delphi 10 02.04.2007 17:10