Einzelnen Beitrag anzeigen

nahpets
(Gast)

n/a Beiträge
 
#4

AW: Zeichen in String ersetzen

  Alt 20. Dez 2016, 01:17
Überprüfe bitte mal, ob die inc(i) immer korrekt sind. Inc(i) entspricht halt i := i + 1. Aber bei x01 verarbeitest Du doch drei Zeichen, demnach müsstest Du hier auch i := i + 3 machen statt inc(i).
Bei 01 wäre es dann i := i + 2;

Bin mir nicht sicher, ob ich die Logik verstanden habe, es ist doch schon etwas zu früh - sorry spät
Quelltext hab' ich mal angepasst und ein bisserl kommentiert, aber nicht getestet.
Delphi-Quellcode:
procedure TForm1.Button9Click(Sender: TObject);
var Rest, s, TEX: string;
  Menge, Laenge, i: Integer;
begin
  // 8 8 88 888 X01
  S := '2,9,0171,,25,01640X0174,01747,23,,,,47X014747'; //

  S := '0,,25,01640X0174,01747,23,,,,47X014747'; //
  laenge := length(s);
  i := 1;
  Menge := 0;
  while i < laenge do begin
    if s[i] = '5then Caption := s[i];
    // -> x01
    if (s[i] = 'X') and (s[i + 1] = '0') then begin
      // wenn X01
      if (s[i + 2] = '1') then begin
        TEX := TEX + ',' + ' Typ A: ';
        inc(i,2);
      end;
    end else ////////////////////////////////////
    // Caption := s[i];
    // normaler 01
    if (s[i] = '0') and (s[i + 1] = '1') then begin
      TEX := TEX + ',' + ' Typ B: ';
      inc(i); // Sonst finden wir im nächsten Durchgang die 1 und geben sie aus.
    end else ////////////////////////////////////
    // DOPPELTE Trenner finden
    if (s[i] = ',') then begin // and (s[i + 1] = ',') then
      inc(Menge); // Zählt die Anzahl der , ???
    end else ////////////////////////////////////
    if Menge > 0 then begin
      // Hier kommen wir nur hin, wenn Menge > 0
      // und keine der anderen Bedingungen erfüllt ist.
      // Kann hier jemals ein Komma ausgegeben werden, dass vor X01 bzw. 01 steht?
      Caption := s[i];
(*
      if Menge = 1 then TEX := TEX + ',' + s[i]
      // Ist Menge jedoch > 1, wird kein Komma ausgegeben.
      // Geht uns da nicht bei mehreren Kommas was verloren?
      // Hier dürfte die Ursache für das fehlende Komma zwischen 0 und 25 liegen.
      else TEX := TEX + s[i];
*)

      // Würde hier nicht das reichen?
      // Egal wieviele wir gefunden haben, wir geben nur eins aus.
      TEX := TEX + ',' + s[i];
      Menge := 0; //
    end
    else TEX := TEX + s[i]; // LAST CHANGE
    inc(i);
  end; // END WHILE
  Memo2.text := TEX;
  Memo1.text := S;
end; //
Kennt Delphi 5 schon die Funktion AnsiReplaceText aus der Unit StrUtils?

Wenn ja, dann ließe sich das Problem eventuell so lösen:
Delphi-Quellcode:
s := '0,,25,01640X0174,01747,23,,,,47X014747';
s := AnsiReplaceText(s,'X01',' Typ A: ');
s := AnsiReplaceText(s,'01',' Typ B: ');
while Pos(',,',s) > 0 do begin
  s := AnsiReplaceText(s,',,',',');
end;
Ansonsten eventuell:
Delphi-Quellcode:
s := '0,,25,01640X0174,01747,23,,,,47X014747';
s := StringReplace(s,'X01',' Typ A: ',[rfReplaceAll, rfIgnoreCase]);
s := StringReplace(s,'01',' Typ B: ',[rfReplaceAll, rfIgnoreCase]);
while Pos(',,',s) > 0 do begin
  s := StringReplace(s,',,',',',[rfReplaceAll]);
end;
  Mit Zitat antworten Zitat