Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   ChartView drucken (https://www.delphipraxis.net/172372-chartview-drucken.html)

blondervolker 29. Dez 2012 15:03

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;

MeierZwoo 29. Dez 2012 15:17

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).

Bummi 29. Dez 2012 15:57

AW: ChartView drucken
 
Das Bitmap dürfte vermutlich noch gut aussehen, aber beim Strechdraw solltest Du die Seitenverhältnisse des BItmaps beibehalten.

haentschman 29. Dez 2012 18:12

AW: ChartView drucken
 
Moin...

bist du im Besitz eines Reportgenerators ? FastReport etc. ? Damit wäre das eine Kleinigkeit und die bessere Lösung...

blondervolker 29. Dez 2012 19:43

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:

MeierZwoo 29. Dez 2012 22:12

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.

blondervolker 30. Dez 2012 09:27

AW: ChartView drucken
 
Hallo,

kannst du mir mal den Code verbessern,ich hab es noch nicht geschnallt.:oops:

MeierZwoo 30. Dez 2012 10:03

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

MeierZwoo 30. Dez 2012 10:52

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 00:30 Uhr.

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