stefan
2020-07-21 16:01:49 UTC
Hallo,
ich hab jetzt kurz hintereinander bisher unbekannte Probleme mit Strings
gehabt. Das erste war allerdings nicht Delphi sondern Lazarus.
Ich wollte einen String über die serielle Schnittstelle zu einem
Etikettendrucker schicken. Dazu muss eine Kommandozeile zusammengesetzt
werden, ungefähr so:
TEXT 100,100,1,1,90,0,"TestText"
Dieser Text steht in einer Textdatei die in ein Memo gelesen wird. Die
Datei besteht aus mehreren Zeilen.
Auf die einzelnen Zeilen im Memo greife ich mit:
s := memo1.lines[i]
zu.
Dann übergebe ich den string s an eine Procedure, die das ganze dann an
den Drucker sendet.
Soweit funktioniert das alles. Jetzt hat der Drucker aber keine Umlaute,
jedenfalls nicht da wo sie sein sollten.
Ich hab den String dann umcodiert:
For i := 1 to length(s) do
begin
if s[i] = 'ä' then s[i] := #123;
if s[i] = 'ö' then s[i] := #124;
if s[i] = 'ü' then s[i] := #125;
... // ungefähr so,
end;
Hat unter Delphi 7 funktioniert.
Unter Lazarus nicht. Da kommt vor jedem Umlaut ein Zeichen #195 und
danach 186 o.ä.
Also jeder Umlaut wird im String durch 2 Bytes bzw. 2 Chars repräsentiert.
Also irgendwas mit Ansistring. Unter Turbo-Pascal war das alles noch
viel schöner, da wusste man noch, wie ein String im Speicher abgelegt
wird...
Also die Umkodierung entsprechend angepasst und die Character einzeln
zum Drucker geschickt und es funktioniert.
{$H+} war eingestellt, {H-} hat nicht groß was geändert.
Jedenfalls konnte ich meine Umlaute drucken. Soweit ok, schien ein
Problem von Lazarus zu sein.
Heute hatte ein Kollege ein ähnliches Problem, diesmal mit Delphi XE.
Zu einem Gerät sollte eine ESC-Sequenz geschickt werden, also:
<esc> 'OFF' + #13 + #10
also: s := #27 + 'OFF' + #13 + #10
Dann mit writecom(s) den String an die Schnittstellenroutine übergeben.
=> Ergebnis: Scheiße... Es kommt #27 + 'O' + #0 + 'F' + #0
Das zweite 'F' und #13+#10 werden verschluckt, statt dessen stehen da #0
zwischen den einzelnen Bytes.
Wenn wir die Character einzeln senden, funktioniert es:
writecom(#27);
writecom('O');
writecom('F');
writecom('F');
writecom(#13);
writecom(#10);
Eine Programmversion, die vor 2 Wochen mit demselben Rechner compiliert
wurde zeigt das Verhalten nicht. Der Kollege sagt, er habe nichts
verändert, keine Compilerschalter gesetzt o.ä.
Die Komponente hab ich selbst vor 20 Jahren geschrieben, seitdem tausend
mal eingesetzt und keine Probleme. Jetzt so ein curioses Verhalten.
Was mich wundert ist, dass die vor 2 Wochen compilierte Version das tut,
was sie soll.
==> hat irgendjemand eine Erklärung?
ich hab jetzt kurz hintereinander bisher unbekannte Probleme mit Strings
gehabt. Das erste war allerdings nicht Delphi sondern Lazarus.
Ich wollte einen String über die serielle Schnittstelle zu einem
Etikettendrucker schicken. Dazu muss eine Kommandozeile zusammengesetzt
werden, ungefähr so:
TEXT 100,100,1,1,90,0,"TestText"
Dieser Text steht in einer Textdatei die in ein Memo gelesen wird. Die
Datei besteht aus mehreren Zeilen.
Auf die einzelnen Zeilen im Memo greife ich mit:
s := memo1.lines[i]
zu.
Dann übergebe ich den string s an eine Procedure, die das ganze dann an
den Drucker sendet.
Soweit funktioniert das alles. Jetzt hat der Drucker aber keine Umlaute,
jedenfalls nicht da wo sie sein sollten.
Ich hab den String dann umcodiert:
For i := 1 to length(s) do
begin
if s[i] = 'ä' then s[i] := #123;
if s[i] = 'ö' then s[i] := #124;
if s[i] = 'ü' then s[i] := #125;
... // ungefähr so,
end;
Hat unter Delphi 7 funktioniert.
Unter Lazarus nicht. Da kommt vor jedem Umlaut ein Zeichen #195 und
danach 186 o.ä.
Also jeder Umlaut wird im String durch 2 Bytes bzw. 2 Chars repräsentiert.
Also irgendwas mit Ansistring. Unter Turbo-Pascal war das alles noch
viel schöner, da wusste man noch, wie ein String im Speicher abgelegt
wird...
Also die Umkodierung entsprechend angepasst und die Character einzeln
zum Drucker geschickt und es funktioniert.
{$H+} war eingestellt, {H-} hat nicht groß was geändert.
Jedenfalls konnte ich meine Umlaute drucken. Soweit ok, schien ein
Problem von Lazarus zu sein.
Heute hatte ein Kollege ein ähnliches Problem, diesmal mit Delphi XE.
Zu einem Gerät sollte eine ESC-Sequenz geschickt werden, also:
<esc> 'OFF' + #13 + #10
also: s := #27 + 'OFF' + #13 + #10
Dann mit writecom(s) den String an die Schnittstellenroutine übergeben.
=> Ergebnis: Scheiße... Es kommt #27 + 'O' + #0 + 'F' + #0
Das zweite 'F' und #13+#10 werden verschluckt, statt dessen stehen da #0
zwischen den einzelnen Bytes.
Wenn wir die Character einzeln senden, funktioniert es:
writecom(#27);
writecom('O');
writecom('F');
writecom('F');
writecom(#13);
writecom(#10);
Eine Programmversion, die vor 2 Wochen mit demselben Rechner compiliert
wurde zeigt das Verhalten nicht. Der Kollege sagt, er habe nichts
verändert, keine Compilerschalter gesetzt o.ä.
Die Komponente hab ich selbst vor 20 Jahren geschrieben, seitdem tausend
mal eingesetzt und keine Probleme. Jetzt so ein curioses Verhalten.
Was mich wundert ist, dass die vor 2 Wochen compilierte Version das tut,
was sie soll.
==> hat irgendjemand eine Erklärung?