TChart - Zeilenumbruch in Title, Footer und Legend

Rund um die LCL und andere Komponenten
Antworten
niotronic
Beiträge: 6
Registriert: Do 8. Dez 2016, 11:10
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Larnaka, Zypern
Kontaktdaten:

TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von niotronic »

Hallo,

Auf einer Linux X86 maschine generiert TAChart beim Ausdruck über die Draw bzw-. auch die PaintOnCanvas Prozedur nach jedem Leerzeichen einen für mich unerklärbaren Zeilumbruch im Title, im Footer bzw. auch in der Legende. Zeichne ich mit der PaintOnCanvas Prozedur auf dem Canvas eines Timage so stimmt alles - es wird nach einem Leerzeichen kein Zeilenumbruch eingefügt - das Bild ist identisch mit der TChartdarstellung - nicht so bei der Ausgabe auf dem Printer - hier ist die Darstellung auf Grund der Zeilenumbrüche mehrzeilig - teilweise werden in der Legende die darunterliegenden Zeilen überschrieben ? - Dies passiert bei unterschiedlichen Druckern, auch beim Ausdruck über CUPS-PDF Drucker. Ich habe das Lazarus - PrintDemo Projekt zur Demonstration adaptiert und hochgeladen, ebenso einen PDF Ausdruck...

mfG

Klaus :roll:
Dateianhänge
job_184-untitled_document.pdf
Ausdruck über die Draw Prozedur auf dem CUPS-PDF Drucker
(10.64 KiB) 63-mal heruntergeladen
printdemo2.zip
adaptiertes Lazarus PrintDemo
(7.92 MiB) 43-mal heruntergeladen

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

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von Mathias »

Ich habe mal ein minimal-Beispiel mit TChart gemacht. Im Objectinspector habe ich nichts geändert, alles Standard.

Dort tritt das Problem auch auf.
Komischerweise, ist aber die Ausgabe auf das Panel1 fehlerfrei.

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  Chart1.Title.Visible := True;
  Chart1.Title.Text.Text := '1 2 3 4 5 6';
  Chart1.Title.Brush.Color:=clWhite;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Text := '1 2 3 4 5 6';
 
  Printer.BeginDoc;
 
  Chart1.PaintOnCanvas(Printer.Canvas, Rect(0, 0, 500, 500));
  Printer.Canvas.TextOut(10, 10, sl.Text);
 
  Chart1.PaintOnCanvas(Panel1.Canvas, Rect(0, 0, 500, 500));
 
  Printer.EndDoc;
  sl.Free;
end;     

Test weise, habe ich noch einen Text aus eine TStringList ausgegeben, dieser kommt aber richtig.

Ich habe noch einen Versuch gemacht.

Code: Alles auswählen

var
  sl:TStringList;
begin
  sl:=TStringList.Create;
  sl.Delimiter := '.';
  sl.DelimitedText := '1 2 3 4 5 6';
  WriteLn(sl.Text);

Hier ist die Ausgabe auch:

Code: Alles auswählen

1
2
3
4
5
6

Obwohl DelimitedText '.' ist. :roll:

PS:Kompiliert mit Linux Mint 64Bit.
PS2: Habe den TChart noch mit WinXP getestet, dort kommt alles richtig.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von wp_xyz »

Sorry, dass das Drucken so viele Probleme bereitet, du bist da offenbar einer der ersten User, der das mal wirklich anwendet. Und in der Praxis findet man viel andere Fehler als bei der Entwicklung.

Ja, ich kann das bestätigen. Offenbar stimmen da die berechneten Textgrößen nicht mit dem wirklich vom Drucker benötigten Platz überein, und der Drucker macht einen Zeilenumbruch. Tatsächlich ist im TextStyle des für die Ausgabe zuständigen Canvas das Flag Wordwrap gesetzt - ich meine, das ist falsch, auch wenn einige Textausgaben mehrzeilig ausfallen dürfen - das muss ich noch testen.

Für's erste solltest du in Unit TADrawerCanvas die Routine TCanvasDrawer.SimpleTextOut suchen und dort in der lokalen Prozedur DrawSimpleText nach ts := ACanvas.TextStyle die Zeile ts.WordBreak := false einfügen - diese lokale Prozedur wäre dann insgesamt:

Code: Alles auswählen

  procedure DrawSimpleText(ACanvas: TCanvas; x, y: Integer; const txt: String);
  // add right-to-left mode. Cannot use TextOut since it does not respect TextStyle
  var
    r: TRect;
    ts: TTextStyle;
  begin
    ts := ACanvas.TextStyle;
    ts.RightToLeft := FRightToLeft;
    ts.WordBreak := false;              // <--------- neu
    ts.Clipping := false;
    r := Bounds(x, y, 1, 1);
    ACanvas.TextRect(r, x, y, txt, ts);
  end;

Falls du diese Stelle nicht findest, ist deine Lazarus-Version zu alt - ein Wink mit dem Zaunpfahl, auf 1.6.2 umzuschwenken.

Mit dieser Änderung bleiben die Zeilenumbrüche aus. Aber dann tritt das nächste Problem zutage, nämlich dass offenbar die Abstände nicht auf die größere Auflösung hochskaliert werden. Aber dafür brauche ich etwas mehr Zeit.

[EDIT]
Nein, falscher Alarm. Ich habe über "Print via Canvas" ausgedruckt, bei dem das Hochskalieren unterbleibt. Druckt man mit "Print", wird - zumindest in der Lazarus-Entwicklerversion - der skalierende PrinterDrawer verwendet, und der Ausdruck sieht aus wie die Darstellung auf dem Bildschirm (siehe dazu auch meine Anmerkung im anderen Thread).

niotronic
Beiträge: 6
Registriert: Do 8. Dez 2016, 11:10
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Larnaka, Zypern
Kontaktdaten:

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von niotronic »

Nach dem Ergänzen von ts.WordBreak := false; funzt jetzt bei mir alles wie erwartet.

Danke !

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

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von Mathias »

Ja, ich kann das bestätigen. Offenbar stimmen da die berechneten Textgrößen nicht mit dem wirklich vom Drucker benötigten Platz überein, und der Drucker macht einen Zeilenumbruch.

Irgendwie blicke ich da nicht durch, im Panel.Canvas kommt es richtig, aber im Printer.Canvas falsch. obwohl ich bei beiden ein Rechteck von 500x500 angegeben habe. Siehe mein minimal Code.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von wp_xyz »

Das 500x500 Rechteck definiert den Bereich, in dem der Plot gezeichnet wird. Das hat nicht mit dem Problem zu tun.

Ich stelle mir das so vor (muss nicht unbedingt stimmen...):
TAChart berechnet während des Ausgabe den Platz, den jedes Chart-Element benötigt, insbesondere gilt das für die Texte. Die so gefundenen Rechtecke umschließen den Text passgenau. Bei rechtsbündiger oder zentrierter Ausgabe werden die Rechtecke so verschoben, dass der gewünschte Effekt erreicht wird; der Text selbst wird immer linksbündig ausgegeben. Das wurde eingeführt, weil evtl. nicht alle Ausgabemedien rechtsbündigen und zentrierten Text darstellen können. Wenn aber wegen Unzulänglichkeiten im Druckertreiber der Text ein paar Pixel mehr benötigt, macht der Drucker einen Umbruch, weil dies durch die falsche WordBreak-Einstellung im Canvas erlaubt ist. Durch den oben genannten Patch wird dieser Umbruch unterbunden, und es wird praktisch über das einhüllende Rechteck hinausgedruckt. Das hat zur Folge, dass zentrierter oder rechtsbündiger Text nicht mehr exakt platziert sind (aber ich bezweifle, ob man das mit bloßem Auge erkennen kann).

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

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von Mathias »

Durch den oben genannten Patch wird dieser Umbruch unterbunden,
Wird dies in der Lazarus-Trunk auch angepasst ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

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

Re: TChart - Zeilenumbruch in Title, Footer und Legend

Beitrag von wp_xyz »

Ist jetzt im Trunk und auch für Laz 1.6.4 vorgemerkt.

Antworten