Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Pos() (https://www.delphipraxis.net/11921-problem-mit-pos.html)

sharkx 16. Nov 2003 21:59


Problem mit Pos()
 
Hallo,

Folgender String möchte ich in 2 einzelteile zerlegen. Einmal den Command und einmal (ich nenns mal) Ausführung.

Der String sieht wie folgt aus:
Zitat:

.add sharkx
Lösen tu ich es mit folgendem Code
Delphi-Quellcode:
  { Content auf Command Parsen }
  CommandPos := Pos(Content, ' ');
  Commands   := Copy(Content, 0, CommandPos +4);
  Memo1.Lines.Add('Parse Commands: ' + Commands);

  { Content auf Ausführung Parsen }
  TextPos    := Pos(Content, ' ');
  Text       := Copy(Content, 6, TextPos +Length(content));
  Memo1.Lines.Add('Parse Text: ' + Text);
Nun .. jetzt ist es aber nunmal so, das ich nicht weiß wielange der Command ist. ( .add 4, .stats 6 und so weiter )
Und was ist wenn der String am Anfang nen leerzeichen hat? Wie sollte ich dies am besten bewältigen?

Ich hoffe ich hab mich verständlich ausgedrückt :-)

sakura 16. Nov 2003 22:07

Re: Problem mit Pos()
 
Dann füge doch mal folgende Zeile als erste ein:
Delphi-Quellcode:
Content := Trim(Content);
Das entfernt alle führenden und abschließenden Zeichen aus dem Bereich <= #32 (also auch Leerzeichen).

...:cat:..

sharkx 16. Nov 2003 22:11

Re: Problem mit Pos()
 
gut ok .. dann hab ich einen anfang, aber wie bekomm ich das erste wort raus, wenn ich nicht weiß wie lang es ist?

Minz 16. Nov 2003 22:27

Re: Problem mit Pos()
 
Zitat:

{ Content auf Command Parsen }
CommandPos := Pos(Content, ' ');
Commands := Copy(Content, 0, CommandPos +4);
Memo1.Lines.Add('Parse Commands: ' + Commands);

{ Content auf Ausführung Parsen }
TextPos := Pos(Content, ' ');
Text := Copy(Content, 6, TextPos +Length(content));
Memo1.Lines.Add('Parse Text: ' + Text);
Wenn ich mich richtig entsinne ist Pos so aufgebaut:

Pos(Substring, String), du hast glaube ich (String, Substring) benutzt.

So suchst du dann nach Content in ' '
Weiterhin ermittelst du das Leerzeichen im String Content, das an Position 5 ist.
Es reicht also zu sagen:

Delphi-Quellcode:
Commands := Copy(Content, 0, CommandPos-1)
Text    := Copy(Content, CommandPos+1, length(Content)-CommandPos)
Wobei du das CommandPos vielleicht in Trennzeichen oder so umtaufen solltest, weil
es nichts mehr mit dem Command zu tun hat, sonder als Trennung von Command und Text
dient.

Gruß Minz

sharkx 16. Nov 2003 22:36

Re: Problem mit Pos()
 
hmm .. hab ich nun verstanden, Aber Minz, wieso bekomm ich dann als Command nichts und als Text die ganze Line? Wenn ich das richtig verstehe, müsste vor dem eigentlichen Conten ein leerzeichen stehen was er als suchposition nimmt. Ist es aber im originalen nicht, zudem habe ich es auch mit Trim weggeschnitten.



Edit: Habs danke :)))

Minz 16. Nov 2003 22:40

Re: Problem mit Pos()
 
trim solltest du auch verwenden.

Du willst doch eine Zeile nach dem Aufbau haben:

'Befehl Wert'

das heißt du suchst zuerst das Leerzeichen (Trennzeichen von Befehl und Wert hier: 7) das kriegst du mit Pos raus

und dann kopierst du von 1 (nicht 0 war vorher falsch) bis zum Leerzeichen, um den Befehl zu kriegen.
Dann kopierst du von Leerzeichen bis Ende des strings (Länge des Strings minus Position vom Trennzeichen)

Sollte schon dann funzen.

himitsu 16. Nov 2003 22:40

Re: Problem mit Pos()
 
So müsste es geh'n. :mrgreen:
Delphi-Quellcode:
Content := Trim(Content);
T := Pos(' ', Content);
Commands := Trim(Copy(Content, 1, T - 1));
Text := Trim(Copy(Content, T + 1, Length(Content)));

Minz 16. Nov 2003 22:43

Re: Problem mit Pos()
 
Zitat:

Content := Trim(Content);
T := Pos(' ', Content);
Commands := Trim(Copy(Content, 1, T - 1));
Text := Trim(Copy(Content, T + 1, Length(Content)));
himitsu fast :mrgreen:

weil du gibst ja die Länge an, die gelesen werden soll
daher darfs nicht length(content) sein! sonst versuchst du
ab dem Trennzeichen die ganze Länge von Content zu kopieren.

Meine Zeilen oben sollten so funzen, statt der 0 eine 1.

Wenn nicht, zeig code, da ist was anderes im argen.

sharkx 16. Nov 2003 22:44

Re: Problem mit Pos()
 
himitsu .. jap, hatte es aber etwa zeitgleich mit deinem post geschafft :)

scp 16. Nov 2003 22:46

Re: Problem mit Pos()
 
Ich fasse mal zusammen:

Delphi-Quellcode:
  Content := Trim(Content);

  { Content auf Command Parsen } 
  CommandPos := Pos(' ', Content);
  Commands   := Copy(Content, 1, CommandPos-1);
  Memo1.Lines.Add('Parse Commands: ' + Commands);

  { Content auf Ausführung Parsen } 
  TextPos    := Pos(' ', Content);
  Text       := Copy(Content, TextPos+1, Length(content));
  Memo1.Lines.Add('Parse Text: ' + Text);
Hast du es so gemacht?

[EDIT]
Ups.. Zu langsaaaam :-D
[/EDIT]

himitsu 16. Nov 2003 22:50

Re: Problem mit Pos()
 
@Minz

Aus der OH:
Zitat:

function Copy(S; Index, Count: Integer): string;

Gibt Count mehr Zeichen oder Array-Elemente an, als verfügbar sind, werden nur die Zeichen oder Elemente von S[Index] bis zum Ende von S zurückgegeben.

sharkx 16. Nov 2003 22:51

Re: Problem mit Pos()
 
hmm, eben doch nicht ...

ich geb mal nen paar Content Strings mit an und deren Ergebniss nach dem Parsen
Delphi-Quellcode:

sharkx: .help
        ^-------------------- Das ist der String Content, daraus wurde ...
Parse Commands:
Parse Text: .help

sharkx: .stats
Parse Commands:
Parse Text: .stats

sharkx: .add noob
Parse Commands: .add
Parse Text: noob
^---------------------------- So ist es richtig
Delphi-Quellcode:
 
  TextPos    := Pos(' ', Content);
  Text       := Trim(Copy(Content, CommandPos+1, length(Content)-CommandPos));

  CommandPos := Pos(' ', Content);
  Commands   := Trim(Copy(Content, 1, CommandPos-1));


[EDIT]

*Kopfklatsch*
Das problem ist, ich weiß nichtmal ob ich überhaupt ein Leerzeichen übergeben bekomme! Also kann ich ja auch nicht immer danach suchen. Selbst dieser Punkt ist bicht immer da (.add). Also hab ich praktisch überhaupt keinen ansatz nachdem ich suchen könnte :/

scp 16. Nov 2003 22:54

Re: Problem mit Pos()
 
Zitat:

Zitat von Minz
weil du gibst ja die Länge an, die gelesen werden soll
daher darfs nicht length(content) sein! sonst versuchst du
ab dem Trennzeichen die ganze Länge von Content zu kopieren.

Zitat:

Zitat von Delphi-Hilfe
Gibt Count mehr Zeichen oder Array-Elemente an, als verfügbar sind, werden nur die Zeichen oder Elemente von S[Index] bis zum Ende von S zurückgegeben.


himitsu 16. Nov 2003 23:00

Re: Problem mit Pos()
 
Also nach diesem Aufbau?

Name: .Commands Text
Name: Commands Text

Name:.Commands Text
Name:Commands Text

Name: .Commands
Name: Commands

Name:.Commands
Name:Commands

scp 16. Nov 2003 23:01

Re: Problem mit Pos()
 
Dann musst du halt If verwenden:

Delphi-Quellcode:
If (Pos(' ', Content) > 0) then
  begin
    // Normaler Code
  end
else
  begin
    Command := Content;
    Text := '';
  end;

sharkx 16. Nov 2003 23:02

Re: Problem mit Pos()
 
endlich .. schwere geburt .. vielen dank :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz