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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!