Entwickler-Ecke

Sonstiges (Delphi) - String vereinzelln


Ice - Di 02.07.02 20:04
Titel: String vereinzelln
Hi Leute!

Ich habe folgendes Problem:

Aus einem bestimmten String möchte ich nach einem bestimmten Zeichen suchen z.B. leerzeichen, jetzt möchte ich mehrere strings erzeugen der erste vom anfang bis zum ersten leerzeichen , vom ersten leerzeichen bis zum zweiten, vom zweiten bis zum dritten usw.
Kann mir da jemand helfen ?

für Hinweise wäre ich echt dankbar!

Marco


mathias - Di 02.07.02 20:09
Titel: Re: String vereinzelln
Schau mal unter der Online-Hilfe nach Pos und Copy, mit den 2 Befehlen kommst Du schon recht weit. :D


Ice - Di 02.07.02 21:07

:P alles klar ich probiers mal !

danke


damadmax - Di 09.07.02 15:27

versuch das mal:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function explode(s : string; ch : char; var args : tstrings): integer;
var p,i : integer;
begin
  p := 1;
  for i := 1 to length(s) do begin
    if (s[i] = ch) or (i = length(s)) then begin
      args.Add(copy(s,p,i-p));
      p := i + 1;
    end;
  end;
  result := args.count;
end;


oder so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function explode(s : string; ch : char; var args : tstrings): integer;
var p : integer;
begin
  while length(s) > 0 do
  begin
    p := pos(ch, s);
    if p > 0 then
    begin
      args.Add(copy(s,1,p-1));
      delete(s,1,p);
    end else
    begin
      args.Add(s);
      s := '';
    end;
  end;
  result := args.count;
end;


die 2. ist wohl die bessere....

du solltest vorher die stringlist erstellen und dann an die funktion übergeben.
s ist der zu durchsuchende string
ch ist der platzhalter (leerzeichen, semikolon, ...)
args die stringlist

achso: die funktion berücksichtigt nur ein trennzeichen. wenn also 5 leerzeichen aufeinander folgen, kommen auch 5 einträge in der stringlist hinzu

man könnte auch das funktionsergebnis als stringlist zurückgeben. naja wie man will halt.


Ice - Di 09.07.02 18:44

:D Alles klar ! Vielen Dank!


Marco


Visum - Mi 10.07.02 13:39

Hi, hab die gleiche Frage wegen dem Auflösen von Strings.

Leider versteh ich nicht so ganz, wie man deine Funktionen einbindet :(

Jedesmal, wenn ich versuche eine der Funktionen aufzurufen bricht er mit einem "Abstract Error" ab. Was mach ich da bitte falsch?
Muss ich als Parameter eine TStringlist angeben? Weil der hat die nicht angenommen und so hab ich eine Variable vom Typ TStrings eingesetzt.

Gruß
Visum


Tino - Mi 10.07.02 14:43

tStrings ist eine Abstakte-Klasse und man sollte nie eine Instanz davon erstellen. (schau mal in der Delphi-Hilfe unter dem Begriff Mit Stringlisten arbeiten nach) Nehme lieber tStringList!

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
Var
  SL: tStringList;
Begin
  SL := tStringList.Create;

  Explode (s, ch, SL); // <- nur als Beispiel!

  SL.Free;
End;


Visum - Do 11.07.02 00:35

Hi,
wenn ich das ganze mit einer tStringList mache, bringt Delphi immer nur Folgenden Fehler: "Types of actual an formal var parameters must be identical".

Wenn ich in der Funktion selbst anstelle dem tStrings ein tStringlist einsetze funktioniert alles wunderbar :D

Danke
Visum


damadmax - Fr 12.07.02 01:12

also ich binde das so ein:



Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Var
  ZuZerlegenderString : String;
  Trennzeichen : Char;
  Liste : TStrings;

Begin
  ZuZerlegenderString := 'Ich bin ein zu zerlegender String';
  Liste := TStringList.Create;
  Trennzeichen := ' ';  //Leerzeichen zum Beispiel
  Anzahl := Explode( ZuzerlegenderString, Trennzeichen, Liste );
  Liste.Free;
End.



@tino:

so stehts in der hilfe :D


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure TForm1.Button1Click(Sender: TObject);

var
    TempList: TStrings;      { Liste deklarieren }
begin
    TempList := TStringList.Create;          { Listenobjekt erzeugen }
    try
      { Stringliste verwenden }
    finally
      TempList.Free;      { Listenobjekt freigeben }
    end;
end;