Delphi procedura Explode

0

Cześć,
mam procedurę która "tnie" string :

procedure Explode(var a: array of string; Border, S: string);
var
S2: string;
i: Integer;
begin
i := 0;
S2 := S + Border;
repeat
a[i] := Copy(S2, 0,Pos(Border, S2) - 1);
Delete(S2, 1,Length(a[i] + Border));
Inc(i);
until S2 = '';
end;

i ... odwołanie się do niej:

var
S: string;
A: array[1..2] of String;
begin
S := Label1.Caption;
Explode(A, ',', S); znak według którego będzie "pocięty" string (,)

Label2.Caption:=(A[1]);
Label3.Caption:=(A[2]);
end;

Tu brak problemów bowiem tablica jak widać obejmuje zaledwie 2 elementy...
Jak przerobić ten kod, aby program obliczał A dla S ? Tzn: może wystąpić ilość
elementów od 1 do n Idealnym byłoby wówczas wpis do ListBox - co dla mnie byłoby rozwiązaniem wygodniejszym... Czy wystarczy zatem utworzenie tablicy dynamicznej ? dla A ?

Bardzo proszę o pomoc

Pozdrawiam

0

Nie będzie lepiej użyć TStringList?

0
type TTablica:array of string;
procedure Explode(var a: TTablica; Border, S: string);
var
  S2: string;
  i: Integer;
begin
  i  := 0;
  S2 := S + Border;
  repeat
    SetLength(a,i+1);
    a[i] := Copy(S2, 1,Pos(Border, S2) - 1);
    Delete(S2, 1,Length(a[i] + Border));
    Inc(i);
  until S2 = '';
end;
//...
//wywołanie procedury
var
  S: string;
  A: TTablica;
begin
//...itd
0

Możesz po prostu użyć ExtractStrings(); albo kodu z przykładu stąd.

0
program ExplodeStr;

{$APPTYPE CONSOLE}

type
  TValuesArr = array of String;

  procedure Explode(Line: String; Separator: Char; var Values: TValuesArr);
  var
    iOld, iNew: Word;
  begin
    Line := Line + Separator;
    SetLength(Values, 0);

    iOld := 1;
    iNew := 0;

    repeat
      Inc(iNew);

      if Line[iNew] = Separator then
        begin
          if iOld <= iNew - 1 then
            begin
              SetLength(Values, Length(Values) + 1);
              Values[High(Values)] := Copy(Line, iOld, iNew - iOld);
            end;

          iOld := iNew + 1;
        end;
    until iNew = Length(Line);
  end;

const
  LINE_TO_EXPLODE = '  Delphi  C++  Perl    Java  PHP   Ruby  BrainFuck  ';
var
  aValues: TValuesArr;
  I: Byte;
begin
  Explode(LINE_TO_EXPLODE, ' ', aValues);

  for I := Low(aValues) to High(aValues) do
    WriteLn('"', aValues[I], '"');

  ReadLn;
end.

Działa dla separatora jako pojedynczego znaku, ale dodatkowo pomija puste wartości;

Dla przykładu, liczba kawałków z tego łańcucha:

LINE_TO_EXPLODE = 'Delphi C++ Perl Java PHP Ruby BrainFuck';

będzie taka sama, jak z tego:

LINE_TO_EXPLODE = ' Delphi   C++     Perl  Java  PHP   Ruby  BrainFuck';

Henryk555 napisał(a)

Idealnym byłoby wówczas wpis do ListBox - co dla mnie byłoby rozwiązaniem wygodniejszym...

Więc musisz zamienić typ parametru:

procedure Explode(var a: array of string; Border, S: string);

na:

procedure Explode(List: TListBox; Border, S: string);

, po czym zamienić tą instrukcję:

a[i] := Copy(S2, 0,Pos(Border, S2) - 1);

na tą:

List.Items.Add(Copy(S2, 0,Pos(Border, S2) - 1));

i trochę pokombinować, jeśli chodzi o kod, który zamieściłeś Ty, lub @pelsta;

1 użytkowników online, w tym zalogowanych: 0, gości: 1