Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi StringReplace und seine Tücken (https://www.delphipraxis.net/58447-stringreplace-und-seine-tuecken.html)

Catbytes 7. Dez 2005 10:55

Re: StringReplace und seine Tücken
 
Zitat:

Zitat von GuenterS
Ich stell mir das so vor:

Du gehst Dein Memo zeichen für Zeichen durch und schreibst das konvertierte in die neue Stringlist, dann ist es ziemlich egal, welche Reihenfolge du verwendest.

Hmmmmm - an die Möglichkeit habe ich noch gar nicht gedacht.

Delphi-Quellcode:
function GetISO8859_1(s: string): string;
var
  i: Integer;
  sNew: string;
begin
  sNew := '';
  for i := 1 to Length(s) do
  begin
    case s[i] of
      ';': sNew := sNew + '& # 5 9 ;';
      '#': sNew := sNew + '& # 3 5 ;';
      '&': sNew := sNew + '& # 3 8 ;';
      'ä': sNew := sNew + '& # 2 2 8 ;';
      // Hier folgen weitere ISO-Codes...
    else
      sNew := sNew + s[i];
    end;
  end;
  Result := sNew;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  Memo1.Clear;
  Memo1.Lines.Add('Mustermann GmbH & Co. KG');
  Memo1.Lines.Add('');
  Memo1.Lines.Add('Täler, Wälder; all das # ist Natur & schön.');
  Memo2.Clear;
  for i := 0 to (Memo1.Lines.Count - 1) do
  begin
    Memo2.Lines.Add(GetISO8859_1(Memo1.Lines[i]));
  end;
end;
Ergibt:

Mustermann GmbH & # 3 8 ; Co. KG

T& # 2 2 8 ;ler, W& # 2 2 8 ;lder& # 5 9 ; all das & # 3 5 ; ist Natur & # 3 8 ; schön.

:thumb: :-D

Danke euch allen...

Werde die komplette Function dann hier noch posten, wenn ich alles abgeschrieben habe.

Entdeckt noch jemand einen (logischen) Fehler oben im Code? Kann man an irgend einer Stelle Code einsparen oder verbessern?

GuenterS 7. Dez 2005 10:57

Re: StringReplace und seine Tücken
 
Es gibt einen "Fehler" ... Du wirst im Memo2 nur 1 Zeichen bzw. den Code für das Konvertierte Zeichen in einer Zeile haben.

Catbytes 7. Dez 2005 11:01

Re: StringReplace und seine Tücken
 
Zitat:

Zitat von GuenterS
Es gibt einen "Fehler" ... Du wirst im Memo2 nur 1 Zeichen bzw. den Code für das Konvertierte Zeichen in einer Zeile haben.

:gruebel: Den Satz verstehe ich nicht.

In Memo2 kam genau das gleiche raus, wie in Memo1 - nur eben übersetzt. Mit Umbrüchen und allem...

Was genau meinst Du?

GuenterS 7. Dez 2005 11:04

Re: StringReplace und seine Tücken
 
Die Lines Property vom Memo ist ja eigentlich auch nur ein TStrings Typ. Wenn Du da für jedes Zeichen Add aufrufst hast Du es nachher nicht mehr so drinnen wie du es im Ursprünglichen Memo hast, auch wenn es ein Memo vielleicht anders darstellt.


versuch doch mal nach der Konvertiertung den Inhalt von Memo2 zeilenweise in eine Datei zu schreiben, dann dürftest Du schön sehen was ich meine.

Catbytes 7. Dez 2005 11:11

Re: StringReplace und seine Tücken
 
Zitat:

Zitat von GuenterS
Die Lines Property vom Memo ist ja eigentlich auch nur ein TStrings Typ. Wenn Du da für jedes Zeichen Add aufrufst hast Du es nachher nicht mehr so drinnen wie du es im Ursprünglichen Memo hast, auch wenn es ein Memo vielleicht anders darstellt.


versuch doch mal nach der Konvertiertung den Inhalt von Memo2 zeilenweise in eine Datei zu schreiben, dann dürftest Du schön sehen was ich meine.

Hmmmmm - ich setze doch das Add nicht für jedes Zeichen, sondern für jede Zeile.

Habe es mal spaßhalber per SaveDialog und Memo2.Lines.SavetoFile gespeichert. Alles sauber...

Wenn ich es jetzt immer noch nicht verstanden habe :gruebel:

Hättest du zwei oder drei Zeilen Code für mich, was genau Du meinst?

GuenterS 7. Dez 2005 11:13

Re: StringReplace und seine Tücken
 
Ich zieh meinen Kommentar zurück, hab mich verschaut. Dachte gesehen zu haben, dass du es zeichenweise in die Konvertierungsroutine schickst... :duck:

Catbytes 7. Dez 2005 11:16

Re: StringReplace und seine Tücken
 
Zitat:

Zitat von GuenterS
Ich zieh meinen Kommentar zurück, hab mich verschaut. Dachte gesehen zu haben, dass du es zeichenweise in die Konvertierungsroutine schickst... :duck:

Okay :???:

Danke Dir trotzdem für die Hilfe!

:-D

Brüggendiek 8. Dez 2005 09:28

Re: StringReplace und seine Tücken
 
Hallo Catbytes!

Bei solchen Problemen ist es eine gute Idee, das "kritische" Zeichen (hier '&') bei den Ersetzungen durch ein garantiert nicht im String vorkommendes Zeichen (z.B. #02) zu ersetzen. Dann kommt kein '&' in den Text, das nicht umgesetzt werden muß. Als letzte Aktion ersetzt Du dann das Hilfszeichen durch das '&'.

Ansonsten geht nur der Weg, den Text zeichenweise durchzugehen. Dazu sollte man den String zweimal durchgehen: erst ermittelt und summiert man für jedes Zeichen die Länge im Ergebnis, setzt dann den Ausgabestring auf diese Summe und kopiert zeichenweise das Zeichen bzw. den Ersatzstring.
Bitte nicht den Ergebnisstring durch Verketten erzeugen - die ständige Umkopiererei frißt gewaltig Speicher.

Gruß

Dietmar Brüggendiek

Phistev 8. Dez 2005 10:20

Re: StringReplace und seine Tücken
 
Zitat:

Zitat von Brüggendiek
Hallo Catbytes!

Bei solchen Problemen ist es eine gute Idee, das "kritische" Zeichen (hier '&') bei den Ersetzungen durch ein garantiert nicht im String vorkommendes Zeichen (z.B. #02) zu ersetzen. Dann kommt kein '&' in den Text, das nicht umgesetzt werden muß. Als letzte Aktion ersetzt Du dann das Hilfszeichen durch das '&'.

Ansonsten geht nur der Weg, den Text zeichenweise durchzugehen. Dazu sollte man den String zweimal durchgehen: erst ermittelt und summiert man für jedes Zeichen die Länge im Ergebnis, setzt dann den Ausgabestring auf diese Summe und kopiert zeichenweise das Zeichen bzw. den Ersatzstring.
Bitte nicht den Ergebnisstring durch Verketten erzeugen - die ständige Umkopiererei frißt gewaltig Speicher.

Gruß

Dietmar Brüggendiek

Man kann auch StringReplace verwenden. Am Ende muss man einfach nur
Delphi-Quellcode:
memo2.lines.text := StringReplace(memo1.lines.text,'& # 3 8 & # 5 9 ;','& # 3 8 ;',[rfReplaceAll]);
oder eine (oder mehrere) ähnliche Zeile(n) benutzen, also die falschen Kombinationen wieder ersetzen. (Leerzeichen wie gehabt)

Christian Seehase 8. Dez 2005 11:20

Re: StringReplace und seine Tücken
 
Moin Phistev,

Zitat:

Zitat von Phistev
Man kann auch StringReplace verwenden. Am Ende muss man einfach nur
Delphi-Quellcode:
memo2.lines.text := StringReplace(memo1.lines.text,'& # 3 8 & # 5 9 ;','& # 3 8 ;',[rfReplaceAll]);
oder eine (oder mehrere) ähnliche Zeile(n) benutzen, also die falschen Kombinationen wieder ersetzen. (Leerzeichen wie gehabt)

wobei man allerdings tunlichst darauf verzichten sollte die Eigenschaft Memo1.Lines.Text mehrfach hintereinander zu verwenden.
Besser ist es sie einmal in eine Stringvariable zu übernehmen, dann mit dieser zu arbeiten, und anschliessend wieder in Memo1.Lines.Text zurückzuschreiben (so wie Catbytes dass auch gemacht hat).
Grund:
Beim jedem Lesen der Eigenschaft, wird Text aus den einzelnen Lines zusammengesetzt, beim Schreiben werden die Lines jeweils neu erzeugt.
Das drückt, je nach Textlänge, reichlich auf die Performance.

@Dietmar:
Als Kompromiss für die Errechnung der Buffergrösse, die ja auch Zeit in Anspruch nimmt, könnte man auch einen Schätzwert für die erforderliche Grösse annehmen (Basis wieviele Zeichen müssen durchschnittlich ersetzt werden), und beim Überschreiten dieses Wertes den Buffer um einen festgelegten Wert erhöhen (in der Hoffnung, dass das nicht notwendig sein sollte)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 Uhr.
Seite 3 von 3     123   

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