Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1090836150
MORA
2004-07-26 14:02
2004.08.22
Каскадное удаление вручную


14-1091701094
syte_ser78
2004-08-05 14:18
2004.08.22
иконки технологической арматуры


4-1089295110
Eugenez
2004-07-08 17:58
2004.08.22
Юзер на месте?


14-1091433251
Rouse_
2004-08-02 11:54
2004.08.22
If the function succeeds, the return value is nonzero


3-1090923336
DeepGray
2004-07-27 14:15
2004.08.22
DBGrid и маски значений.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский