2014-04-08 26 views
7

Czy w Delphi dostępna jest jakaś wbudowana funkcja do usunięcia wszystkich łańcuchów z TStringList, które są puste?Usuń puste ciągi z TStringList

Jak przeglądać listę, aby usunąć te elementy?

Odpowiedz

17

Aby odpowiedzieć na pierwsze pytanie, nie ma w tym celu żadnej wbudowanej funkcji. Zapętlanie ręczne jest łatwe. Należy to zrobić:

for I := mylist.count - 1 downto 0 do 
begin 
    if Trim(mylist[I]) = '' then 
    mylist.Delete(I); 
end; 

Należy pamiętać, że na pętli musi przechodzić przez listę w odwrotnej kolejności zaczynając od hr-1 do 0 dla tej pracy.

Używanie Trim() jest opcjonalne, w zależności od tego, czy chcesz usunąć ciągi zawierające tylko spacje, czy nie. Zmiana instrukcji if na if mylist[I] = '' then spowoduje usunięcie tylko całkowicie pustych ciągów.

Oto pełna rutyna pokazując kod w akcji:

procedure TMyForm.Button1Click(Sender: TObject); 
var 
    I: Integer; 
    mylist: TStringList; 
begin 
    mylist := TStringList.Create; 
    try 
    // Add some random stuff to the string list 
    for I := 0 to 100 do 
     mylist.Add(StringOfChar('y', Random(10))); 
    // Clear out the items that are empty 
    for I := mylist.count - 1 downto 0 do 
    begin 
     if Trim(mylist[I]) = '' then 
     mylist.Delete(I); 
    end; 
    // Show the remaining items with numbers in a list box 
    for I := 0 to mylist.count - 1 do 
     ListBox1.Items.Add(IntToStr(I)+' '+mylist[I]); 
    finally 
    mylist.Free; 
    end; 
end; 
+2

Odwrotne przemieszczenie ma kluczowe znaczenie (+1). Być może odpowiedź powinna lepiej powiedzieć słowo na ten temat, zamiast opowiadać o "opcjonalnej" części "Trim". – Wolf

-1

Innym sposobem, który eliminuje narzut że przycinanie i Usuń incur..should pracę z dowolnego kompatybilnego obiektu TStringList.

S := Memo1.Lines.Text; 

// trim the trailing whitespace 
While S[Length(S)] In [#10, #13] Do 
    System.Delete(S, Length(S), 1); 

// then do the rest 
For I := Length(S) DownTo 1 Do 
    If (S[I] = #13) And (S[I-1] = #10) Then 
    System.Delete(S, I, 2); 
+0

Twoje rozwiązanie wprowadza wiele ** kosztów ogólnych dla zrozumienia **. Ale pomija zastosowanie tekstu do "Memo1.Lines.Text" po procesie normalizacji. BTW jest kompatybilny z 'TStrings' nie tylko' TStringList', spróbuj sprawdzić typ 'Memo1.Lines.Text'. – Wolf