• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Удаление строк в Memo

  • Автор темы Автор темы basil
  • Дата начала Дата начала

basil

Ученик
Почётный участник
Регистрация
12 Фев 2007
Сообщения
165
Реакции
3
Баллы
0
Удаление строк в Memo

Всем привет. Такая проблема: необходимо удалить 4 строки подряд в Мемо после строки, которая начитается со слова "ЗОНЕ", в приведенном коде прога почему то не удаляет 2-ю строку и удаляет 5-ю строку.

for i :=0 to memo1.Lines.Count do
if pos('ЗОНЕ',memo1.Lines) > 0 then
begin
memo1.lines.Delete(i+1);
memo1.lines.Delete(i+2);
memo1.lines.Delete(i+3);
memo1.lines.Delete(i+4);
end;
 
Потому что вы сначала вырезаете следующую строку, затем относительно вырезанного - через одну, затем относительно последней вырезанной - через две, потом - через три. По-другому, вследствие выполнения директивы Delete счетчик строк реинициализируется (перезаписывается), и принимает текущее значение, от которого и надо отталкиваться при следующем вызове данной директивы.
Правильнее будет так (обработчик нажатия кнопки)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: integer;
begin
for i :=0 to memo1.Lines.Count do
if pos('ЗОНЕ',memo1.Lines[i]) > 0 then
begin
memo1.lines.Delete(i+1);
memo1.lines.Delete(i+1);
memo1.lines.Delete(i+1);
memo1.lines.Delete(i+1);
end;
end;
Хотя я бы завел еще вложенный цикл от 1 до 4 и вырезал построчно. Команд поменьше писать и модифицировать программу, определяя количество удаляемых строк, будет легче.
 

Вложения

Все понял, большое спасибо, оч. помогло))))
 
Всем привет. Появилась еще одна проблема: необходимо удалить в файле все строки только содержащие сисмволы : и пробела
следующий код почемуто пропускает все:
var
s: string;
i,k: integer;
result: boolean;
t1: textfile;
begin
assignfile(t1,'c:\t1.txt');
reset(t1);
while not EOF(t1) do
begin
readln(t1,s);
begin //начинаем обработку построчно
k:=1;
result:= false;
repeat //начинаем поиск в текущей строке нужных символов
if (s[k]<>':') or (s[k]<>' ') then result := true // если в строке содержатсься другие
else k:=k+1; //симоволы то поиск удачный
until (result=true) or (k>Length(s));
if result=false
Then
delete(s,1,length(s)) //если строка содержит только ':' и ' ' тогда
else memo1.Lines.add(s) //удалем, если нет то добаляем в Мемо
end;
 
Всем привет. Появилась еще одна проблема: необходимо удалить в файле все строки только содержащие сисмволы : и пробела
следующий код почемуто пропускает все:

Естественно, пропускает. Потому что условие if (s[k]<>':') or (s[k]<>' ') выполняется ВСЕГДА! ЗаменИте OR на AND.
 
Да и в самом деле, что-то я затупил)) спасибо.
 
Назад
Сверху