![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TStrings: как удалить пустые строки? [D7, WinXP]
Луарвик © (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;