![]() |
ChartView drucken
Liste der Anhänge anzeigen (Anzahl: 1)
Nachträglich noch alles Gute :-D und einen Guten Rutsch ins "Neue"...:-D
Ich versuche seit Stunden ein Chart von TMS vernünftig auszudrucken. In der Hilfe findet man keine vernünftigen Beispiele. Bei mir wird das Chart immer als "EI" dargestellt.:cyclops: Hab kein Plan...:oops: Siehe Bild als Anhang.
Delphi-Quellcode:
procedure TForm18.Button1Click(Sender: TObject);
var bmp: TBitmap; begin bmp := TBitmap.Create; bmp.Width := DBAdvGDIPChartView1.Width; bmp.Height := DBAdvGDIPChartView1.Height; DBAdvGDIPChartView1.PrintAllPanes(bmp.Canvas, Bounds(0,0, bmp.Width, bmp.Height)); Printer.BeginDoc; Printer.Canvas.StretchDraw(Bounds(2000,2000,2000,2000), bmp); Printer.EndDoc; bmp.Free; end; |
AW: ChartView drucken
Du solltest entweder nur die Höhe oder nur die Breite für die BMP vorgeben - dann wird der andere Wert angepaßt. Beide Werte vorgeben verzerrt die BMP (es sei denn, Du triffst genau die richtigen Werte, was aber nur geht, wenn die Auflösungen bekannt und gleich sind).
|
AW: ChartView drucken
Das Bitmap dürfte vermutlich noch gut aussehen, aber beim Strechdraw solltest Du die Seitenverhältnisse des BItmaps beibehalten.
|
AW: ChartView drucken
Moin...
bist du im Besitz eines Reportgenerators ? FastReport etc. ? Damit wäre das eine Kleinigkeit und die bessere Lösung... |
AW: ChartView drucken
Hallo,
mit den Seitenverhältnissen,habe ich noch nicht geschnallt bzw.noch nicht gemacht... Fastreports habe ich und es funktioniert!!! Nur kann ich mit Fastreports nicht direkt in meinem Programm eine direkte Vorschau generieren.Oder liege ich da falsch?:oops: |
AW: ChartView drucken
Erstmal sorry für meinen Erguß oben - ist zwar prinzipiell richtig, nur völlig daneben ausgedrückt (Kommt davon, wenn man seit Jahren eigene Prc benutzt, die einem dann das Denken abnehmen).
Dein Fehler ist, dass du für die Ausgabe mit StretchDraw einfach völlig willkürlich gewählte Werte benutzt, ohne Rücksicht auf die BMP-Quelle. Deine gewählten Werte bounds(..,2000,2000) quetschen die BMP in ein Quadrat [Breite=Höhe=2000], was an deinem Ausdruck ja auch sehr schön zu sehen ist Die Breiten- und Höhenwerte müssen dieselben Proportionen wie deine BMP haben, deshalb einen Wert vorgeben, den anderen aus den Proportionen der BMP danach berechnen (Dreisatz). bounds(.., AWidth, AHeight) müssen dasselbe Verhältnis wie dein bmp.Width und bmp.Height haben. Wenn das Ausgabegerät auch noch verschiedene Werte für den x/y AspektRatio hat, müssen die auch berücksichtigt werden - wobei die meisten Drucker einen AspektRatio von 1:1 haben und dieser damit unberücksichtigt sein kann. |
AW: ChartView drucken
Hallo,
kannst du mir mal den Code verbessern,ich hab es noch nicht geschnallt.:oops: |
AW: ChartView drucken
Liste der Anhänge anzeigen (Anzahl: 1)
Ich weiß, daß Pozentrechnung, Verhältnisrechnung und Dreisatz (alles dasselbe) das schwierigste im Leben ist - aber auch das einzige aus der Schul-Mathe, was man im Leben wirklich braucht :stupid:
Um eine Grafik (hier BMP) mit canvas proportional auf einem Endgerät (Bildschirm, Drucker ...) auszugeben, müssen die Zielabmessungen BxH auch dieselben Proportionen wie die der Quelle (deine BMP) haben. Du hast als Quell-Abmessungen bmp.Width und bmp.Height. Die Zielabmessungen sind ...StretchDraw(Bounds(Einfx,Einfy,Zielbreite,Zielhöhe)... Die Bedingung für proportionale Ausgabe ist: bmp.Width / bmp.Height = Zielbreite / Zielhöhe in den jeweiligen Einheiten (s.a. Angehängte Abb.). 1) Normalerweise gibt man eine Ziel-Abmessung vor, z.B. die Breite. Dann muss die Höhe aus den Proportionen errechnet werden: Aus bmp.Width / bmp.Height = Zielbreite / Zielhöhe folgt Zielhöhe = Zielbreite * bmp.Height / bmp.Width also Printer.Canvas.StretchDraw(Bounds(Einfx,Einfy,Ziel höhe,Zielbreite * bmp.Height div bmp.Width), bmp); oder Printer.Canvas.StretchDraw(Bounds(2000,2000,2000,2 000 * bmp.Height div bmp.Width), bmp); (Bei Höhe als Vorgabe umgekehrt). 2) ... kann man auch einen Vergrößerungs/Verkleinerungsfaktor vorgeben, dann ist Zielbreite = bmp.Width * Faktor Zielhöhe = bmp.Height * Faktor 3) ... oder 1:1 Ausgabe Zielbreite = bmp.Width Zielhöhe = bmp.Height Nur: beide Werte des Zieles willkürlich vorgeben stretcht das Bild eben in diese Vorgaben und es wird verzerrt/gestretcht. Deshalb heißt die Procedure auch StretchDraw, weil sie das Bild eben gnadenlos an die Vorgabewerte anpaßt (s.a. Angehängte Abb.). Anm: Bezeichnungen wie "Zielhöhe" etc. müssen logo in Syntaxgerechte Bezeichner umgesetzt werden |
AW: ChartView drucken
Noch zwei Anmerkungen:
1) Die Berechnung mit Ganzzahlen führt automatisch zu Ungenauigkeiten. Ich persönlich arbeite deshalb für alle Abmessungen und x/y-Werte mit Gleitkommatypen, die dann gerundet eingefügt werden. Das ergibt dann maximal 1 Drucker-Pixel Ungenauigkeit in jeder Achse. Ausnahme: Punkt 2), ganzzahliger Faktor, aber nur bei Vergrößerung oder Punkt 3), 1:1. 2) Im obigen Beispiel ist ein AspektRatio <> 1:1 des Druckers (Endausgabegerätes) nicht berücksichtigt. Da die meisten Blattdrucker ein Ratio 1:1 haben, ist es auch evtl. unwesentlich, solange der eigene, bekannte Drucker verwendet wird. Aber bei unbekannten (fremden) Druckern sollte man den Ratio doch mit einbauen. Den Ratio erhält man aus LOGPIXELSX und LOGPIXELSY bzw. ASPECTX und ASPECTY aus den DeviceCaps des Printers (Die Werte, die man ja auch für die Berechnung x/y-Werte in Maßeinheiten (mm, cm, inch) benötigt). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 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