Форум: "Основная";
Текущий архив: 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.032 c