Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.028 c
9-1079999810
Новичек
2004-03-23 02:56
2004.08.22
Как написать 3d-игру?


14-1091799473
mm0
2004-08-06 17:37
2004.08.22
Ламерский вопрос про Bad blocks


1-1091902043
Star
2004-08-07 22:07
2004.08.22
Разбор строки по флагу


11-1079715719
nester
2004-03-19 20:01
2004.08.22
Как убрать заголовки страниц в TabControl?


1-1091775212
student__
2004-08-06 10:53
2004.08.22
подсчет секунд