Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TStrings: как удалить пустые строки? [D7, WinXP]


Страницы:   1 2

Луарвик ©   (2004-08-05 20:02:00) 

Вот есть 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;


TUser   (2004-08-06 09:01:00) [1]

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


Anatoly Podgoretsky   (2004-08-06 08:53:00) [2]

Германн ©   (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;


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


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

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


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

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


Palladin   (2004-08-06 02:23:00) [5]


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

Почему? Все могут короли, в паскале тем более.
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:17:00) [6]

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

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


Anatoly Podgoretsky   (2004-08-05 20:57:00) [7]

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


begin...end   (2004-08-05 20:31:00) [8]


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

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


begin...end   (2004-08-05 20:28:00) [9]


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

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

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


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

> I: Byte;

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


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

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


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

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


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

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


Anatoly Podgoretsky   (2004-08-05 20:16:00) [14]

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


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

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


begin...end   (2004-08-05 20:12:00) [16]


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

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


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


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


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

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


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

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


Anatoly Podgoretsky   (2004-08-05 20:12:00) [19]

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


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

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

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;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо