![]() |
Delphi-Version: XE2
POS findet was das ich nicht verstehe... ?
Warum ?
Delphi-Quellcode:
Als Ausgabe im Memo1 erhalte ich:
private
{ Private-Deklarationen } Nachrichtentext : String; procedure GetParameter(var Value : String; Suche : String); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.GetParameter(var Value : String; Suche : String); var i, j : Integer; s : String; begin s := ''; j := POS(Suche, Nachrichtentext) + length(Suche); for i := j to length(Nachrichtentext) do if Nachrichtentext[i] <> ';' then s := s + Nachrichtentext[i] else break; Value := s; end; procedure TForm1.Button1Click(Sender: TObject); var s1, s2, s3 : String; begin Nachrichtentext := 'S;XY41380993;P=10000,1;M1=012324016940;M2=;F-18;'; GetParameter(s1,';M1='); GetParameter(s2,';M2='); GetParameter(s3,';W='); Memo1.Lines.Append(s1); Memo1.Lines.Append(s2); Memo1.Lines.Append(s3); end;
Code:
:?: XY41380993 dürfte nicht ausgegeben werden ?
012324016940
XY41380993 Grüße 0815 |
AW: POS findet was das ich nicht verstehe... ?
Hallo,
du setzt j auf einen Wert, unabhänging davon ob mit pos der SubString gefunden wurde. -1 +3 = 2 -> XY41380993 Grüße Klaus |
AW: POS findet was das ich nicht verstehe... ?
Ahhhh, manchmal hat man echt ein Brett vor´m Kopf.
Danke ! |
AW: POS findet was das ich nicht verstehe... ?
Weshalb so umständlich?
Delphi-Quellcode:
function GetValue(Suche : String) : String;
Var p : Integer; S : String; begin Result := ''; S := Nachrichtentext; p := Pos(Suche, S); // nach dem Suchstring suchen if p = 0 then exit; // wenn nichts gefunden, dann raus // wenn gefunden, dann ... Delete(S, 1 ,p + Length(S)-1); // ab gefundener Position die Länge des Suchstrings löschen p := Pos(';', S); // nach Delimiter suchen if p = 0 then exit; // wenn nichts gefunden, dann raus // wenn gefunden, dann Result zuweisen Result := Copy(S, 1, p-1); end; |
AW: POS findet was das ich nicht verstehe... ?
Wie wäre sowas:
Delphi-Quellcode:
Etwas OOP lastig, aber es funktioniert.
procedure GetParameter2(Nachrichtentext: String; var Value : String; Suche : String);
begin with TStringList.Create do try Delimiter := ';'; DelimitedText := Nachrichtentext; Value := Values[Suche]; finally Free; end; end; procedure TForm1.Button1Click(Sender: TObject); var s1, s2, s3 : String; Nachrichtentext: String; begin Nachrichtentext := 'S;XY41380993;P=10000,1;M1=012324016940;M2=;F-18;'; GetParameter2(Nachrichtentext, s1, 'M1'); GetParameter2(Nachrichtentext, s2, 'M2'); GetParameter2(Nachrichtentext, s3, 'W'); Memo1.Lines.Append(s1); Memo1.Lines.Append(s2); Memo1.Lines.Append(s3); end; |
AW: POS findet was das ich nicht verstehe... ?
obiges war nur verkürzter Beispielcode.
Zitat:
Nochmal Danke, das Thema hat sich erledigt. |
AW: POS findet was das ich nicht verstehe... ?
Zitat:
Via PosEx lässt sich das auch Ohne problemlos lösen. |
AW: POS findet was das ich nicht verstehe... ?
Jep. PosEx habe ich auch all zu lange ignoriert (vielleicht weil man einzig wegen der Funktion die sonst kaum genutzte Unit StrUtils einbinden muss). Auf jeden Fall kann man damit einen ganzen String ohne Delete zerlegen. Auf der anderen Seite stellt sich die Frage was optimaler ist, eine extra Unit oder mit Delete arbeiten.
|
AW: POS findet was das ich nicht verstehe... ?
Die StrUtils ist bei mir eh oftmals mit drin, da die noch andere nette Funktionen drin hat. :angel:
StartsText, ContainsText, EndsText, MatchText, IndexText (auch gut für ein CASE mit Strings) uvvm. In Math liegen zwar ein paar IfThen, aber die String-Version versteckt sich in der StrUtils. PS: Die StrUtils selber vergrößert die EXE selber praktisch garnicht. - ungenutzte Funktionen werden nicht in die Anwendung gelinkt - es gibt keinen "initialization"-Abschnitt oder globale Variablen - bis auf die SysUtils werden keine bösen Units eingebunden |
AW: POS findet was das ich nicht verstehe... ?
Hm, vielleicht sollte ich mir die Unit mal genauer angucken. Was ich bisher gesehen habe erinnert mich leicht an meinen alten TI-99/4A. Der hatte auch viele tolle String-Funktionen, die ich später beim C64 vermisst habe und nun hier wieder entdecke ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz