AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi StringReplace mit Tücken ... Lösung gesucht ...
Thema durchsuchen
Ansicht
Themen-Optionen

StringReplace mit Tücken ... Lösung gesucht ...

Ein Thema von moelski · begonnen am 3. Nov 2006 · letzter Beitrag vom 7. Nov 2006
Antwort Antwort
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#1

StringReplace mit Tücken ... Lösung gesucht ...

  Alt 3. Nov 2006, 15:05
Moin !

Ich bin da eben auf ein tückisches Problem gestossen ...

Gegeben sie diese Funktion:
Delphi-Quellcode:
function TLVELV_HET20.MakeCorrectString(const Data: String): String;
var Erg: String;
begin
  Erg := ReplaceStr(Data, #05#18, #02);
  Erg := ReplaceStr(Erg, #05#19, #03);
  Erg := ReplaceStr(Erg, #05#21, #05); <----

  MakeCorrectString := Erg;
end;
Weiterhin nehmen wir mal diesen Hex String ...
Zitat:
02 05 15 15 07 B2 .....
Diesen Hexstring übergeben wir der Funktion mal und was kommt raus ... Mist
Denn ReplaceStr ersetzt 05 15 durch 05.
Dann haben wir den String 02 05 15 07 B2
Nun steht da aber abermals dummerweise 05 15 und schwupps macht ReplaceStr
daraus wieder ein 05. In dem Fall will ich das aber nicht.

Nu habe ich ein Problem ... Wie kann ich sowas vernindern? Ich möchte also in einem String Teile ersetzen, aber über das resultierenden Ergebnis soll nicht wieder ein ReplaceStr gemacht werden.

Was kann ich nun tun !?
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#2

Re: StringReplace mit Tücken ... Lösung gesucht ...

  Alt 3. Nov 2006, 15:17
Wenn es nicht möglich ist die Reiheinfolge der StringReplace so zu ändern, daß sich gegenseitig keine Beeinträchtigungen ergeben,

dann mußt du wohl selber durch den String gehen und alles manuell ersetzen.
Also alles gleichzeitig und nicht nicht nacheinander.

z.B.:
Delphi-Quellcode:
For i := 1 to Length(S) do
  If Copy(S, i, 2) = #05#18 Then Begin
    Delete(S, i, 1);
    S[i] := #02;
  End Else If Copy(S, i, 2) = #05#19 Then Begin
    Delete(S, i, 1);
    S[i] := #03;
  End Else If Copy(S, i, 2) = #05#21 Then Begin
    Delete(S, i, 1);
    S[i] := #05;
  End;
oder
Delphi-Quellcode:
i1 := Pos(#05#18, S);
i2 := Pos(#05#19, S);
i3 := Pos(#05#21, S);
While (i1 > 0) or (i2 > 0) or (i3 > 0) do
  i = der kleinste Wert(i1,i2,i3) der nicht 0 ist;
  If i = i1 Then ...
  Else If i = i2 Then ...
  Else If i = i3 Then ...
  i1 := PosEx(#05#18, S, i + 1);
  i2 := PosEx(#05#19, S, i + 1);
  i3 := PosEx(#05#21, S, i + 1);
End;
oder
Delphi-Quellcode:
i1 := Pos(#05#18, S); If i1 = 0 Then i1 := MaxInt;
i2 := Pos(#05#19, S); If i2 = 0 Then i2 := MaxInt;
i3 := Pos(#05#21, S); If i3 = 0 Then i3 := MaxInt;
While (i1 <> MaxInt) or (i2 <> MaxInt) or (i3 <> MaxInt) do
  i := Min(i1, Min(i2, i3);
  If i = i1 Then ...
  Else If i = i2 Then ...
  Else If i = i3 Then ...
  i1 := PosEx(#05#18, S, i + 1); If i1 = 0 Then i1 := MaxInt;
  i2 := PosEx(#05#19, S, i + 1); If i2 = 0 Then i2 := MaxInt;
  i3 := PosEx(#05#21, S, i + 1); If i3 = 0 Then i3 := MaxInt;
End;
oder ...

(bei langen Strings werden die Pos/PosEx-Varianten mit Sicherheit schneller sein)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
moelski

Registriert seit: 31. Jul 2004
1.110 Beiträge
 
Delphi 2010 Professional
 
#3

Re: StringReplace mit Tücken ... Lösung gesucht ...

  Alt 3. Nov 2006, 15:23


Delphi-Quellcode:
For i := 1 to Length(S) do
  If Copy(S, i, 2) = #05#18 Then Begin
    Delete(S, i, 1);
    S[i] := #02;
  End Else If Copy(S, i, 2) = #05#19 Then Begin
    Delete(S, i, 1);
    S[i] := #03;
  End Else If Copy(S, i, 2) = #05#21 Then Begin
    Delete(S, i, 1);
    S[i] := #05;
  End;
Many Thx! So gehts.
Dominik Schmidt
Greetz Dominik

I love Delphi 2007/2010
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: StringReplace mit Tücken ... Lösung gesucht ...

  Alt 3. Nov 2006, 15:29
Moin Dominik,

eine Variante hätte ich auch noch anzubieten:

Delphi-Quellcode:
function MakeCorrectString(const Data: String): String;

var
  sResult : string;
  iLen : Integer;
  iPos : Integer;

begin
  SetLength(sResult,Length(Data));
  iPos := 1;
  iLen := 0;
  while (iPos <= Length(Data)) do begin
    inc(iLen);
    case Data[iPos] of
      #05 : begin
        Inc(iPos);
        if (iPos <= Length(Data)) then begin
          case Data[iPos] of
            #18 : sResult[iLen] := #02;
            #19 : sResult[iLen] := #03;
            #21 : sResult[iLen] := #05;
            else begin
              sResult[iLen] := #05;
              inc(iLen);
              sResult[iLen] := Data[iPos];
            end;
          end;
        end;
      end;
      else begin
        sResult[iLen] := Data[iPos];
      end;
    end;
    inc(iPos);
  end;
  Result := Copy(sResult,1,iLen);
end;
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#5

Re: StringReplace mit Tücken ... Lösung gesucht ...

  Alt 7. Nov 2006, 13:00
So sollte es funktionieren. Vorausgesetzt, in deinen Stings kommt niemals wirklich einer der "temporären" strings vor
Delphi-Quellcode:
function TLVELV_HET20.MakeCorrectString(const Data: String): String;
var Erg: String;
begin
  Erg := ReplaceStr(Data, #05#18, '~#02~');
  Erg := ReplaceStr(Erg, #05#19, '~#03~');
  Erg := ReplaceStr(Erg, #05#21, '~#05~');

  Erg := ReplaceStr(Erg, '~#02~', #02);
  Erg := ReplaceStr(Erg, '~#03~', #03);
  Erg := ReplaceStr(Erg, '~#05~', #05);

  MakeCorrectString := Erg;
end;
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:45 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