Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   [FMX] Korrekter Umgang mit Linebreak unter verschiedenen Plattformen (https://www.delphipraxis.net/205423-%5Bfmx%5D-korrekter-umgang-mit-linebreak-unter-verschiedenen-plattformen.html)

Rollo62 8. Sep 2020 09:38

[FMX] Korrekter Umgang mit Linebreak unter verschiedenen Plattformen
 
Hallo zusammen,

ja nach Platform gibt es unterschiedliche Linebreaks, also Windows CrLf, eigentlich alle anderen Platformen nutzen nur jeweils ein Zeichen Cr bzw. Lf.

Um das zu kapseln gibt es die sLinebreak Konstante, die das jeweils gültige LineBreak für die Plattform enthält.

Soweit, so gut.

Ich hatte bisher immer Multiline-Strings mit CrLf als generellen Marker definiert, zum Definieren von Variablen, zum Speichern, für Felder in DB.

Das wurde auch immer gut verarbeitet, und bei der Anzeige richtig dargestellt.

In neueren Versionen gibt es da aber Fehler bei der Zeilendarstellung,
also CrLf wird als zwei Zeilen interpretiert.
Das wäre auch verständlich, weil beide Zeichen ja im Prinzip eine neue Zeile einleiten können.

Jetzt frage ich mich wie man am Besten damit umgehen soll.

Ich tendiere das so zu handhaben, wie bisher.
# Im Speicher, File, DB, Netzwerk wird mit dem generischen CrLf gespeichert.
# Bei der Anzeige werden die generischen CrLf in das jeweilige sLineBreak just-in-time konvertiert.

Das hat den Vorteil das ich Daten generell auf allen Platformen gleich halte.
Es gibt aber den Nachteil das ich bei jedem Anzeigen das generische CrLf ersetzen muss (ausser bei Windows).

Das Ersetzen z.B. so:
Delphi-Quellcode:
    LTxt := StringReplace( LTxt, CrLf, sLineBreak, [TReplaceFlags.rfReplaceAll]);

Ich frage mich ob es da vielleicht bessere Methoden gibt um das CrLf zu berücksichtigen.

Man könnte z.B. das just-in-time Konvertieren nur einmal durchführen, ö.ä.,
aber ich fürchte der Verwaltungsaufwand und Fehlermöglichkeiten dafür werden viel höher.

Es wäre auch denkbar einen speziellen "MultiLine String" Typ dafür anzulegen,
auch das hätte gewisse Vor- und Nachteile.

Wie könnte man das Ganze optimieren ?

philipp.hofmann 8. Sep 2020 10:04

AW: [FMX] Korrekter Umgang mit Linebreak unter verschiedenen Plattformen
 
Ich hatte an der Stelle Glück, dass ich in der Anwendung beim Speichern schon immer | statt #13#10 abgespeichert hatte und dies On-The-Fly beim Anzeigen ersetze. So musste ich beim Wechsel auf Delphi 10.4 nur dieses Ersetzen anpassen, damit es kompatibel wird.

Rollo62 8. Sep 2020 10:11

AW: [FMX] Korrekter Umgang mit Linebreak unter verschiedenen Plattformen
 
Zitat:

Zitat von philipp.hofmann (Beitrag 1473227)
Ich hatte an der Stelle Glück, dass ich in der Anwendung beim Speichern schon immer | statt #13#10 abgespeichert hatte und dies On-The-Fly beim Anzeigen ersetze. So musste ich beim Wechsel auf Delphi 10.4 nur dieses Ersetzen anpassen, damit es kompatibel wird.

Hallo Phillip, ja an so einen Platzhalter hatte ich auch gedacht,
aber warum, denn CrLf funktioniert ja auch als Platzhalter gut.
So kann ich die Daten zumindest 1:1 überall verwenden, und CrLf macht erstmal nicht viel kaputt,
das kann noch jeder Texteditor ohne Schwierigkeiten anzeigen.
Der Einzige Nachteil von CrLf wäre das ich immer zwei statt einem Zeichen ersetzen muss.

Ich frage mich aber ob das Ersetzen von Zeichen nicht generell zu Vermeiden wäre.
Vielleicht ist es auch eine Lösung das Akzeptieren von CrLf, Lf, Cr generell in die FMX-Routinen einzubauen,
denn da findet ja die Interpretation statt.
Das hiesse aber womöglich an zig Stellen in den FMX Code einzugreifen,
ich habe mir das noch nicht angesehen.
Mit viel Glück sind es ja auch nur ein paar Stellen :-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 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