TextOut und LineEnding

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.

TextOut und LineEnding

Beitragvon Mathias » 15. Nov 2016, 17:35 TextOut und LineEnding

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) 148-mal betrachtet
Mit Lazarus sehe ich gün
Mit Java und C/C++ sehe ich rot
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon aro » 15. Nov 2016, 18:06 Re: TextOut und LineEnding

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
aro
 
Beiträge: 39
Registriert: 26. Jul 2011, 18:58

Beitragvon Mathias » 15. Nov 2016, 18:22 Re: TextOut und LineEnding

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
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

Beitragvon compmgmt » 15. Nov 2016, 18:28 Re: TextOut und LineEnding

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 ;)
compmgmt
 
Beiträge: 351
Registriert: 25. Nov 2015, 17:06
Wohnort: in der Nähe von Stuttgart
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4 | 
CPU-Target: i386 + x86_64
Nach oben

Beitragvon Mathias » 15. Nov 2016, 18:37 Re: TextOut und LineEnding

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
Mathias
 
Beiträge: 4351
Registriert: 2. Jan 2014, 17:21
Wohnort: Schweiz
OS, Lazarus, FPC: Linux (die neusten Trunc) | 
CPU-Target: 64Bit
Nach oben

• Themenende •

Zurück zu Lazarus - Bugs



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

porpoises-institution
accuracy-worried