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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2009, 15:49   #1
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
Плохо Удаление лишних символов из Memo

Здравствуйте! У меня такая проблема. Я хотел сделать программу, которая удаляла бы из memo все символы, кроме цифр и удаляла пустые строки. Сначала я решил всё перевести в двухмерный массив и работать с каждым символом в отдельности - результат был такой же, а длина кода - гораздо больше. Тогда я думал-думал и сделал так, как сейчас. А можно это как-то сделать ещё проще?

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  nums = ['1','2','3','4','5','6','7','8','9','0'];
var
  s: string;
  i,z:integer;
begin

//-----|Удаляем все символы, кроме nums|--------------

  for i  := 1 to memo1.Lines.Count do
    begin
      s:=memo1.Lines.Strings[i];
      z:=1;
      while z <= length(s) do
        begin
          if [s[z]]*nums<>[s[z]]
            then delete(s,z,1)
            else z:=z+1;
        end;
      Memo1.Lines.Strings[i]:=s;
    end;

//-----|Удаляем пустые строки|------------------------

  for  i:= 1 to memo1.lines.Count + 1 do
    begin
       if memo1.Lines.Strings[i] = ''
          then Memo1.Lines.Delete(i);
    end;
end;
Теперь насчет удаления пустых строк.
Строки удаляются, но если их несколько (подряд), то
приходится нажимать на кнопку несколько раз.
Я решил зациклить:

Код:
  for  i:= 1 to memo1.lines.Count + 1 do
    begin
      while memo1.Lines.Strings[i]= '' do
        begin
          if memo1.Lines.Strings[i] = ''
            then Memo1.Lines.Delete(i);
        end;
    end;
Всё получилось, только программа зависает.
Как можно это исправить?
Большое спасибо!
NSV вне форума Ответить с цитированием
Старый 17.06.2009, 16:02   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

цикл+проверяйте лучше с конца
Код:
  for  i:=memo1.lines.Count-1 downto 0 do
    begin
      while memo1.Lines.Strings[i]= '' do
        begin
          if memo1.Lines.Strings[i] = ''
            then Memo1.Lines.Delete(i);
        end;
    end;
для справки в массиве строк идет отсчет с 0 до memo1.lines.Count-1
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.06.2009, 16:14   #3
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
Печаль

Огромное спасибо! Получилось, почти. Если пустые строки идут в самом конце (внизу memo), то всё равно зависает

Точно, в самой первой строчке кода ошибка
Нужно не так,
Код:
//-----|Удаляем все символы, кроме nums|--------------
  for i  := 1 to memo1.Lines.Count do
а вот так:
Код:
  for i  := 0 to memo1.Lines.Count -1 do
иначе в первой строчке memo символы не удаляются

Цитата:
Сообщение от NSV Посмотреть сообщение
Если пустые строки идут в самом конце (внизу memo), то всё равно зависает
Попробовал избавиться от этого, удалив все строки в конце.
А можно всё это сделать как-то иначе?

Вот весь код:

Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  nums = ['1','2','3','4','5','6','7','8','9','0'];
var
  s: string;
  i,z:integer;
begin

//-----|Удаляем все символы, кроме nums|--------------
  for i  := 0 to memo1.Lines.Count -1 do
    begin
      s:=memo1.Lines.Strings[i];
      z:=1;
      while z <= length(s) do
        begin
          if [s[z]]*nums<>[s[z]]
            then delete(s,z,1)
            else z:=z+1;
        end;
      Memo1.Lines.Strings[i]:=s;
    end;

//-----|Удаляем пустые строки с конца|---------------- 
  while Memo1.Lines.Strings[Memo1.Lines.Count-1] = '' do
    memo1.Lines.Delete(Memo1.Lines.Count-1);

//-----|Удаляем оставшиеся пустые строки|------------
  for  i:=memo1.lines.Count - 1 downto 0 do
    begin
      while memo1.Lines.Strings[i]= '' do
        begin
          if memo1.Lines.Strings[i] = ''
            then Memo1.Lines.Delete(i);
        end;
    end; 
end;
Спасибо!

Последний раз редактировалось Stilet; 18.06.2009 в 12:16.
NSV вне форума Ответить с цитированием
Старый 19.06.2009, 12:33   #4
magicse
 
Регистрация: 19.06.2009
Сообщений: 3
По умолчанию Вот вариант

for i:=0 to memo2.lines.Count - 1 do begin
if trim(memo2.Lines.Strings[i]) = '' then begin
while (trim(memo2.Lines.Strings[i])= '') and (i < memo2.lines.Count - 1) do Memo2.Lines.Delete(i);
end;
memo2.Lines.Strings[i]:=trim(memo2.Lines.Strings[i]);
end;
magicse вне форума Ответить с цитированием
Старый 19.06.2009, 13:05   #5
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
Печаль

Хороший вариант, спасибо! Только пустые строки, которые идут после цифр (в самом конце) полностью не удаляются!
NSV вне форума Ответить с цитированием
Старый 19.06.2009, 13:24   #6
magicse
 
Регистрация: 19.06.2009
Сообщений: 3
По умолчанию тогда вот так

for i:=0 to memo2.lines.Count - 1 do begin
if trim(memo2.Lines.Strings[i]) = '' then begin
while (trim(memo2.Lines.Strings[i])= '') and (i <= memo2.lines.Count - 1) do Memo2.Lines.Delete(i);
end;
memo2.Lines.Strings[i]:=trim(memo2.Lines.Strings[i]);
end;
magicse вне форума Ответить с цитированием
Старый 19.06.2009, 13:49   #7
NSV
Форумчанин
 
Аватар для NSV
 
Регистрация: 27.05.2009
Сообщений: 127
Радость

Большое спасибо! Вот теперь всё работает! Всего один символ '=' - а какой результат!
NSV вне форума Ответить с цитированием
Старый 19.06.2009, 15:15   #8
magicse
 
Регистрация: 19.06.2009
Сообщений: 3
По умолчанию Суппер

вот и отличненько!)))))
magicse вне форума Ответить с цитированием
Старый 13.08.2011, 16:48   #9
hacknet
Форумчанин
 
Регистрация: 11.11.2008
Сообщений: 177
По умолчанию

а как удалить 0 символ в 0строке в мемо если он равняеться к примеру t а остальной текст оставить, к примеру если текст tblabla нужно удалить t и оставить blabla? пробую так не получаеться
Код:
if memo1.Lines[0+0]=('t') then
with Memo1 do Lines[0]:=copy(Lines[0],2,Length(Lines[0]));
если вписать один символ то он удалиться, а если tblabla то нифига не происходит

Последний раз редактировалось hacknet; 13.08.2011 в 18:05.
hacknet вне форума Ответить с цитированием
Старый 23.11.2012, 06:57   #10
AHBAR
Пользователь
 
Регистрация: 23.11.2012
Сообщений: 10
По умолчанию

Самый простой способ удаления пустых строк:
Код:
j:=0;
FOR i := 0 to Memo1.Lines.Count-1 do
    BEGIN
    IF Memo1.Lines[j] = '' THEN
       BEGIN
       Memo1.Lines.Delete(j);
       j := j - 1;
       END;
    j := j + 1;   
    END;
Если не использовать переменную j то при удалении пустой строки в МЕМО будет перескок на другую строку, а значит если будет несколько пустых строк подряд, то не все они удалятся. А с переменной j мы при удалении пустой строки возвращаемся на шаг назад.
AHBAR вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог функции Trim-удаление лишних пробелов в начале и в конце передаваемой строки GULINA Помощь студентам 6 23.05.2009 15:07
Массив символов и Memo (*_*) Общие вопросы Delphi 4 09.05.2009 10:39
Удаление лишних пробелов. Ввод/вывод в файл. Иван 883 Помощь студентам 13 31.03.2009 19:39
удаление лишних данных в ячейке mistx Microsoft Office Excel 2 24.02.2009 18:32
Удаление символов MURAD Общие вопросы C/C++ 3 19.08.2007 01:25