Chart für Druck

Rund um die LCL und andere Komponenten
Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Chart für Druck

Beitrag von Vbxler »

Hallo an Alle,

ich versuche gerade ein Programm zu schreiben, bei dem ich Messwerte aus einer Datenbank auslese,
sie in einem Stringgrid und in einem TAChart darzustellen und evtl. Ausgeben in eine PDF-Datei.
Datenbank und Stringgrind ist kein Problem und für das TAChart
gibt es jede menge Beispiele, das werde ich sicher hinbekommen.

Meine Frage:
Kann ich, wenn ich den Chart gezeichnet habe, diesen dann auch für einen
Ausdruck in eine PDF-Datei verwenden?

Wenn Nein, wie könnte ich das lösen, wenn ich einen Chart zeichne, den auch für
die Ausgabe zu verwenden.

Danke für jede Hilfe.
Vbxler
-------------------------

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

Re: Chart für Druck

Beitrag von wp_xyz »

Nein, PDF-Export ist bei TAChart nicht drin, soviel ich weiß. Im Prinzip könnte es mit Hilfe des fpvectorial-Packages, für das es einen TAChart-Drawer gibt, gehen, aber da hat noch keiner die Schreibroutinen für pdf geschrieben. Ich bin jetzt bei pdf-Erstellung nicht so drin, aber vielleicht kann man svg, wmf oder Bitmap-Dateien in pdf einfügen? Zu diesen Formaten gäbe es Beispiele in den Ordnern "fpvectorial", "save", "wmf" des Demo-Verzeichnisses von TAChart.
Zuletzt geändert von wp_xyz am Mo 31. Aug 2015, 22:52, insgesamt 1-mal geändert.

Komoluna
Beiträge: 565
Registriert: So 26. Aug 2012, 09:03
OS, Lazarus, FPC: Windows(10), Linux(Arch)
CPU-Target: 64Bit

Re: Chart für Druck

Beitrag von Komoluna »

Vbxler schrieb was von Druck für PDF. Es gibt Programme die sich als Drucker anmelden, aber die Daten einfach als PDF speichern. Ich glaube das war gemeint.

MFG

Komoluna
Programmer: A device to convert coffee into software.

Rekursion: siehe Rekursion.

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Chart für Druck

Beitrag von Vbxler »

Kann man den Chart als Grafik (png oder jpg) speichern?
Das wäre für mich eine gute Lösung, dann könnte ich die Grafik in ein PDF einbinden.

Ich möchte jedenfalls das PDF aus der Anwendung heraus erstellen.
Vbxler
-------------------------

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Chart für Druck

Beitrag von Michl »

Vbxler hat geschrieben:Kann man den Chart als Grafik (png oder jpg) speichern?
Das geht problemlos:

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
begin
  Image1.Picture.Bitmap.Width  := ClientWidth;
  Image1.Picture.Bitmap.Height := ClientHeight;
  Chart1.PaintOnCanvas(Image1.Picture.Bitmap.Canvas, ClientRect);
  Image1.Picture.SaveToFile('Chart.jpg');
end;   

TestProjekt anbei
Dateianhänge
TestTAChartToJPG.zip
(3.31 KiB) 89-mal heruntergeladen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Chart für Druck

Beitrag von Vbxler »

Danke für die Hilfe,

das werde ich gleich mal testen.
Vbxler
-------------------------

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Chart für Druck

Beitrag von Christian »

https://github.com/cutec-chris/promet-b ... cframe.pas

Zeile 940-964 erzeugt selbständig ein Pdf und bettet das Jpeg darin ein
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Vbxler
Beiträge: 125
Registriert: Sa 25. Mai 2013, 07:43
OS, Lazarus, FPC: Win7_x64 (FPC:4.7.1)
CPU-Target: 32Bit

Re: Chart für Druck

Beitrag von Vbxler »

Super,

danke für den Link!
Vbxler
-------------------------

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Guten Abend,

ich klinke mich mal hier ein, denn ich bin auch dabei mein Chart als Bild (jpg) zu speichern. Ich habe den Quelltext aus dem Beispiel hier sowie auch aus dem Beispielprojekt verwendet, aber das Chart wird nicht vollständig gespeichert.
Die Achsen an den Rändern sowie die Achsenbeschriftung fehlen.
Also:

Code: Alles auswählen

procedure TFrm_GUI.ToolBtnSpeichClick(Sender: TObject);
begin
  Frm_WZ.Image1.Picture.Bitmap.Width  := Frm_WZ.Chart1.ChartWidth;
  Frm_WZ.Image1.Picture.Bitmap.Height := Frm_WZ.Chart1.ChartHeight;
  Frm_WZ.Chart1.PaintOnCanvas(Frm_WZ.Image1.Picture.Bitmap.Canvas, ClientRect);
  Frm_WZ.Image1.Picture.SaveToFile(GetFileName('jpg'));
end;


oder auch

Code: Alles auswählen

procedure TFrm_GUI.ToolBtnSpeichClick(Sender: TObject);
begin
   Frm_WZ.Chart1.SaveToFile(TJPEGImage, GetFileName('jpg'));
end;


speichern kein vollständiges chart. Siehe Bilder.

Die Statusleiste sowie der Fenstertitel gehören natürlich nicht zum Chart sondern zur Form. Die brauchen nicht auf dem Bild zu erscheinen.

Danke
Dateianhänge
Bildschirmfoto 2019-03-20 um 21.34.22.png
Bild.jpg

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

Re: Chart für Druck

Beitrag von wp_xyz »

Du machst das Bitmap zu klein. Hattest du vor kurzem dich nicht nach dem Unterschied zwischen Chart.ChartWidth und Chart.ChartHeight auf der einen Seite und Chart.Width und Chart.Height auf der anderen Seite erkundigt? Hier siehst du es: .ChartWidth und .ChartHeight entsprechen dem von dem Achsen eingeschlossenen Rechteck, .Width und .Height entsprechen der gesamten Größe des Chart. Nimm für die Bitmap-Größe Chart.Width und .Height (also ohne des zweite "Chart" im Namen), oder das ClientRect des Fensters (wenn der Chart client-aligned ist), dann geht's.

Den zweiten Punkt mit dem direkten SaveToFile kann ich nicht nachvollziehen. Hier müsstest du ein Demo-Projekt hochladen.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Ich hatte auch schon Breite und Höhe der Form verwendet. Die Bildgröße scheint zu passen. Es wird außen herum schwarzer Rand (wo eigentlich Achse mit Titel sein sollte) dargestellt.
Ich probiere weiter.

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

So Sieht's aus, wenn ich Chart.Width bzw. Chart.Height verwende.

Es hat mit der Hintergrundfarbe der Diagrammfarbe zu tun. Ich hatte beides auf weiß gestellt.

Wenn ich clScrollbar nehme sieht's aus wie Bild4.jpg im Anhang. Jetzt ist rechts zu viel schwarz.

Nehme ich den Befehl Frm_WZ.Chart1.SaveToFile(TJPEGImage, GetFileName('jpg')); ist es so wie's sein soll (Bild5.jpg).

Man darf die Diagrammfarbe nicht auf clwhite stellen und sollte den Einzeiler mit SaveToFile verwenden.
Dateianhänge
So ist es richtig
So ist es richtig
Rechts zu viel schwarz
Rechts zu viel schwarz

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

Re: Chart für Druck

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:Es hat mit der Hintergrundfarbe der Diagrammfarbe zu tun. Ich hatte beides auf weiß gestellt.
[...]
Man darf die Diagrammfarbe nicht auf clwhite stellen und sollte den Einzeiler mit SaveToFile verwenden.

Nein, es liegt an dem schwarzen Loch, das gestern entdeckt wurde.

Im Ernst: es hat natürlich nichts mit den Farben zu tun, sondern man muss es nur richtig machen:

Code: Alles auswählen

  Image1.Picture.Bitmap.Width  := Chart1.Width;
  Image1.Picture.Bitmap.Height := Chart1.Height;
  Chart1.PaintOnCanvas(Image1.Picture.Bitmap.Canvas, Rect(0, 0, Chart1.Width, Chart1.Height));
  Image1.Picture.SaveToFile('test-img.jpg')

ErnstVolker
Beiträge: 326
Registriert: Di 17. Feb 2009, 10:44
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Chart für Druck

Beitrag von ErnstVolker »

Ich gebe Dir Recht. Nachdem ich JETZT wieder (das hatte ich heute Morgen noch nicht gemacht weil ich auf die Arbeit musste) auf clWhite zurückgestellt habe funktioniert das auch bei mir.
Ich halte mich zwar schon für doof aber ich hätte es nicht geschrieben, wenn es nicht so gewesen wäre. Nachdem ich im Objektinspector Color und BackColor auf ein grau geändert hatte
wurde das Diagramm ordentlich gespeichert. Also dachte ich dass die Farbe was damit zu tun hat. Hhm...

Allerdings habe ich jetzt zwei Zusatzprobleme:

1. Mit dem DistanceTool erzeugte Linien werden nicht mitgespeichert. Die von vorneherein vorhandenen TConstantLine-Linien schon. Die Vermaßungen würde ich gerne mit auf's Bild bringen.

2. Ich hatte hier ja das Beispiel bekommen wo eine PaintBox am unteren Rand des Diagrammes mitwanderte. Ich habe die Paintbox durch ein TextEdit ersetzt, weil das auf dem Chart zu sehen ist, die Paintbox nicht.
Wenn ich jetzt alles auf dem Bild haben möchte müsste ich vermutlich das komplette Fenster speichern. Also mit Frm.width und Frm.height.
Hierfür muß vermutlich die Zeile

Code: Alles auswählen

Chart1.PaintOnCanvas(Image1.Picture.Bitmap.Canvas, Rect(0, 0, Chart1.Width, Chart1.Height));
geändert werden. Aber Frm hat kein PaintOnCanvas.
Wie macht man das?

Danke
Dateianhänge
Das ist ein Screenshot. So sollte es aussehen wenn's fertig ist
Das ist ein Screenshot. So sollte es aussehen wenn's fertig ist

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

Re: Chart für Druck

Beitrag von wp_xyz »

ErnstVolker hat geschrieben:1. Mit dem DistanceTool erzeugte Linien werden nicht mitgespeichert. Die von vorneherein vorhandenen TConstantLine-Linien schon. Die Vermaßungen würde ich gerne mit auf's Bild bringen.

Stimmt, das muss ich mir bei Gelegenheit ansehen.

ErnstVolker hat geschrieben:2. Ich hatte hier ja das Beispiel bekommen wo eine PaintBox am unteren Rand des Diagrammes mitwanderte. Ich habe die Paintbox durch ein TextEdit ersetzt, weil das auf dem Chart zu sehen ist, die Paintbox nicht.
Wenn ich jetzt alles auf dem Bild haben möchte müsste ich vermutlich das komplette Fenster speichern. Also mit Frm.width und Frm.height.
Hierfür muß vermutlich die Zeile

Code: Alles auswählen

Chart1.PaintOnCanvas(Image1.Picture.Bitmap.Canvas, Rect(0, 0, Chart1.Width, Chart1.Height));
geändert werden. Aber Frm hat kein PaintOnCanvas.

Aber TForm hat ein PaintTo:

Code: Alles auswählen

    procedure PaintTo(ACanvas: TCanvas; X, Y: Integer); 

Antworten