Entwickler-Ecke

Sonstiges (Delphi) - String anhand des Trennzeichen " " in einzelstring


sritter - Do 05.09.02 17:58
Titel: String anhand des Trennzeichen " " in einzelstring
Guten Tag;
ich bin dabei, eine Server/Client Anwendung auf Basis der Indy TCp Komponenten zu schreiben. Jetzt stehe ich vo dem Problem, das ich den string der vom Client zum Server übertragen wird anhand des Leerzeichens in einzelstrings zerlegt werden muss um den Befehl zu Interpretieren.

Gibt es dafür eine einfache Delphi Funktion oder muss ich mich dafür selbst etwas schreiben und dies kompliziert über eine for Schleife abwickeln?

Ci@o Steffen


bis11 - Do 05.09.02 18:10

Hi,

versuche doch mit der POS-Funktion die Befehle zu interpretieren.


aogwaba - Do 05.09.02 20:17

oder strScan bzw strRScan

cu
waba


Rooof - Mo 07.10.02 11:22

Hi,

Vielleicht hilft dir dies:
Die Klasse TStrings stellt die Eigenschaft "CommaText" zur verfügung. Dieser Eigenschaft weist du einen String zu. Das Objekt verarbeitet diesen String dann in einzelne Strings auf welche du dann mit dem Index (meinTString[0...n]) zugreiffen kannst.
Vorsicht !!! Diese Funktion ist so gedacht, dass man mit Komma getrennte Strings einlesen kann. Wenn aber kein Komma vorhanden ist, wird meines Wissens nach Leerzeichen getrennt. Am besten du schaust dir die Hilfe dazu an.

TStrings-->Property:CommaText

cu
Rooof


Udontknow - Mo 07.10.02 14:43

Hi!

Die Unit RXStrUtils von den RX-Tools (Freeware-Komponentensammlung) enthält die Funktionen ExtractWord und WordCount, mit denen du einzelne Wörter aus einem String lesen kannst. Als Trennzeichen zwischen den Wörtern (WordDeliminiter) gibst du dann eben ein Leerzeichen an.

Cu, :D
Udontknow


Delete - Mo 07.10.02 14:47

Ich habe da mal dies hier geschrieben:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
unit Unit2;

interface

uses
  windows;

type
  TLine = array of String;

  function parse(const s: String; const sep: String): TLine;

implementation

function parse(const s: String; const sep: String): TLine;
var
  sLine: String;
  i, cntSep, idxArray: DWORD;
  p: PChar;
  Temp: String;
  FoundWord: PChar;
begin
  { kucken ob Zeile mit Trennzeichen aufhört, wenn nicht dranhängen }
  sLine := s;
  if s[length(sLine)] <> sep then
    sLine := sLine+sep;
  { Trennzeichen zählen -> Größe des TLine-Arrays bestimmen }
  cntSep := 0;
  for i := 0 to length(sLine) do
  begin
    if sLine[i] = sep then
      Inc(cntSep);
  end;
  SetLength(result, cntSep);
  { parsen }
  idxArray := 0;  // Zählvariable für Line-Array
  p := PChar(sLine);
  while p^ <> #0 do
  begin
    case p^ of
      { so lange p^ kein Buchstabe oder Ziffer ist Inkrementieren }
      #1..#47, #58..#64, #91..#96, #123..#127: Inc(p);
    { ansonsten was brauchbares gefunden }
    else
    begin
      { Anfang merken }
      FoundWord := p;
      { weitergehen bis zum Trennzeichen }
      while p^ <> sep do
        Inc(p);
      { Trennzeichen gefunden -> Zeichenkette nach Temp kopieren }
      SetString(Temp, FoundWord, p-FoundWord);
      { TLine-Array füllen }
      result[idxArray] := Temp;
      { Index für Line-Array hochsetzen }
      Inc(idxArray);
    end;
    end;
  end;
end;

end.

Ist allerdings eventuell noch fehlerhaft, weil es nie richtig getestet wurde.


DelphiGuru - Di 05.11.02 10:45

Luckie du Freak;

es funktioniert doch viel einfacher, solange das Trennzeichen ein ' ' ist. Und zwar indem man, wie zuvor schon erwähnt, die CommaText-Eigenschaft von TStrings oder noch einfacher TStringLIst verwendet.

Seht es euch einfach in der Delphi-Hilfe an.

StringList.CommaText := '1 2 3 4';

Die Ergebnismenge in der StringList sieht dann folgendermaßen aus.

1
2
3
4

Alles klar?


Hagbard Celine - Di 05.11.02 11:01

DelphiGuru hat folgendes geschrieben:
Luckie du Freak;

es funktioniert doch viel einfacher, solange das Trennzeichen ein ' ' ist. Und zwar indem man, wie zuvor schon erwähnt, die CommaText-Eigenschaft von TStrings oder noch einfacher TStringLIst verwendet.

Seht es euch einfach in der Delphi-Hilfe an.

StringList.CommaText := '1 2 3 4';

Die Ergebnismenge in der StringList sieht dann folgendermaßen aus.

1
2
3
4

Alles klar?


TStrings hat die Eigenschaft Delimiter!!!

Da kannst Du jedes beliebige Zeichen als Trennzeichen angeben!!!!
Über delimitedText greifst Du dann darauf zu oder setzt einen String!!!


alexschultze - Di 05.11.02 12:07

dieser dumme Delimiter funktioniert bei mir nicht ?!?!?
ich habe simpel

Quelltext
1:
2:
memo1.Lines.Delimiter:=':';
memo1.Lines.CommaText:='ich:esse doener';


(Text nur aus Langeweile *g*)

da kommt

ich:esse
doener


DelimitedText:=':' geht auch nicht.
Was ist falsch? :(


Delete - Di 05.11.02 13:37

Jupp, ich Freak. Das war mal für eine nonVCL Anwendung gedacht. Nix TStringList, nix Delimiter, nix CommaText. :wink:


Anonymous - Di 05.11.02 14:25

Es geht auch ohne StringList


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
procedure TForm1.Button1Click(Sender: TObject);
var
  Text: String;
begin
  Text := 'Das ist ein Text Zelegungstest';
  while Trim(Text) <> '' do begin
    if Pos(#32, Text) = 0 then Text := Text + #32;
    ListBox1.Items.Add(Trim(Copy(Text, 1, Pos(#32, Text))));
    Delete(Text, 1, Pos(#32, Text));
  end;
end;


LCS - Di 05.11.02 15:25

Hi
jetzt steuere ich auch noch was bei. Sieht vielleicht nicht besonders elegant aus, funktioniert aber.
Die Funktion zerlegt einen String in einzelne Tokens anhand eines Trennzeichens und gibt sie in einer StringListe zurück. Sie kann verwendet werden um beispielsweise .CSV Dateien zu zerlegen. Text kann dabei auch in Anführungszeichen stehen:

123; "Meier"; "Sepp"; 12,45;1


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
procedure SeparateString(const Text: string; const Separator, TextSep: char; RemoveEmptyToken: boolean; var TokenList: TStringList);
var
  szT, szL  : string;
   i      : integer;
   sC      : char;
   te      : Boolean;
begin
  szL  := Text;
   TokenList.Clear;
   while Length(szL) > 0 do begin
    i  := 1;
     szT  := '';
       sC  := Separator;
       te  := False;
           szL  := Trim(szL);
       if  szL[1] = TextSep then begin
         sC := TextSep;
           Delete(szL, 1, 1);
       end;
       while not te do begin
           while (i <= Length(szL)) and (szL[i] <> sC) do begin
               szT  := szT + szL[i];
               inc(i);
           end;
           if  (sC = Separator) or (i >= Length(szL)) then
             te := True
           else
             if  szL[i+1] = Separator then
                 te := True
               else begin
                 szT := szT + szL[i];
                   Inc(i);
               end;
       end;
       if  (szT <> '') or (RemoveEmptyToken = False) then
         TokenList.Add(szT);
       if  szT <> '' then
         Delete(szL, 1, Length(szT));
       if  Length(szL) > 0 then begin
         Delete(szL, 1, 1);
           if  sC = TextSep then
             Delete(szL, 1, 1);
       end;
   end;
end;


Gruss Lothar