Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

TStrings: как удалить пустые строки?   Найти похожие ветки 

 
Луарвик   (2004-08-05 20:02) [0]

Вот есть Memo с текстом. как лучше всего удалить из него пустые строки? Я написал процедуру, она работает, но все равно думаю может быть лучше.

procedure sdelete;
var i,a:integer;s:string;ss:TStrings;
label g;
begin
 ss:=form1.Memo1.lines;
 for a:=0 to 2 do
   begin
     for i:=0 to ss.Count-1 do begin
     if i> ss.Count-1 then goto g;
     s:=ss[i];
     if s="" then form1.tem.items.Delete(i);
   end;
 g:end;
end;


 
begin...end ©   (2004-08-05 20:09) [1]

var
 I: Byte;
begin
 for I := 0 to MemoName.Lines.Count - 1 do
   if MemoName.Lines[I] = "" then
     MemoName.Lines.Delete(I);
end;


 
афвуд   (2004-08-05 20:11) [2]

Пожалуй мой вариант лучше :)

procedure sdelete;
var i:integer;ss:TStrings;
begin
ss:=form1.Memo1.lines;
for i:=ss.Count-1 downto 0 do
  begin
  if ss[i]="" then form1.tem.items.Delete(i);
  end;
end;


 
Anatoly Podgoretsky ©   (2004-08-05 20:12) [3]

for I := form1.Memo1.lines.Count - 1 downto 0 do
  if form1.Memo1.lines[I] = "" then form1.Lines.Delete(i);


 
афвуд   (2004-08-05 20:12) [4]

begin...end, твой вариант не заработает, так как при удалении одной строчки он будет перепрыгивать через следующую.


 
s999   (2004-08-05 20:12) [5]


> for I := 0 to MemoName.Lines.Count - 1 do


только наоборот:
 for I := MemoName.Lines.Count - 1 downto 0 do

Почему, я думаю догадаться нетрудно.


 
begin...end ©   (2004-08-05 20:12) [6]


> [2] афвуд   (05.08.04 20:11)

Блин, всё время забываю эту фишку с downto :-)


 
Луарвик   (2004-08-05 20:14) [7]

Про "downto" в первый раз слышу. ОК! Пасибо!


 
Anatoly Podgoretsky ©   (2004-08-05 20:16) [8]

Да, а строки 256..20000000 Пушкин будет удалять?


 
Гаврила ©   (2004-08-05 20:22) [9]

MemoName.Lines.Text:=StringReplace(MemoName.Lines.Text, #13#10#13#10, #13#10, [rfReplaceAll])


 
Гаврила ©   (2004-08-05 20:23) [10]

Хотя пардон, 2 пустые подряд не удалит


 
афвуд   (2004-08-05 20:25) [11]

> I: Byte;

Да.. Я сразу не заметил :))  Уверенность то какая!


 
Луарвик   (2004-08-05 20:25) [12]

При чем тут такие строки? Anatoly, попрошу вас прекратить оффтопик! :)


 
begin...end ©   (2004-08-05 20:28) [13]


> [11] афвуд   (05.08.04 20:25)

Ну так в WinXP вообще ограничений на размер текста в Memo нету.
Так что и Cardinal может не хватить :-)

И вообще, хватит в меня камушки бросать :-)


 
begin...end ©   (2004-08-05 20:31) [14]


> [12] Луарвик   (05.08.04 20:25)

Не нервничай, это опять в мой адрес :-)


 
Anatoly Podgoretsky ©   (2004-08-05 20:57) [15]

Луарвик   (05.08.04 20:25) [12]
Хорошо пускай строку 256, автор совета уже посмеялся над промахом. И вообще не мучайся, а бери мой код в одну строку.


 
Германн ©   (2004-08-06 02:17) [16]

2 Anatoly Podgoretsky ©   (05.08.04 20:57) [15]
Пусть кто-то посмеялся.
Но все-таки "в одну строку" полный ответ не влезет.
Нельзя совместить в одной строке объявление переменной и работу с ней!

Нужно все-таки объяснить, что использование типа Byte в качестве счетчика TStrings.Lines - ну очень нехорошо.


 
Palladin ©   (2004-08-06 02:23) [17]


> Нельзя совместить в одной строке объявление переменной и
> работу с ней!

Почему? Все могут короли, в паскале тем более.
procedure lalala; var i:integer; begin for I := form1.Memo1.lines.Count - 1 downto 0 do  if form1.Memo1.lines[I] = "" then form1.Lines.Delete(i); end;

хоть всю программу в одну строку пиши...


 
Германн ©   (2004-08-06 02:55) [18]

2 Palladin ©   (06.08.04 02:23) [17]
Неужели и так можно! И без ограничений?


 
dhdd   (2004-08-06 04:15) [19]

a:=pos(#13#10,s);
while a>0 do begin
 delete(s,a,2);
 a:=posex(#13#10,s,a);
end;


 
Anatoly Podgoretsky ©   (2004-08-06 08:53) [20]

Германн ©   (06.08.04 02:17) [16]
Исполнительная часть использует одну операторную строку, объявления повторять нужды нет.

Объяснять про Byte надо begin...end, а он это и так понял, но если нет то он может завести отдельную ветку с этим вопросом и можно будет поговорить не только о байте, но и о других типах.

Palladin ©   (06.08.04 02:23) [17]

procedure lalala;
var
  i:integer;
begin
  for I := form1.Memo1.lines.Count - 1 downto 0 do  if
    form1.Memo1.lines[I] = "" then form1.Lines.Delete(i);
end;


Но здесь 5 строк, если выкинуть операторные скобки, то две - объявление и одна исполняемая (смысловая). Но если дойти до абсурда то от одной до 19 (не предел)

procedure
lalala;
var
i:
integer;
begin
for
I :=
form1.Memo1.lines.Count
- 1
downto
0
do
if
form1.Memo1.lines[I] =
""
then
form1.Lines.Delete(i);
end;


Поэтому есть смысл говорить о структурных строка от начала до ;, опуская операторные скобки, как составной оператор.


 
TUser ©   (2004-08-06 09:01) [21]

i:=0;
while i < Count do
  if Strings[i] = "" then
     Delete(i)
     else inc(i);



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.031 c
3-1090928149
Dimedrol
2004-07-27 15:35
2004.08.22
Что быстрее ? (View или неск. таблиц)


3-1090831438
qwerty2
2004-07-26 12:43
2004.08.22
Что за файл такой PDOXUSRS.NET?


1-1091711193
XXX
2004-08-05 17:06
2004.08.22
Диалог выбора директории


1-1091688013
serg128
2004-08-05 10:40
2004.08.22
Как скопировать в буфер всю строку из Grid?


14-1091723482
Никита
2004-08-05 20:31
2004.08.22
Меню как в Офисе ХР





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский