Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   POS findet was das ich nicht verstehe... ? (https://www.delphipraxis.net/179721-pos-findet-das-ich-nicht-verstehe.html)

user0815 27. Mär 2014 11:04

Delphi-Version: XE2

POS findet was das ich nicht verstehe... ?
 
Warum ?

Delphi-Quellcode:
  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;
Als Ausgabe im Memo1 erhalte ich:
Code:
012324016940

XY41380993
:?: XY41380993 dürfte nicht ausgegeben werden ?

Grüße
0815

Klaus01 27. Mär 2014 11:12

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

user0815 27. Mär 2014 11:16

AW: POS findet was das ich nicht verstehe... ?
 
Ahhhh, manchmal hat man echt ein Brett vor´m Kopf.
Danke !

Perlsau 27. Mär 2014 11:52

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;

Popov 27. Mär 2014 12:08

AW: POS findet was das ich nicht verstehe... ?
 
Wie wäre sowas:
Delphi-Quellcode:
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;
Etwas OOP lastig, aber es funktioniert.

user0815 27. Mär 2014 12:26

AW: POS findet was das ich nicht verstehe... ?
 
obiges war nur verkürzter Beispielcode.

Zitat:

Delphi-Quellcode:
  p := Pos(Suche, S); // nach dem Suchstring suchen
  if p = 0 then exit; // wenn nichts gefunden, dann raus

das habe ich jetzt ähnlich drinnen. Die echte Procedure sucht auch Rückwärts, usw...
Nochmal Danke, das Thema hat sich erledigt.

himitsu 27. Mär 2014 12:57

AW: POS findet was das ich nicht verstehe... ?
 
Zitat:

Zitat von Perlsau (Beitrag 1253625)
Weshalb so umständlich?

Wobei ein Delete auch nicht immer so gut ist, bei all den entstehenden und "unnötigen" Speicheroperationen.
Via PosEx lässt sich das auch Ohne problemlos lösen.

Popov 27. Mär 2014 13:09

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.

himitsu 27. Mär 2014 13:18

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

Popov 27. Mär 2014 14:13

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 07:23 Uhr.
Seite 1 von 3  1 23      

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