Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TCharts in der Druckvorschau (https://www.delphipraxis.net/166001-tcharts-der-druckvorschau.html)

delphinewbie 25. Jan 2012 14:05

TCharts in der Druckvorschau
 
Hallo,
ich habe bspw. in Form1 mehrere Charts, die ich in unterschiedlichen Layouts (1, 2, 3 oder 4 Charts auf einer Seite, dazu noch Hoch- oder Querformat) ausdrucken möchte. Dazu soll vorher eine Druckvorschau möglich sein.
Ich habe es bisher so gelöst, dass ich in einem neuen Form ein Shape platziert habe und darin im Prinzip alles entweder auf dem Shape oder auf dem Drucker (drucker.canvas) nochmal neu zeichne, sowohl den Text, als auch die Charts. Langsam wächst mir der Aufwand aber über den Kopf, die eigentlich fertigen Charts aus Form1 nochmal Strich für Strich in einer ansprechenden Form zu zeichnen.
Gibt es eine Möglichkeit, so ein Chart in das Shape gezielt (gemäß notwendiger Koordinaten) zu kopieren und anschließend auszudrucken ?
Ich habe auch schon versucht, im Shape ein TChart zu setzen und in dieses die Daten aus Form1 nochmal reinzuschreiben (series1.addxy(...).
Doch dann liegt das Chart immer hinter dem Shape.
Ich hoffe, es gibt da eine elegante Lösung und ich muss nicht tatsächlich nochmal alles selbst zeichnen.

Vielen Dank im Voraus

mkinzler 25. Jan 2012 14:08

AW: TCharts in der Druckvorschau
 
Verwendest du ein Reportsystem ( RAVE, QR, FR, ...)?

delphinewbie 25. Jan 2012 14:15

AW: TCharts in der Druckvorschau
 
Nein, die Daten werden alle aus einer Datei eingelesen und entsprechend eines Berechnungsalgorithmus verarbeitet und die Ergebnisse in Charts dargestellt. Ich weis nicht, ob sich dafür ein Reportsystem anbieten würde ?

MfG

Darlo 25. Jan 2012 14:30

AW: TCharts in der Druckvorschau
 
Hi,

ich benutze TChart und Quickreport zusammen. Im Ordner vom TChart ist eine QRChart-Komponente. Funktioniert super.
Mehrere Seiten kann man mit einen Compositereport zusammenfassen.

delphinewbie 25. Jan 2012 17:08

AW: TCharts in der Druckvorschau
 
@Darlo,
Danke, werde ich mal probieren. Habe aber meine Bedenken, ob ich da meine verschiedenen Layouts gestalten kann und vor allem, ob man so ein TChart auch um 90 bzw. 270° drehen kann, wenn man eine Ausgabe im Querformat benötigt. Aber Versuch macht klug...

MfG

Darlo 26. Jan 2012 11:11

AW: TCharts in der Druckvorschau
 
Quickreport unterstützt Hoch- und Querformat. Alternative kannst Du ja die TCharts als Bild exportieren, drehen und einfügen.

delphinewbie 26. Jan 2012 11:18

AW: TCharts in der Druckvorschau
 
Hi,
ich bin schon fleißig am Experimentieren. Aber schon sind erste Fehler da:
Ich bekomme beim Erstellen der Series im QRChart mit z.B:
Code:
for z:=1 to 50 do begin
   qrchart1.Chart.Series[1].addxy(z,z*z,'',clBlack);
  end;
eine Fehlermeldung: 'Listenindex überschreitet das Maximum (1)'.
Keine Ahnung, was da gemeint ist. Bezieht sich das auf die series ?
Muß ich da noch was voreinstellen ?

MfG

Zusätzlich habe ich auch das OnNeedData-Ereignis wie folgt gesetzt:
Code:
procedure TForm13.QuickRep1NeedData(Sender: TObject;
var MoreData: Boolean);
begin
MoreData:=(z < 50);
inc(z);
end;
MfG

Darlo 26. Jan 2012 11:24

AW: TCharts in der Druckvorschau
 
Vielleicht Series[0] statt Series[1]?
Code:
qrchart1.Chart.Series[0].addxy(z,z*z,'',clBlack);

delphinewbie 26. Jan 2012 11:27

AW: TCharts in der Druckvorschau
 
Nee,
mit series[0] macht er den Report garnicht mehr auf...

Nun sehe ich, dass im OI die Eigenschaft QRChart1.Chart auf (TQRDBChart) gesetzt ist.
Könnte es daran liegen, dass irgendwie immer Werte aus einer Datenbank erwartet werden ?
Wie kann ich das änder?

delphinewbie 26. Jan 2012 14:04

AW: TCharts in der Druckvorschau
 
Erstmal gelöst:
Habe das OnNeedData-Ereignis wieder rausgenommen und das Füllen des Charts in das Ereignis QuickRep1.BeforePrint
gesetzt:
Code:
procedure TForm13.QuickRep1BeforePrint(Sender: TCustomQuickRep;
  var PrintReport: Boolean);
var
i: integer;
begin
for i:=1 to anz_mw do
qrchart1.Chart.Series[1].AddXY(i,messwerte[messkanal-1,i],'',clBlack);
end;
Vllt. geht es auch noch eleganter. Aber ich bin erstmal zufrieden...

Danke an alle

delphinewbie 1. Feb 2012 13:23

AW: TCharts in der Druckvorschau
 
Hi,
ein neuer Anlauf: Habe inzwischen den Gedanken mit Quickreport wieder verworfen und mich mal an das riesige Paket TeeChart von Steema gewagt.
Habe mir dazu die Trial-Version (TeeChartPro 2011 VCL)runtergeladen und ich muss schon sagen, da ergeben sich 'ne Menge Möglichkeiten, um ansprechende Charts zu produzieren.
Aber speziell zu meinem Problem habe ich noch keine Lösung ansatzweise gefunden.
Es soll in einer Art Preview angezeigt werden, wie der Druck aussehen wird. Dazu habe ich mir bspw. in Form1 ein TeePreviewPanel1 (Orientation ist ppoPortrait) und auf die weiße 'Papierfläche' eine TChart-Komponente eingefügt . Hier beginnt das eigentliche Problem. Ich möchte nun das komplette TChart um 90 Grad drehen (incl. Title, Legende, etc.) um bei einem Ausdruck im Hochformat das Diagramm auf dem Blatt quer zu legen. Das ganze hätte den großen Vorteil, das ich dann nur das Chart drehen müßte und nicht alle möglichen Texte in Kopf- oder Fußzeilen.
Ich finde einfach keine Möglichkeit, dies über irgenwelche Chart-Eigenschaften oder Methoden zu realisieren.
Eine andere und sicher aufwendigere Lösung wäre wohl die von Darlo vorgeschlagene
Zitat:

Alternative kannst Du ja die TCharts als Bild exportieren, drehen und einfügen.
Wobei ich noch keine Peilung habe, wie ich ein Chart als Bild exportiere, geschweige denn wie ich es noch drehe und wieder einfüge.

Hoffentlich habt ihr einpaar gute Ideen, die mir das Leben nicht allzu schwer machen werden.

Vielen Dank
delphinewbie

Darlo 1. Feb 2012 15:18

AW: TCharts in der Druckvorschau
 
Tach,

Zitat:

Zitat von delphinewbie (Beitrag 1148697)
Wobei ich noch keine Peilung habe, wie ich ein Chart als Bild exportiere, geschweige denn wie ich es noch drehe und wieder einfüge.

das ist das kleinste Problem:
Code:
chart1.SaveToBitmapFile([filename]);
Gruß

delphinewbie 16. Feb 2012 14:24

AW: TCharts in der Druckvorschau
 
Der Beitrag kann gelöscht werden...

delphinewbie 21. Feb 2012 12:00

AW: TCharts in der Druckvorschau
 
So, nun bin ich tatsächlich so weit gekommen, dass ich also ein Chart als Bild in die Zwischenablage lege, es anschließend in ein Image schiebe und anschließend drehe. Das ganze in einem Quickreport (Form16) mit QRImage.

Code:
FJpeg : TJPEGImage;
clip: TClipboard;

form1.Chart1.CopyToClipboardBitmap;
clip:=Clipboard;
form16.QRImage1.Picture.bitmap.LoadFromClipboardFormat(CF_Bitmap,clip.GetAsHandle(CF_Bitmap),0);
FJpeg:=TJPEGImage.Create;
FJpeg.Assign(form16.QRImage1.Picture.bitmap);
FJpeg.Transform(TJpegTransform(jt_ROT_270));
form16.QRImage1.Picture.Assign(FJpeg);
FJpeg.Free;
clip.Clear;
Das Problem liegt jetzt aber in der Bildqualität. Offensichtlich treten bei meinem Vorgehen Qualitätsverluste auf, sodass der Ausdruck nicht sonderlich gut aussieht. Insbesondere wird das bei den Achsenbeschriftungen des Charts deutlich, wo hier plötzlich grüne Schatten auftreten.
Liegt das in der Natur des Verfahrens (FJpeg.Transform) begründet oder gibt es etwa noch einen Parameter, den man setzen muss ?
Hat noch jemand dieses Phänomen bemerkt ? Der Effekt tritt übrigens auch auf, wenn das Image nicht gedreht wird, also ohne 'FJpeg.Transform(TJpegTransform(jt_ROT_270));'
Lege ich dagegen ein QRChart auf den QuickReport, das dann mit Werten gefüllt wird, ergibt das einen sauberen Ausdruck.
Wo treten die Verluste ein ? Hat jemand eine Idee ?

Danke,
delphinewbie

Bummi 21. Feb 2012 12:12

AW: TCharts in der Druckvorschau
 
bessere(einstellbare) Ergebnisse bekommst Du mit z.B.
Delphi-Quellcode:
  Chart1.TeeCreateMetafile(true,Rect(0,0,1000,1000)); //WMF
//oder
  Chart1.Draw(DestCanvas,Rect(0,0,1000,1000));

delphinewbie 21. Feb 2012 12:15

AW: TCharts in der Druckvorschau
 
Vielen Dank,
das werde ich gleich mal ausprobieren.

delphinewbie 21. Feb 2012 12:54

AW: TCharts in der Druckvorschau
 
Ich habe es jetzt mal so gemacht :
Code:
form1.Chart1.Draw(form16.QRImage1.Canvas,Rect(0,0,form1.Chart1.Width,form1.Chart1.Height));
FJpeg:=TJPEGImage.Create;
FJpeg.Assign(form16.QRImage1.Picture.bitmap);
FJpeg.Transform(TJpegTransform(jt_ROT_180));
form16.QRImage1.Picture.Assign(FJpeg);
FJpeg.Free;
Hatte aber leider keinen Erfolg damit. Sieht genau noch so bescheiden aus wie vorher...

Bummi 21. Feb 2012 13:08

AW: TCharts in der Druckvorschau
 
wahrscheinlich pixelig?
nimm doch mal größere Breiten/Höhen

delphinewbie 21. Feb 2012 14:14

AW: TCharts in der Druckvorschau
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe für das QRImage und auch fürs Chart schon größtmögliche Maße genommen, so dass es gerade auf eine A4-Seite passt.
Leider kein Erfolg.
Zur Veranschaulichung habe ich den Quickreport in eine PDF-Datei (Siehe Angehängte Datei) gedruckt, damit ihr euch mal ein Bild von meinem Problem machen könnt. So wie es in der Datei aussieht, so wird es auch auf andere Drucker und auch im Preview dargestellt. Also ziemlich unbrauchbar.

Hilfe-Hilfe-Hilfe

Bummi 21. Feb 2012 14:20

AW: TCharts in der Druckvorschau
 
meinst Du die JPG-Artefakte?

delphinewbie 21. Feb 2012 14:24

AW: TCharts in der Druckvorschau
 
Keine Ahnung, wie das heißt, aber schön sieht es nicht aus, oder ?

Klaus01 21. Feb 2012 14:27

AW: TCharts in der Druckvorschau
 
.. musst Du zwingend ein jpg nehmen um darauf zu zeichnen.

Die Artefakte könnten durch die jpg Kompression entstanden sein.

Bei der eher monochromatischen Zeichnung sollten die Resultate mit einem bitmap (bmp)
besser aussehen.

Grüße
Klaus

delphinewbie 21. Feb 2012 15:34

AW: TCharts in der Druckvorschau
 
Die Grafik soll nicht monochrom bleiben, das war nur ein erster Versuch. Eigentlich sollen mehrere Series in unterschiedlichen Farben und Diagrammhintergrund dargestellt werden. Dazu kommt die Legende etc.
Kann man die Kompression irgendwie runter setzen, um die Artefakte zu vermeiden ?

Bummi 21. Feb 2012 15:43

AW: TCharts in der Druckvorschau
 
kann man, aber nimm doch lieber gleich ein Bitmap ...

Darlo 21. Feb 2012 16:19

AW: TCharts in der Druckvorschau
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei nur mal ein Beispiel mit TChart und Quickreport.

Gruß

delphinewbie 21. Feb 2012 17:28

AW: TCharts in der Druckvorschau
 
@Bummi,an welcher Stelle sollte ich also ein Bitmap nehmen ? Ich befürchte nur, dass sich ein Bitmap nicht so einfach drehen lässt mit der Transform-Methode.
Könnte es trotzdem so klappen ? Bin im Moment nicht auf Arbeit und kann nicht testen.
Code:
FJpeg: TBitmap;

form1.Chart1.CopyToClipboardBitmap;
clip:=Clipboard;
form16.QRImage1.Picture.bitmap.LoadFromClipboardFormat(CF_Bitmap,clip.GetAsHandle(CF_Bitmap),0);
FJpeg:=TBitmap.Create;
FJpeg.Assign(form16.QRImage1.Picture.bitmap);
FJpeg.Transform(TJpegTransform(jt_ROT_270));
form16.QRImage1.Picture.Assign(FJpeg);
FJpeg.Free;
clip.Clear;
@Darlo, Danke für dein Beispiel. Nur muss ich mich entscheiden, entweder die Charts zu drehen, um das Blatt mit den Kopfzeilen, Fusszeilen,etc. im Hochformat drucken zu können oder eben den Text in den Kopfzeilen, Fusszeilen etc. drehen, damit ich das Blatt im Querformat habe und die Charts nicht drehen muss. Ich hoffe, du verstehst, wie ich das meine. Meine test.pdf im Anhang von #19 zeigt ja, dass ich u.a auch einen Rahmen benötige, verschiedene Textzeilen. Und da empfinde ich es als leichter zu realisieren, wenn man dann nur die Charts dreht. Solange alles auf einem Blatt gleich ausgerichtet ist, gibt es keine Probleme, nur wenn bspw. der Text ungedreht, die Grafik aber um 270 Grad gedreht werden muss.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz