Autor |
Beitrag |
sritter
Hält's aus hier
Beiträge: 11
|
Verfasst: Do 05.09.02 17:58
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
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Do 05.09.02 18:10
Hi,
versuche doch mit der POS-Funktion die Befehle zu interpretieren.
|
|
aogwaba
      
Beiträge: 109
|
Verfasst: Do 05.09.02 20:17
oder strScan bzw strRScan
cu
waba
|
|
Rooof
      
Beiträge: 24
Win 2000, WinXP, Win 98
D7 Prof
|
Verfasst: 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
_________________ Jedes Problem ist lösbar, wenn du dich nicht von deinem eigenen Denken und von deinem eigenen Verstand leiten lässt...
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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,
Udontknow
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 07.10.02 14:47
Ich habe da mal dies hier geschrieben:
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
Hält's aus hier
Beiträge: 3
|
Verfasst: 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
      
Beiträge: 119
|
Verfasst: 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
      
Beiträge: 317
|
Verfasst: 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? 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 05.11.02 13:37
Jupp, ich Freak. Das war mal für eine nonVCL Anwendung gedacht. Nix TStringList, nix Delimiter, nix CommaText. 
|
|
Popov
Gast
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 1305
Erhaltene Danke: 1
WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
|
Verfasst: 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
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
_________________ Der BH ist für die Brust, der Plan ist für'n Ar...
|
|