Autor Beitrag
sritter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1247
Erhaltene Danke: 2

Apple Mac OSX 10.11

BeitragVerfasst: Do 05.09.02 18:10 
Hi,

versuche doch mit der POS-Funktion die Befehle zu interpretieren.
aogwaba
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109



BeitragVerfasst: Do 05.09.02 20:17 
oder strScan bzw strRScan

cu
waba
Rooof
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 24

Win 2000, WinXP, Win 98
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 07.10.02 14:47 
Ich habe da mal dies hier geschrieben:
ausblenden volle Höhe 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
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 119



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 317



BeitragVerfasst: Di 05.11.02 12:07 
dieser dumme Delimiter funktioniert bei mir nicht ?!?!?
ich habe simpel
ausblenden 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



BeitragVerfasst: 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:
Popov
Gast
Erhaltene Danke: 1



BeitragVerfasst: Di 05.11.02 14:25 
Es geht auch ohne StringList

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1305
Erhaltene Danke: 1

WIN 7, WIN 8
Delphi XE5, Delphi XE, Delphi 2007
BeitragVerfasst: 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

ausblenden volle Höhe 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

_________________
Der BH ist für die Brust, der Plan ist für'n Ar...