(Gast)
n/a Beiträge
|
AW: Zeichen in String ersetzen
20. Dez 2016, 02: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] = '5' then 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;
|