TMemo und #255

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

TMemo und #255

Beitrag von Mathias »

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := #255;
end;


Wen ich obigen Code direkt unter der Linux-Konsole ausführe, kommt folgende Fehlermeldung.

Code: Alles auswählen

(project1:5352): Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion 'g_utf8_validate (text, len, NULL)' failed


Hat TMemo Mühe mit dem Zeichen #255 ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

siro
Beiträge: 732
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: TMemo und #255

Beitrag von siro »

Guten Abend,
ich habe es grade ausprobiert. bei mir gibt es keine Fehlermeldung.
Windows 8
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: TMemo und #255

Beitrag von wp_xyz »

Linux verwendet UTF8-Zeichencodierung. Das Byte 255 ist >127 und daher muss das zugehörigen Zeichen (CodePoint) mindestens ein weiteres Byte enthalten. Die Meldung von gtk bedeutet daher, dass du ein ungültiges UTF8-Zeichen ins Memo geschrieben hast. Nimm stattdessen die entsprechende Konvertierungsfunktion aus lconvencoding, z.B. CP1252ToUTF8(#255) (Windows) oder CP850ToUTF8(#255) (DOS).

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: TMemo und #255

Beitrag von Mathias »

Linux verwendet UTF8-Zeichencodierung. Das Byte 255 ist >127 und daher muss das zugehörigen Zeichen (CodePoint) mindestens ein weiteres Byte enthalten. Die Meldung von gtk bedeutet daher, dass du ein ungültiges UTF8-Zeichen ins Memo geschrieben hast.
Danke, für die Erklärung.

Nimm stattdessen die entsprechende Konvertierungsfunktion aus lconvencoding, z.B. CP1252ToUTF8(#255) (Windows) oder CP850ToUTF8(#255) (DOS).

Ich denke, auf dies kann ich verzichten.

Ich bin gerade daran, über I²C ein EEPROM zu beschreiben und auszulesen. Und dazu habe ich ein Memo für die Ausgabe verwendet. Ein neues EEPROM ist von Werk auf alles mit #255 beschrieben und somit sind diese Zeichen auch im Memo angekommen, das aber sofort mit einem Clear quintierte.
Ich habe gestern recht geübt, da, das Memo immer Leer war, wen ich zu viel Zeichen aus dem EEPROM ausleste. Da dachte ich zuerst, das der Fehler in der Lese-Routine lag.

So etwas leer sofort das Memo.

Code: Alles auswählen

Memo1.Text := 'Hello World';
Memo1.Text := Memo1.Text + #255;   
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten