TextOut und LineEnding

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Mathias
Beiträge: 5011
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunc)
CPU-Target: 64Bit
Wohnort: Schweiz

TextOut und LineEnding

Beitrag von Mathias »

Ich habe diesen Code mit Windows und Linux kompiliert.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
begin
  Canvas.TextOut(10, 10, 'Hello' + LineEnding + 'World');
end


Windows und Linux habe eine ganze andere Ausgabe, siehe Anhang.
Ist dies ein Bug ?
Dateianhänge
Bildschirmfoto vom 2016-11-15 17-30-44.png
Bildschirmfoto vom 2016-11-15 17-30-44.png (9.92 KiB) 491 mal betrachtet
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

aro
Beiträge: 39
Registriert: Di 26. Jul 2011, 19:58

Re: TextOut und LineEnding

Beitrag von aro »

Hallo,

Windows und Linux haben andere Zeichen für den Zeilenumbruch. Das ist nicht ideal aber nicht zu ändern.

Wenn Du den Quelltext sowohl unter Linux als auch Windows verwenden möchtest, dann hilft nur eine bedingte Compilierung mit Compilerschaltern. In den Komponentenunits gibt es da genügend Beispiele.

MfG

Aro

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

Re: TextOut und LineEnding

Beitrag von Mathias »

Windows und Linux haben andere Zeichen für den Zeilenumbruch. Das ist nicht ideal aber nicht zu ändern.

Aus diesem Grund habe ich LineEnding verwendet.
Das komisch ist, das Linux das 'World' zwei mal schreibt.
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: TextOut und LineEnding

Beitrag von compmgmt »

Windows nutzt als LineEnding Chr 13 (Carriage Return = Wagenrücklauf) und 10 (Line Feed = Zeile hinzufügen). Linux nutzt nur Chr 10. Das mit Windows ist noch auf Schreibmaschinen zurückzuführen, da man da für einen Zeilenumbruch eben auch den Wagen zurückschieben musste und eine Zeile hinzufügen musste.

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

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

Re: TextOut und LineEnding

Beitrag von Mathias »

Windows nutzt als LineEnding Chr 13 (Carriage Return = Wagenrücklauf) und 10 (Line Feed = Zeile hinzufügen). Linux nutzt nur Chr 10.


Lass mal dies unter Windows laufen, da wird man sehen, das Windows mit TextOut gar kein Zeilenumbruch kennt, sondern dies als Zeichen ausgibt.
Im ersten Beispiel wurde ein Font verwendet, der das Zeichen 13 und 10 nicht kennt.
Aber Linux bricht die Zeile um, und schreibt dann doppelt.

Code: Alles auswählen

procedure TForm1.FormPaint(Sender: TObject);
var
  i: integer;
begin
  Canvas.Font.CharSet := OEM_CHARSET;
  Canvas.Font.Name:='Terminal';
  for i := 0 to 255 do begin
    Canvas.TextOut((i mod 16) * 20, (i div 16 * 20), char(i));
  end;
end
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot

Antworten