Главная страница
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.025 c
1-1092019554
Faeton08
2004-08-09 06:45
2004.08.22
Динамические массивы


3-1091195736
Koala
2004-07-30 17:55
2004.08.22
Активные подключения


9-1083477699
Smoke_Gomel
2004-05-02 10:01
2004.08.22
Анимированные спрайты в Delphix


14-1090881129
g-l-u-k
2004-07-27 02:32
2004.08.22
Как скомпилить *.exe


1-1092130305
TUser
2004-08-10 13:31
2004.08.22
raise в потоке