StringList.Add nie dodaje

0

Pomóżcie, bo się zakałapućkałem i nie wiem o co biega. Poniższy kod miał być uproszczoną wersją ExtractStrings - miał rozdzielać AString na podstawie Separator i zwracać porozdzielane stringi w TStringList. Nie chcę użyć ExtractStrings bo jeśli AString zaczyna się separatorem to potrzebuje mieć zwrócony pusty string, a ExtractStrings go pomija.

No i poniższa funkcja działa bardzo dobrze, w Tmp pojawiają się poprawnie rozdzielone stringi, tylko że linijka

SList.Add(Tmp);

nic nie robi - lista zostaje pusta. Lista jest poprawnie stworzona przez procedurę wywołującą, próbowałem też z TStrings zamiast TStringLists (w ExtractStrings jest TStrings) i za nic nie działa.
Pewnie robię jakiś głupi błąd - niech mi ktos go znajdzie bo program mi potrzebny na wczoraj, plz!

function ParseString(const AString: string;
                     const Separator:Char;
                     SList:TStringList):integer;
var
  CurPos, PrevPos:integer;
  Tmp:String;
begin
  Result:=0;
  CurPos:=0;
  repeat
    PrevPos:=Succ(CurPos);
    CurPos:=PosEx(Separator,AString,PrevPos);
    inc(Result);
    if SList<>nil then
    begin
      if CurPos=0 then
        Tmp:=Copy(AString,PrevPos,Length(AString))
      else
        Tmp:=Copy(AString,PrevPos,CurPos-PrevPos);

      SList.Add(Tmp);
    end;
  until CurPos=0;
end;
0

A czy to nie jest kwestia przekazania SList do funkcji (var) ?

0

Sam kod jest dobry... Na moim D7pe kompiluje się i śmiga bez problemu... Nie masz błędu gdzie indziej? Spróbuj może jeszcze w deklaracji funkcji zmienić SList: TStringList; na const SList: TStrings;.

0

Próbowałem już i const i var. Co nie powinno mieć znaczenia bo i tak przekazuje się wskaźnik przecież. Jedyna różnica to jak się da var:TStrings to nie można przekazać TStringList (potomka).

Może błąd jest gdzie indziej, ale w debuggerze podczas wykonywania krokowego procki lista jest i nic się nie dodaje. Mam gdzieś D7PE - spróbuję tam skompilować.

0

Na D5 też działa. Wywołuję w ten sposób:

procedure TForm1.Button3Click(Sender: TObject);
var sl:TStringList;
begin
sl:=TStringList.Create;
ParseString('|aaa|bbb|ccc|', '|', sl);
Memo1.Lines.Assign(sl);
sl.Free;
end;

Z ciekawości: jakiego Delphi posiadasz?

0
Bula napisał(a)

Z ciekawości: jakiego Delphi posiadasz?

2005 Prof

0

He he, oczywiście działało dobrze i sypało się zaraz po wyjściu z procki na czym innym. Zmyliło mnie, że wsadzenie SList do Watch nie wyświetla jego zawartości. Trzeba dać Slist[0] czy z innym indeksem.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.