Ĺadny brzuch
Jak ze stringawartość1|wartość2|wartość3 itdwyciągnąć te wartości do poszczególnych komponentów edit? Długość każdej wartości nie jest ustalona. Funkcja Pos odpada.
skoro odpada Pos to użyj PosEx :D
skok w świat PHP ;-)
type TStrArray = array of string; function Explode(var a: TStrArray; Border, S: string): Integer; var S2: string; begin Result := 0; S2 := S + Border; repeat SetLength(A, Length(A) + 1); a[Result] := Copy(S2, 0,Pos(Border, S2) - 1); Delete(S2, 1,Length(a[Result] + Border)); Inc(Result); until S2 = ''; end; // How to use it: // Und hier ein Beispiel zur Verwendung: procedure TForm1.Button1Click(Sender: TObject); var S: string; A: TStrArray; AnzTokens, i: Integer; begin S := 'Ein=Text=durch=Geleichzeichen=getrennt'; AnzTokens := Explode(A, '=', S); for i := 0 to AnzTokens -1 do Memo1.Lines.Add(A[i]); end;
Ale nie PosEx :)
Możesz też skorzystać z gotowej funkcji ExtractStrings.
Trzeci sposób to pętla i "jechanie" po każdym znaku. Jeżeli znajdzie znak rozdzielający to kopiuje tekst od ostatniego znalezionego znaku lub początku i wrzuca go do edit ;]
//dopisane
osz Bełdzio szybszy :(
Użytkownik -=PcSA=- edytował ten post 20 maj 2006, 15:27
http://forum.ks-eksp...showtopic=37961
można również tak
type  TTableString = Array Of String; function explode(str: String; rozdzielacz: Char): TTableString; var  i, j: Integer; begin  j:=1; i:=1;  while i <= Length(str) do  begin   if (str[i] = rozdzielacz) or (i = Length(str)) then   begin    if (i = Length(str)) and (str[i] <> rozdzielacz) then     inc(i);    SetLength(Result, High(Result)+2);    Result[High(Result)] := Trim(Copy(str, j, i-j));    j := i+1;   end;   inc(i);  end; end;
i teraz na przykład tak
var ss: TTableString; begin ss:= explode('wartość1|wartość2|wartość3','|'); Edit1.Text:= ss[0]; Edit2.Text:= ss[1]; itd...
Użytkownik Blooom edytował ten post 20 maj 2006, 16:08
A można i tak:
procedure Rozdziel(Tekst: String); var i: Integer; st: TStrings; begin st := TStringList.Create; try st.Delimiter := '|'; st.DelimitedText := Tekst; //teraz masz tekst rozdzielony na poszczególne linijki Edit1.Text := st[0]; Edit2.Text := st[1]; //itd. oczywiście, musisz kontrolować, czy elementy //o podanych indeksach istnieją;P finally st.Free; end; end;
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
skoro odpada Pos to użyj PosEx :D
skok w świat PHP ;-)
type TStrArray = array of string; function Explode(var a: TStrArray; Border, S: string): Integer; var S2: string; begin Result := 0; S2 := S + Border; repeat SetLength(A, Length(A) + 1); a[Result] := Copy(S2, 0,Pos(Border, S2) - 1); Delete(S2, 1,Length(a[Result] + Border)); Inc(Result); until S2 = ''; end; // How to use it: // Und hier ein Beispiel zur Verwendung: procedure TForm1.Button1Click(Sender: TObject); var S: string; A: TStrArray; AnzTokens, i: Integer; begin S := 'Ein=Text=durch=Geleichzeichen=getrennt'; AnzTokens := Explode(A, '=', S); for i := 0 to AnzTokens -1 do Memo1.Lines.Add(A[i]); end;
Ale nie PosEx :)
Możesz też skorzystać z gotowej funkcji ExtractStrings.
Trzeci sposób to pętla i "jechanie" po każdym znaku. Jeżeli znajdzie znak rozdzielający to kopiuje tekst od ostatniego znalezionego znaku lub początku i wrzuca go do edit ;]
//dopisane
osz Bełdzio szybszy :(
Użytkownik -=PcSA=- edytował ten post 20 maj 2006, 15:27
http://forum.ks-eksp...showtopic=37961
można również tak
type  TTableString = Array Of String; function explode(str: String; rozdzielacz: Char): TTableString; var  i, j: Integer; begin  j:=1; i:=1;  while i <= Length(str) do  begin   if (str[i] = rozdzielacz) or (i = Length(str)) then   begin    if (i = Length(str)) and (str[i] <> rozdzielacz) then     inc(i);    SetLength(Result, High(Result)+2);    Result[High(Result)] := Trim(Copy(str, j, i-j));    j := i+1;   end;   inc(i);  end; end;
i teraz na przykład tak
var ss: TTableString; begin ss:= explode('wartość1|wartość2|wartość3','|'); Edit1.Text:= ss[0]; Edit2.Text:= ss[1]; itd...
Użytkownik Blooom edytował ten post 20 maj 2006, 16:08
A można i tak:
procedure Rozdziel(Tekst: String); var i: Integer; st: TStrings; begin st := TStringList.Create; try st.Delimiter := '|'; st.DelimitedText := Tekst; //teraz masz tekst rozdzielony na poszczególne linijki Edit1.Text := st[0]; Edit2.Text := st[1]; //itd. oczywiście, musisz kontrolować, czy elementy //o podanych indeksach istnieją;P finally st.Free; end; end;