Fehler bei Textanzeige in TMemo und TlzRichEdit

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Fehler bei Textanzeige in TMemo und TlzRichEdit

Beitrag von RuhrPotto »

Bei der Überarbeitung eines Delphiprogramms bin ich auf folgendes Problem beim Laden / Anzeigen von Text in TMemo und TlzRichEdit gestossen:

Für einen besonderen Druck wird die Zeilenlänge auf konstant 80 Zeichen formatiert. Die Texte werden in verschiedenen Forms erstellt und dann via einer Stringlist an eine Art Druckvorschau übergeben.
Dies funktioniert prima, solange keine Umlaute in den Texten enthalten sind.
Der Aufbau erfolgt beispielsweise nach folgendem Schema:

Code: Alles auswählen

 
  AusData := TStringList.Create;
  AusData.Add(StringOfChar(cStrich,80));
  AusData.Add(FS('Eintrag normal',40,0)+FS('XXXXX',40,1));
  AusData.Add(FS('Ähnlicher Eintrag',40,0)+FS('XXXXX',40,1));
  AusData.Add(FS('Ähnlicher Eintrög',40,0)+FS('XXXXX',40,1));
  AusData.Add(FS('Eintrag normal',40,0)+FS('XXXXX',40,1));
 
  memo1.Clear;
  memo1.Text :=  AusData.Text;
  AusData.Free;   
 


Als Ergebnis erhalte ich

Code: Alles auswählen

 
--------------------------------------------------------------------------------
Eintrag normal                                                             XXXXX
Ähnlicher Eintrag                                                         XXXXX
Ähnlicher Eintrög                                                        XXXXX
Eintrag normal                                                             XXXXX
 

Zeile 1 und 4 sind in korrekter Länge; Zeilen 2 und 3 um die Anzahl der vorhandenen Umlaute verkürzt.
Vor dem .ADD haben die Teilstrings eine korrekte Länge von 40 Zeichen.

Hab jetzt bereits viel Zeit damit verbracht, gefundene Lösungsansätze (UTF8-Kodierung) zu testen. Diese führen aber zu keinem Ergebnis. Bestenfalls erreichte ich folgendes Ergebnis mit korrekter Länge aber falscher Darstellung

Code: Alles auswählen

 
--------------------------------------------------------------------------------
Ähnlicher Eintrag                                                         XXXXX
Ähnlicher Eintrög                                                        XXXXX
 


Hat jemand eine Erklärung oder Lösung für das Problem?
Jeder macht Fehler - viele Fehler brauchen EDV!

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: Fehler bei Textanzeige in TMemo und TlzRichEdit

Beitrag von theo »

UTF-8 "Zeichen" können länger als ein Char(Byte) sein. Umlaute z.B. sind länger.
Arbeite mit UTF8Length(), UTF8Copy() etc. aus LazUTF8

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: Fehler bei Textanzeige in TMemo und TlzRichEdit

Beitrag von RuhrPotto »

Danke für die schnelle Rückmeldung.
Mit UTF8Length() und UTF8Copy() erhalte ich aber leider kein anderes Ergebnis. Die Umlaute sind korrekt aber die Zeile verkürzt.

Zudem - wo liegt das Problem: Beim Erstellen der TStringlist oder beim Übertrag ins das Memo bzw. RichEdit?
Hab es an beiden Stellen versucht ohne Unterschied im Ergebnis.
Jeder macht Fehler - viele Fehler brauchen EDV!

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Fehler bei Textanzeige in TMemo und TlzRichEdit

Beitrag von Komoluna »

Das Problem liegt bei den FS(...) Aufrufen. denn innerhalb dieser Methoden wird ja die Länge des Strings ausgelesen und der Rest mit Leerzeichen aufgefüllt.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

RuhrPotto
Beiträge: 39
Registriert: Mi 6. Mai 2015, 12:52

Re: Fehler bei Textanzeige in TMemo und TlzRichEdit

Beitrag von RuhrPotto »

Danke!
Bin auch grad dahinter gekommen durch probieren

Code: Alles auswählen

[Window Title]
TestSCR
 
Männö Länge = Length(s) L1: 7  -  Utf8Length(s) L2: 5
 


Die Standardfunktion System.Length - genutzt u.a. in den FS-Calls - ist damit aus meiner Sicht fehlerhaft und nicht mehr wirklich brauchbar.
Gleiches gilt für die Funktionen LeftStr und RightStr - auch hier versagt die Längenberechnung für den String und liefert falsche Ergebnisse.

LeftStr lässt sich ja einfach durch Utf8Copy ersetzen - für RightStr gibt es wohl kein direktes Gegenstück.
Jeder macht Fehler - viele Fehler brauchen EDV!

Antworten